bool erase_one(data_buffer& buffer, index123_type& index123)
{
  size_t buffer_size = std::distance(buffer.begin(), buffer.end());
  data_pointer ptr = buffer.begin() + (buffer_size > 0 ? rand()%buffer_size : 0);
  offset_t offset = ptr.get_offset();
  
  auto lower = index123.lower_bound(offset);
  auto upper = index123.upper_bound(offset);
  if (std::distance(lower,upper)!=1 )
  {
    std::cout << ptr->data1 << "," << ptr->data2 << ", " << ptr->data3 << std::endl;
    std::cout << "std::distance(lower,upper): "  << std::distance(lower,upper) << std::endl;
    return false;
  }
  
  index123.erase( offset );
  buffer.deallocate(ptr, 1);
  size_t buffer_size2 = std::distance(buffer.begin(), buffer.end());
  if ( (buffer_size - buffer_size2) != 1)
  {
    std::cout  << "Buffer size check failed - " << (buffer_size-1) << "!=" << buffer_size2 << std::endl;
    return false;
  }
  
  return true;
}
bool erase_begin(data_buffer& buffer, index123_type& index123)
{
  data_pointer ptr = buffer.begin();
  auto itr = index123.find( ptr.get_offset() /*static_cast<offset_t>( static_cast<size_t>(ptr) )*/);
  index123.erase(itr);
  buffer.deallocate(ptr, 1);
  return true;
}
bool create(data_buffer& buffer, index123_type& index123)
{
  data_pointer ptr = buffer.allocate(1);
  *ptr = generate();
  auto itr = index123.find( ptr.get_offset() );
  if (itr == index123.end())
  {
    index123.insert( ptr.get_offset() );
  }
  else
  {
    buffer.deallocate(ptr, 1);
  }

  return itr == index123.end();
}