27#ifndef TEMPTABLE_STORAGE_H 
   28#define TEMPTABLE_STORAGE_H 
  191  static constexpr size_t ALIGN_TO = 
alignof(
void *);
 
  350    : m_storage(const_cast<
Storage *>(storage)),
 
  351      m_element(const_cast<
Element *>(element)) {}
 
  358  assert(m_storage != 
nullptr || element == 
nullptr);
 
  359  m_element = 
const_cast<Element *
>(element);
 
  368  return !(*
this == rhs);
 
  372  assert(m_storage != 
nullptr);
 
  373  assert(*
this != m_storage->end());
 
  376    if (m_storage->element_last_on_page(m_element)) {
 
  377      Page *next_page = *m_storage->element_next_page_ptr(m_element);
 
  378      if (next_page == 
nullptr) {
 
  380        *
this = m_storage->end();
 
  383      m_element = m_storage->first_possible_element_on_page(next_page);
 
  385      m_element = m_storage->next_element(m_element);
 
  387  } 
while (m_storage->element_deleted(m_element));
 
  393  assert(m_storage != 
nullptr);
 
  394  assert(*
this != m_storage->begin());
 
  400    if (m_element == 
nullptr) {
 
  401      m_element = m_storage->back();
 
  402    } 
else if (m_storage->element_first_on_page(m_element)) {
 
  404      Page *prev_page = *m_storage->element_prev_page_ptr(m_element);
 
  405      assert(prev_page != 
nullptr);
 
  406      m_element = m_storage->last_possible_element_on_page(prev_page);
 
  407      assert(m_storage->element_last_on_page(m_element));
 
  409      m_element = m_storage->prev_element(m_element);
 
  411  } 
while (m_storage->element_deleted(m_element));
 
  428  *
this = std::move(other);
 
  437  rhs.m_allocator = 
nullptr;
 
  440  rhs.m_element_size = 0;
 
  443  rhs.m_bytes_used_per_element = 0;
 
  446  rhs.m_number_of_elements_per_page = 0;
 
  449  rhs.m_number_of_elements = 0;
 
  452  rhs.m_first_page = 
nullptr;
 
  455  rhs.m_last_page = 
nullptr;
 
  458  rhs.m_last_element = 
nullptr;
 
  593      m_allocator->deallocate(
static_cast<uint8_t *
>(page_to_free),
 
  603  Iterator next_element_position = position;
 
  604  ++next_element_position;
 
  615  return next_element_position;
 
  698  return reinterpret_cast<Page **
>(
static_cast<uint8_t *
>(element) -
 
  704  return reinterpret_cast<Page **
>(
static_cast<uint8_t *
>(element) +
 
  709  assert(element != 
nullptr);
 
  715  assert(element != 
nullptr);
 
  722  assert(
page != 
nullptr);
 
  723  return static_cast<uint8_t *
>(
page) + 
sizeof(
Page *);
 
  728  assert(
page != 
nullptr);
 
  729  return static_cast<uint8_t *
>(
page) + 
sizeof(
Page *) +
 
  734  assert(
page != 
nullptr);
 
  735  return reinterpret_cast<Page **
>(
page);
 
  739  assert(
page != 
nullptr);
 
  742  return reinterpret_cast<Page **
>(
 
  743      static_cast<uint8_t *
>(
page) + 
sizeof(
Page *) +
 
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:247
 
Custom memory allocator.
Definition: allocator.h:439
 
Iterator over a Storage object.
Definition: storage.h:51
 
bool operator!=(const Iterator &rhs) const
Compare with another iterator.
Definition: storage.h:367
 
Element * m_element
Current element.
Definition: storage.h:112
 
Iterator(const Iterator &)=default
Copy-construct from another iterator.
 
Iterator & operator++()
Advance the iterator one element forward.
Definition: storage.h:371
 
Iterator()
Default constructor.
Definition: storage.h:346
 
Iterator & operator=(const Iterator &)=default
Copy-assign from another iterator.
 
Element * operator*() const
Dereference the iterator to the element it points to.
Definition: storage.h:353
 
bool operator==(const Iterator &rhs) const
Compare with another iterator.
Definition: storage.h:363
 
Storage * m_storage
Storage over which the iterator operates.
Definition: storage.h:109
 
Iterator & operator--()
Recede the iterator one element backwards.
Definition: storage.h:392
 
Iterator & operator=(const Element *element)
Assign a new position within the same Storage object.
Definition: storage.h:357
 
Storage container.
Definition: storage.h:43
 
Element * back()
Get the last element.
Definition: storage.h:511
 
Allocator< uint8_t > * m_allocator
Allocator to use for allocating new pages.
Definition: storage.h:318
 
void Page
Type used for pages.
Definition: storage.h:48
 
size_t element_size() const
Get the element size.
Definition: storage.h:507
 
size_t page_size() const
Calculate the size of a page.
Definition: storage.h:647
 
Storage(const Storage &)=delete
Copy constructing is disabled, too expensive and not necessary.
 
Page ** element_prev_page_ptr(Element *first) const
Get the previous page.
Definition: storage.h:696
 
static constexpr uint8_t ELEMENT_LAST_ON_PAGE
Flag that denotes an element is the last element on a page.
Definition: storage.h:197
 
Element * m_last_element
Last used element in the last page of the storage.
Definition: storage.h:341
 
Element * last_possible_element_on_page(Page *page) const
Get the last possible element of a page (not the last occupied).
Definition: storage.h:726
 
Iterator end() const
Get an iterator, positioned after the last element.
Definition: storage.h:485
 
size_t size() const
Get the number of elements in the storage.
Definition: storage.h:509
 
size_t m_number_of_elements_per_page
Maximum number of elements a page can store.
Definition: storage.h:328
 
Page * m_last_page
Last page of the storage.
Definition: storage.h:337
 
bool element_last_on_page(Element *element) const
Check if element is the last on its page.
Definition: storage.h:672
 
Iterator begin() const
Get an iterator, positioned on the first element.
Definition: storage.h:465
 
size_t number_of_elements_per_page() const
A simple getter.
Definition: storage.h:643
 
Page ** page_next_page_ptr(Page *page) const
Get a pointer inside a page to the place denoting the next page.
Definition: storage.h:738
 
Element * next_element(Element *element) const
Get the next element of a given element on the same page.
Definition: storage.h:714
 
Page * m_first_page
First page of the storage.
Definition: storage.h:334
 
Element * allocate_back()
Allocate space for one more element at the end and return a pointer to it.
Definition: storage.h:513
 
static constexpr size_t ALIGN_TO
Align elements to this number of bytes.
Definition: storage.h:191
 
size_t m_bytes_used_per_element
Number of bytes used per element.
Definition: storage.h:325
 
void clear()
Delete all elements in the storage.
Definition: storage.h:618
 
static constexpr uint8_t ELEMENT_DELETED
Flag that denotes an element is deleted.
Definition: storage.h:201
 
Element * first_possible_element_on_page(Page *page) const
Get the first element of a page.
Definition: storage.h:720
 
Storage(Allocator< uint8_t > *allocator)
Constructor.
Definition: storage.h:416
 
static constexpr size_t META_BYTES_PER_ELEMENT
Extra bytes per element for element metadata.
Definition: storage.h:205
 
Page ** page_prev_page_ptr(Page *page) const
Get a pointer inside a page to the place denoting the previous page.
Definition: storage.h:733
 
bool element_first_on_page(Element *element) const
Check if element is the first on its page.
Definition: storage.h:659
 
size_t m_element_size
Element size in bytes.
Definition: storage.h:321
 
Storage & operator=(const Storage &)=delete
Copy assignment is disabled, too expensive and not necessary.
 
static constexpr size_t META_BYTES_PER_PAGE
Extra bytes per page for page metadata.
Definition: storage.h:209
 
~Storage()
Destructor.
Definition: storage.h:463
 
Iterator erase(const Iterator &position)
Delete the element pointed to by position.
Definition: storage.h:602
 
static constexpr uint8_t ELEMENT_FIRST_ON_PAGE
Flag that denotes an element is the first element on a page.
Definition: storage.h:194
 
bool element_deleted(Element *element) const
Check if element is deleted.
Definition: storage.h:684
 
void Element
Type used for elements.
Definition: storage.h:46
 
uint8_t * element_meta(Element *element) const
Get a pointer to element's meta byte(s).
Definition: storage.h:655
 
Page ** element_next_page_ptr(Element *last) const
Get the next page.
Definition: storage.h:702
 
void deallocate_back()
Destroy the last element.
Definition: storage.h:569
 
size_t m_number_of_elements
Number of elements in the container.
Definition: storage.h:331
 
Element * prev_element(Element *element) const
Get the previous element of a given element on the same page.
Definition: storage.h:708
 
const char * p
Definition: ctype-mb.cc:1227
 
int page
Definition: ctype-mb.cc:1226
 
Definition: allocator.h:48
 
constexpr size_t STORAGE_PAGE_SIZE
Storage page size.
Definition: constants.h:69
 
TempTable custom allocator.