libfoedus-core
FOEDUS Core Library
foedus::storage::hash::ComposedBinsMergedStream Struct Referencefinal

Packages all ComposedBinsBuffer to easily extract bins of current interest. More...

Detailed Description

Packages all ComposedBinsBuffer to easily extract bins of current interest.

This is the highest-level of the object hierarchy defined in this file.

Definition at line 205 of file hash_composed_bins_impl.hpp.

#include <hash_composed_bins_impl.hpp>

Collaboration diagram for foedus::storage::hash::ComposedBinsMergedStream:

Public Types

typedef HashIntermediatePagePagePtr
 

Public Member Functions

ErrorStack init (const HashRootInfoPage *const *inputs, uint32_t input_count, PagePtr root_page, uint16_t root_child_index, memory::AlignedMemory *read_buffer, cache::SnapshotFileSet *fileset, snapshot::SnapshotWriter *writer, uint32_t *writer_buffer_pos, uint32_t *writer_higher_buffer_pos, bool *had_any_change)
 
ErrorCode process_a_bin (uint32_t *installed_count, HashBin *next_lowest_bin)
 Consumes inputs for the cur_path_[0] page and install snapshot pointers there. More...
 
ErrorCode switch_path (HashBin lowest_bin, cache::SnapshotFileSet *fileset, snapshot::SnapshotWriter *writer, uint32_t *writer_buffer_pos, uint32_t *writer_higher_buffer_pos)
 Moves cur_path_ to a page that cotains the specified bin. More...
 
ErrorCode open_path (HashBin bin, uint8_t fixed_upto_level, cache::SnapshotFileSet *fileset, snapshot::SnapshotWriter *writer, uint32_t *writer_buffer_pos, uint32_t *writer_higher_buffer_pos)
 Recursively opens pages down from fixed_upto_level. More...
 
ErrorCode assure_writer_buffer (snapshot::SnapshotWriter *writer, uint32_t *writer_buffer_pos, uint32_t writer_higher_buffer_pos)
 Subroutine to flush the writer if needed to make sure it has enough room. More...
 

Public Attributes

std::unique_ptr< ComposedBinsBuffer[] > inputs_memory_
 just for auto release More...
 
ComposedBinsBufferinputs_
 
uint32_t input_count_
 total number of buffers in inputs_ More...
 
snapshot::SnapshotId snapshot_id_
 
uint8_t levels_
 
uint8_t padding_
 
PagePtr cur_path_ [kHashMaxLevels]
 The pages we are now composing. More...
 

Member Typedef Documentation

Member Function Documentation

ErrorCode foedus::storage::hash::ComposedBinsMergedStream::assure_writer_buffer ( snapshot::SnapshotWriter writer,
uint32_t *  writer_buffer_pos,
uint32_t  writer_higher_buffer_pos 
)

Subroutine to flush the writer if needed to make sure it has enough room.

Definition at line 290 of file hash_composed_bins_impl.cpp.

References ASSERT_ND, CHECK_ERROR_CODE, foedus::snapshot::SnapshotWriter::dump_pages(), foedus::snapshot::SnapshotWriter::expand_intermediate_memory(), foedus::snapshot::SnapshotWriter::get_intermediate_size(), foedus::snapshot::SnapshotWriter::get_page_size(), foedus::kErrorCodeOk, levels_, and UNLIKELY.

Referenced by open_path().

293  {
294  ASSERT_ND(*writer_buffer_pos <= writer->get_page_size());
295  ASSERT_ND(writer_higher_buffer_pos <= writer->get_intermediate_size());
296  if (UNLIKELY(*writer_buffer_pos == writer->get_page_size())) {
297  CHECK_ERROR_CODE(writer->dump_pages(0, *writer_buffer_pos));
298  *writer_buffer_pos = 0;
299  }
300  if (UNLIKELY(writer_higher_buffer_pos + levels_ >= writer->get_intermediate_size())) {
301  CHECK_ERROR_CODE(writer->expand_intermediate_memory(writer_higher_buffer_pos + levels_, true));
302  ASSERT_ND(writer_higher_buffer_pos + levels_ < writer->get_intermediate_size());
303  }
304  return kErrorCodeOk;
305 }
0 means no-error.
Definition: error_code.hpp:87
#define CHECK_ERROR_CODE(x)
This macro calls x and checks its returned error code.
Definition: error_code.hpp:155
#define UNLIKELY(x)
Hints that x is highly likely false.
Definition: compiler.hpp:104
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the call graph for this function:

