void LearnEngine::LearnList::add_sample(const PHV &phv)
{
  static thread_local ByteContainer sample;
  sample.clear();
  builder(phv, &sample);

  std::unique_lock<std::mutex> lock(mutex);

  const auto it = filter.find(sample);
  if(it != filter.end()) return;

  buffer.insert(buffer.end(), sample.begin(), sample.end());
  num_samples++;
  auto filter_it = filter.insert(filter.end(), std::move(sample));
  FilterPtrs &filter_ptrs = old_buffers[buffer_id];
  filter_ptrs.unacked_count++;
  filter_ptrs.buffer.push_back(filter_it);

  if(num_samples == 1 && max_samples > 1) {
    buffer_started = clock::now(); 
    b_can_send.notify_one(); // wake transmit thread to update cond var wait time
  }
  else if(num_samples >= max_samples) {
    while(buffer_tmp.size() != 0) {
      b_can_swap.wait(lock);
    }
    swap_buffers();

    b_can_send.notify_one();
  }
}