Here is the caller graph for this function:

ErrorStack foedus::storage::hash::ComposedBinsMergedStream::init ( const HashRootInfoPage *const *  inputs,
uint32_t  input_count,
PagePtr  root_page,
uint16_t  root_child_index,
memory::AlignedMemory read_buffer,
cache::SnapshotFileSet fileset,
snapshot::SnapshotWriter writer,
uint32_t *  writer_buffer_pos,
uint32_t *  writer_higher_buffer_pos,
bool *  had_any_change 
)

Definition at line 87 of file hash_composed_bins_impl.cpp.

References ASSERT_ND, foedus::storage::hash::ComposedBinsBuffer::assure_read_buffer_size(), foedus::storage::hash::ComposedBin::bin_, cur_path_, foedus::memory::AlignedMemory::get_block(), foedus::storage::hash::ComposedBinsBuffer::get_cur_bin(), foedus::storage::hash::HashIntermediatePage::get_level(), foedus::storage::hash::HashIntermediatePage::get_pointer(), foedus::memory::AlignedMemory::get_size(), foedus::snapshot::SnapshotWriter::get_snapshot_id(), foedus::storage::hash::ComposedBinsBuffer::has_more(), foedus::storage::hash::ComposedBinsBuffer::init(), input_count_, inputs_, inputs_memory_, foedus::storage::hash::kInvalidHashBin, foedus::storage::kPageSize, foedus::kRetOk, levels_, open_path(), snapshot_id_, foedus::storage::DualPagePointer::snapshot_pointer_, foedus::storage::DualPagePointer::volatile_pointer_, foedus::storage::VolatilePagePointer::word, and WRAP_ERROR_CODE.

97  {
98  ASSERT_ND(root_page->get_level() >= 1U);
99  snapshot_id_ = writer->get_snapshot_id();
100  std::memset(cur_path_, 0, sizeof(cur_path_));
101 
102  inputs_memory_.reset(new ComposedBinsBuffer[input_count]);
103  inputs_ = inputs_memory_.get();
104  input_count_ = input_count;
105 
106  ComposedBinsBuffer::assure_read_buffer_size(read_buffer, input_count);
107  uint64_t buffer_piece_size = read_buffer->get_size() / kPageSize / input_count;
108  for (uint32_t i = 0; i < input_count_; ++i) {
109  const DualPagePointer& root_child = inputs[i]->get_pointer(root_child_index);
110  SnapshotPagePointer head_page_id = root_child.snapshot_pointer_;
111  uint32_t total_pages = root_child.volatile_pointer_.word;
112  ASSERT_ND(total_pages > 0);
113  HashComposedBinsPage* read_buffer_casted
114  = reinterpret_cast<HashComposedBinsPage*>(read_buffer->get_block());
115  HashComposedBinsPage* buffer_piece = read_buffer_casted + buffer_piece_size * i;
116  inputs_[i].init(fileset, head_page_id, total_pages, buffer_piece_size, buffer_piece);
117  if (inputs_[i].has_more()) {
118  WRAP_ERROR_CODE(inputs_[i].next_pages());
119  }
120  }
121 
122  levels_ = root_page->get_level() + 1U;
123  cur_path_[root_page->get_level()] = root_page;
124 
125  // what's the bin we initially seek to?
126  HashBin initial_bin = kInvalidHashBin;
127  for (uint32_t i = 0; i < input_count_; ++i) {
128  ComposedBinsBuffer* input = inputs_ + i;
129  if (input->has_more()) {
130  initial_bin = std::min<HashBin>(initial_bin, input->get_cur_bin().bin_);
131  }
132  }
133 
134  if (initial_bin == kInvalidHashBin) {
135  *had_any_change = false;
136  } else {
137  *had_any_change = true;
139  initial_bin,
140  root_page->get_level(),
141  fileset,
142  writer,
143  writer_buffer_pos,
144  writer_higher_buffer_pos));
145  }
146 
147  return kRetOk;
148 }
uint32_t input_count_
total number of buffers in inputs_
PagePtr cur_path_[kHashMaxLevels]
The pages we are now composing.
void init(cache::SnapshotFileSet *fileset, SnapshotPagePointer head_page_id, uint32_t total_pages, uint32_t buffer_size, HashComposedBinsPage *buffer)
uint64_t SnapshotPagePointer
Page ID of a snapshot page.
Definition: storage_id.hpp:79
std::unique_ptr< ComposedBinsBuffer[] > inputs_memory_
just for auto release
uint64_t HashBin
Represents a bin of a hash value.
Definition: hash_id.hpp:142
ErrorCode open_path(HashBin bin, uint8_t fixed_upto_level, cache::SnapshotFileSet *fileset, snapshot::SnapshotWriter *writer, uint32_t *writer_buffer_pos, uint32_t *writer_higher_buffer_pos)
Recursively opens pages down from fixed_upto_level.
const ErrorStack kRetOk
Normal return value for no-error case.
const HashBin kInvalidHashBin
This value or larger never appears as a valid HashBin.
Definition: hash_id.hpp:162
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72
#define WRAP_ERROR_CODE(x)
Same as CHECK_ERROR(x) except it receives only an error code, thus more efficient.
static void assure_read_buffer_size(memory::AlignedMemory *read_buffer, uint32_t inputs)
If needed, expand the given read buffer to be used with the inputs.
const uint16_t kPageSize
A constant defining the page size (in bytes) of both snapshot pages and volatile pages.
Definition: storage_id.hpp:45

Here is the call graph for this function:

ErrorCode foedus::storage::hash::ComposedBinsMergedStream::open_path ( HashBin  bin,
uint8_t  fixed_upto_level,
cache::SnapshotFileSet fileset,
snapshot::SnapshotWriter writer,
uint32_t *  writer_buffer_pos,
uint32_t *  writer_higher_buffer_pos 
)

Recursively opens pages down from fixed_upto_level.

Definition at line 225 of file hash_composed_bins_impl.cpp.

References ASSERT_ND, assure_writer_buffer(), foedus::storage::hash::HashBinRange::begin_, CHECK_ERROR_CODE, foedus::storage::hash::IntermediateRoute::construct(), foedus::storage::hash::HashBinRange::contains(), cur_path_, foedus::storage::extract_snapshot_id_from_snapshot_pointer(), foedus::storage::hash::HashIntermediatePage::get_bin_range(), foedus::snapshot::SnapshotWriter::get_intermediate_base(), foedus::snapshot::SnapshotWriter::get_intermediate_size(), foedus::storage::hash::HashIntermediatePage::get_level(), foedus::snapshot::SnapshotWriter::get_next_page_id(), foedus::snapshot::SnapshotWriter::get_page_base(), foedus::snapshot::SnapshotWriter::get_page_size(), foedus::storage::hash::HashIntermediatePage::get_pointer(), foedus::storage::hash::HashIntermediatePage::header(), foedus::storage::hash::HashIntermediatePage::initialize_snapshot_page(), foedus::kErrorCodeOk, foedus::storage::hash::kHashMaxBins, foedus::storage::hash::kInvalidHashBin, foedus::storage::hash::HashBinRange::length(), levels_, foedus::storage::PageHeader::page_id_, foedus::cache::SnapshotFileSet::read_page(), foedus::storage::hash::IntermediateRoute::route, snapshot_id_, foedus::storage::DualPagePointer::snapshot_pointer_, and foedus::storage::PageHeader::storage_id_.

Referenced by init(), and switch_path().

231  {
232  ASSERT_ND(bin != kInvalidHashBin);
233  ASSERT_ND(cur_path_[fixed_upto_level]->get_bin_range().contains(bin));
234  ASSERT_ND(fixed_upto_level < levels_);
235 
236  // we need a room for one-page in main buffer, and levels pages in higher-level buffer.
237  CHECK_ERROR_CODE(assure_writer_buffer(writer, writer_buffer_pos, *writer_higher_buffer_pos));
238  PagePtr higher_base = reinterpret_cast<PagePtr>(writer->get_intermediate_base());
239  PagePtr main_base = reinterpret_cast<PagePtr>(writer->get_page_base());
240 
241  IntermediateRoute route = IntermediateRoute::construct(bin);
242  ASSERT_ND(route.route[levels_] == 0);
243  const StorageId storage_id = cur_path_[levels_ - 1U]->header().storage_id_;
244 
245  // let's open the page that contains the bin. higher levels first.
246  for (uint8_t parent_level = fixed_upto_level; parent_level > 0; --parent_level) {
247  uint8_t level = parent_level - 1U;
248  PagePtr parent = cur_path_[parent_level];
249  ASSERT_ND(parent->get_level() == parent_level);
250  ASSERT_ND(parent->get_bin_range().contains(bin));
251 
252  const uint16_t index = route.route[parent_level];
253  HashBin range_begin = parent->get_bin_range().begin_ + index * kHashMaxBins[parent_level];
254  ASSERT_ND(parent->get_bin_range().length() == kHashMaxBins[parent_level + 1U]);
255 
256  SnapshotPagePointer old_page_id = parent->get_pointer(index).snapshot_pointer_;
257  SnapshotPagePointer new_page_id;
258  PagePtr new_page;
259  if (level > 0) {
260  new_page_id = *writer_higher_buffer_pos;
261  new_page = higher_base + new_page_id;
262  ++(*writer_higher_buffer_pos);
263  ASSERT_ND((*writer_higher_buffer_pos) <= writer->get_intermediate_size());
264  } else {
265  // Unlike higher-levels, we can finalize the page ID for level-0 pages.
266  new_page_id = writer->get_next_page_id() + (*writer_buffer_pos);
267  new_page = main_base + *writer_buffer_pos;
268  ++(*writer_buffer_pos);
269  ASSERT_ND((*writer_buffer_pos) <= writer->get_page_size());
270  }
271  cur_path_[level] = new_page;
272 
273  if (old_page_id == 0) {
274  // the page didn't exist before, create a new one.
275  new_page->initialize_snapshot_page(storage_id, new_page_id, level, range_begin);
276  } else {
277  // otherwise, start from the previous page image.
279  CHECK_ERROR_CODE(fileset->read_page(old_page_id, new_page));
280  ASSERT_ND(new_page->get_bin_range().begin_ == range_begin);
281  ASSERT_ND(new_page->get_level() == level);
282  new_page->header().page_id_ = new_page_id;
283  }
284  parent->get_pointer(index).snapshot_pointer_ = new_page_id;
285  }
286 
287  return kErrorCodeOk;
288 }
ErrorCode assure_writer_buffer(snapshot::SnapshotWriter *writer, uint32_t *writer_buffer_pos, uint32_t writer_higher_buffer_pos)
Subroutine to flush the writer if needed to make sure it has enough room.
uint32_t StorageId
Unique ID for storage.
Definition: storage_id.hpp:55
StorageId storage_id_
ID of the storage this page belongs to.
Definition: page.hpp:196
PagePtr cur_path_[kHashMaxLevels]
The pages we are now composing.
0 means no-error.
Definition: error_code.hpp:87
uint64_t SnapshotPagePointer
Page ID of a snapshot page.
Definition: storage_id.hpp:79
uint16_t extract_snapshot_id_from_snapshot_pointer(SnapshotPagePointer pointer)
Definition: storage_id.hpp:98
void initialize_snapshot_page(StorageId storage_id, SnapshotPagePointer page_id, uint8_t level, HashBin start_bin)
#define CHECK_ERROR_CODE(x)
This macro calls x and checks its returned error code.
Definition: error_code.hpp:155
uint64_t HashBin
Represents a bin of a hash value.
Definition: hash_id.hpp:142
const HashBin kInvalidHashBin
This value or larger never appears as a valid HashBin.
Definition: hash_id.hpp:162
const uint64_t kHashMaxBins[]
kHashTotalBins[n] gives the maximum number of hash bins n-level hash can hold.
Definition: hash_id.hpp:74
static IntermediateRoute construct(HashBin bin)
Calculates the rout for the given hash bin.
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the call graph for this function:

Here is the caller graph for this function:

ErrorCode foedus::storage::hash::ComposedBinsMergedStream::process_a_bin ( uint32_t *  installed_count,
HashBin next_lowest_bin 
)

Consumes inputs for the cur_path_[0] page and install snapshot pointers there.

Parameters
[in,out]installed_countIncrements the number of installed pointers
[out]next_lowest_binThe smallest bin out of all remaining inputs. kInvalidHashBin if all of them are depleted.

Definition at line 150 of file hash_composed_bins_impl.cpp.

References ASSERT_ND, foedus::storage::hash::HashBinRange::begin_, foedus::storage::hash::ComposedBin::bin_, CHECK_ERROR_CODE, cur_path_, foedus::storage::hash::HashBinRange::end_, foedus::storage::extract_snapshot_id_from_snapshot_pointer(), foedus::storage::hash::HashIntermediatePage::get_bin_range(), foedus::storage::hash::ComposedBinsBuffer::get_cur_bin(), foedus::storage::hash::HashIntermediatePage::get_level(), foedus::storage::hash::HashIntermediatePage::get_pointer_address(), foedus::storage::hash::ComposedBinsBuffer::has_more(), foedus::storage::hash::HashIntermediatePage::header(), input_count_, inputs_, foedus::storage::VolatilePagePointer::is_null(), foedus::kErrorCodeOk, foedus::storage::hash::kHashIntermediatePageFanout, foedus::storage::hash::kInvalidHashBin, foedus::storage::hash::ComposedBinsBuffer::next_bin(), foedus::storage::hash::ComposedBin::page_id_, foedus::storage::PageHeader::snapshot_, snapshot_id_, foedus::storage::DualPagePointer::snapshot_pointer_, and foedus::storage::DualPagePointer::volatile_pointer_.

152  {
153  HashIntermediatePage* const page = cur_path_[0];
154  ASSERT_ND(page);
155  const HashBinRange& cur_range = page->get_bin_range();
156  ASSERT_ND(page->get_level() == 0);
157  ASSERT_ND(page->header().snapshot_);
158  *next_lowest_bin = kInvalidHashBin;
159  uint32_t installed_diff = 0;
160 
161  for (uint32_t i = 0; i < input_count_; ++i) {
162  ComposedBinsBuffer* input = inputs_ + i;
163  while (input->has_more()) {
164  const ComposedBin& entry = input->get_cur_bin();
165  ASSERT_ND(cur_range.begin_ <= entry.bin_);
166  ASSERT_ND(entry.page_id_ != 0);
168  if (entry.bin_ >= cur_range.end_) {
169  // no more bins for this page from this input
170  *next_lowest_bin = std::min<HashBin>(*next_lowest_bin, entry.bin_);
171  break;
172  }
173 
174  uint16_t index = entry.bin_ - cur_range.begin_;
176  DualPagePointer* target = page->get_pointer_address(index);
177  ASSERT_ND(target->volatile_pointer_.is_null());
178  ASSERT_ND(extract_snapshot_id_from_snapshot_pointer(target->snapshot_pointer_)
179  != snapshot_id_);
180  target->snapshot_pointer_ = entry.page_id_;
181  ++installed_diff;
182 
183  CHECK_ERROR_CODE(input->next_bin());
184  }
185  }
186 
187  *installed_count += installed_diff;
188  return kErrorCodeOk;
189 }
uint32_t input_count_
total number of buffers in inputs_
PagePtr cur_path_[kHashMaxLevels]
The pages we are now composing.
0 means no-error.
Definition: error_code.hpp:87
uint16_t extract_snapshot_id_from_snapshot_pointer(SnapshotPagePointer pointer)
Definition: storage_id.hpp:98
#define CHECK_ERROR_CODE(x)
This macro calls x and checks its returned error code.
Definition: error_code.hpp:155
const HashBin kInvalidHashBin
This value or larger never appears as a valid HashBin.
Definition: hash_id.hpp:162
const uint8_t kHashIntermediatePageFanout
Number of pointers in an intermediate page of hash storage.
Definition: hash_id.hpp:49
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72
const ComposedBin & get_cur_bin() const __attribute__((always_inline))

Here is the call graph for this function:

ErrorCode foedus::storage::hash::ComposedBinsMergedStream::switch_path ( HashBin  lowest_bin,
cache::SnapshotFileSet fileset,
snapshot::SnapshotWriter writer,
uint32_t *  writer_buffer_pos,
uint32_t *  writer_higher_buffer_pos 
)

Moves cur_path_ to a page that cotains the specified bin.

It opens higher-level pages if needed.

Definition at line 191 of file hash_composed_bins_impl.cpp.

References ASSERT_ND, cur_path_, foedus::storage::hash::kInvalidHashBin, levels_, and open_path().

196  {
197  ASSERT_ND(lowest_bin != kInvalidHashBin);
198  // because a path in this sub-tree must be switched, this is at least 3-levels.
199  // levels_==1 : single-level hash, separately processed in construct_root
200  // levels_==2 : then each sub-tree has only one level-0 page. switch_path is never called.
201  ASSERT_ND(levels_ >= 3U);
202  ASSERT_ND(!cur_path_[0]->get_bin_range().contains(lowest_bin));
203  ASSERT_ND(!cur_path_[levels_ - 1U]->get_bin_range().contains(lowest_bin)); // root page
204  ASSERT_ND(!cur_path_[levels_ - 2U]->get_bin_range().contains(lowest_bin)); // root_child page
205 
206  // where do we have to switch?
207  uint8_t valid_upto;
208  for (valid_upto = 1U; valid_upto + 2U < levels_; ++valid_upto) {
209  if (cur_path_[valid_upto]->get_bin_range().contains(lowest_bin)) {
210  break;
211  }
212  }
213  ASSERT_ND(cur_path_[valid_upto]->get_bin_range().contains(lowest_bin));
214  ASSERT_ND(!cur_path_[valid_upto - 1U]->get_bin_range().contains(lowest_bin));
215 
216  return open_path(
217  lowest_bin,
218  valid_upto,
219  fileset,
220  writer,
221  writer_buffer_pos,
222  writer_higher_buffer_pos);
223 }
PagePtr cur_path_[kHashMaxLevels]
The pages we are now composing.
ErrorCode open_path(HashBin bin, uint8_t fixed_upto_level, cache::SnapshotFileSet *fileset, snapshot::SnapshotWriter *writer, uint32_t *writer_buffer_pos, uint32_t *writer_higher_buffer_pos)
Recursively opens pages down from fixed_upto_level.
const HashBin kInvalidHashBin
This value or larger never appears as a valid HashBin.
Definition: hash_id.hpp:162
#define ASSERT_ND(x)
A warning-free wrapper macro of assert() that has no performance effect in release mode even when 'x'...
Definition: assert_nd.hpp:72

Here is the call graph for this function:

Member Data Documentation

PagePtr foedus::storage::hash::ComposedBinsMergedStream::cur_path_[kHashMaxLevels]

The pages we are now composing.

cur_path_[n] is the level-n intermediate page.

Definition at line 219 of file hash_composed_bins_impl.hpp.

Referenced by init(), open_path(), process_a_bin(), and switch_path().

uint32_t foedus::storage::hash::ComposedBinsMergedStream::input_count_

total number of buffers in inputs_

Definition at line 213 of file hash_composed_bins_impl.hpp.

Referenced by init(), and process_a_bin().

ComposedBinsBuffer* foedus::storage::hash::ComposedBinsMergedStream::inputs_

Definition at line 211 of file hash_composed_bins_impl.hpp.

Referenced by init(), and process_a_bin().

std::unique_ptr< ComposedBinsBuffer[] > foedus::storage::hash::ComposedBinsMergedStream::inputs_memory_

just for auto release

Definition at line 209 of file hash_composed_bins_impl.hpp.

Referenced by init().

uint8_t foedus::storage::hash::ComposedBinsMergedStream::levels_

Definition at line 215 of file hash_composed_bins_impl.hpp.

Referenced by assure_writer_buffer(), init(), open_path(), and switch_path().

uint8_t foedus::storage::hash::ComposedBinsMergedStream::padding_

Definition at line 216 of file hash_composed_bins_impl.hpp.

snapshot::SnapshotId foedus::storage::hash::ComposedBinsMergedStream::snapshot_id_

Definition at line 214 of file hash_composed_bins_impl.hpp.

Referenced by init(), open_path(), and process_a_bin().


The documentation for this struct was generated from the following files: