TPIE

11a2c2d
tpie::bbits::builder< T, O > Class Template Reference

Augmented btree builder. More...

#include <tpie/btree/base.h>

Public Member Functions

template<typename X = enab>
 builder (std::string path, comp_type comp=comp_type(), augmenter_type augmenter=augmenter_type(), btree_flags flags=btree_flags::defaults, enable< X, !is_internal >=enab())
 Construct a btree builder with the given storage. More...
 
template<typename X = enab>
 builder (comp_type comp=comp_type(), augmenter_type augmenter=augmenter_type(), memory_bucket_ref bucket=memory_bucket_ref(), enable< X, is_internal >=enab())
 
void push (value_type v)
 Push a value to the builder. More...
 
tree_type build (const std::string &metadata=std::string())
 Constructs and returns a btree from the value that was pushed to the builder. More...
 

Detailed Description

template<typename T, typename O>
class tpie::bbits::builder< T, O >

Augmented btree builder.

The fanout and location of nodes is decided by the store type S C is the item comparator type A is the type of the augmentation computation fuctor

Definition at line 248 of file base.h.

Constructor & Destructor Documentation

◆ builder()

template<typename T , typename O >
template<typename X = enab>
tpie::bbits::builder< T, O >::builder ( std::string  path,
comp_type  comp = comp_type(),
augmenter_type  augmenter = augmenter_type(),
btree_flags  flags = btree_flags::defaults,
enable< X, !is_internal >  = enab() 
)
inlineexplicit

Construct a btree builder with the given storage.

Definition at line 214 of file btree_builder.h.

216  : m_state(store_type(path, (flags | btree_flags::write) & ~btree_flags::read ), std::move(augmenter), typename state_type::keyextract_type())
217  , m_comp(comp)
218  , m_serialized_size(0)
219  , m_size(0)
220  {}

Member Function Documentation

◆ build()

template<typename T , typename O >
tree_type tpie::bbits::builder< T, O >::build ( const std::string &  metadata = std::string())
inline

Constructs and returns a btree from the value that was pushed to the builder.

The btree builder should not be used again after this point.

Definition at line 257 of file btree_builder.h.

257  {
258  m_state.store().set_size(m_size);
259 
260  // finish building the tree by traversing all levels and constructing leaves/nodes
261  // construct one or two leaves if neccesary
262  if(m_items.size() > 0) {
263  if(!is_serialized && m_items.size() > S::max_leaf_size()) // construct two leaves if necessary
264  construct_leaf(m_items.size()/2);
265  construct_leaf(m_items.size()); // construct a leaf with the remaining items
266  }
267 
268  // if there already exists internal nodes and there are leaves left: construct a new internal node(since there is guaranteed to be atleast S::min_internal_size leaves)
269  // if there do not exist internal nodes, then only construct an internal node if there is more than one leaf
270  if((m_internal_nodes.size() == 0 && m_leaves.size() > 1) || (m_internal_nodes.size() > 0 && m_leaves.size() > 0)) {
271  if(m_leaves.size() > 2*S::max_internal_size() ) // construct two nodes if necessary
272  construct_internal_from_leaves(m_leaves.size()/3);
273  if(m_leaves.size() > S::max_internal_size()) // construct two nodes if necessary
274  construct_internal_from_leaves(m_leaves.size()/2);
275  construct_internal_from_leaves(m_leaves.size()); // construct a node from the remaining leaves
276  }
277 
278  for(size_t i = 0; i < m_internal_nodes.size(); ++i) {
279  // if there already exists internal nodes at a higher level and there are nodes at this level left: construct a new internal node at the higher level.
280  // if there do not exist internal nodes at a higher level, then only construct an internal nodes at that level if there are more than one node at this level.
281  if((m_internal_nodes.size() == i+1 && m_internal_nodes[i].size() > 1)
282  || (m_internal_nodes.size() > i+1 && m_internal_nodes[i].size() > 0)) {
283  if(m_internal_nodes[i].size() > 2*S::max_internal_size())
284  construct_internal_from_internal(m_internal_nodes[i].size()/3, i);
285  if(m_internal_nodes[i].size() > S::max_internal_size())
286  construct_internal_from_internal(m_internal_nodes[i].size()/2, i);
287  construct_internal_from_internal(m_internal_nodes[i].size(), i);
288  }
289  }
290 
291  // find the root and set it as such
292 
293  if(m_internal_nodes.size() == 0 && m_leaves.size() == 0) // no items were pushed
294  m_state.store().set_height(0);
295  else {
296  m_state.store().set_height(m_internal_nodes.size() + 1);
297  if(m_leaves.size() == 1)
298  m_state.store().set_root(m_leaves.front().leaf);
299  else
300  m_state.store().set_root(m_internal_nodes.back().front().internal);
301  }
302  if (metadata.size()) {
303  m_state.store().flush();
304  m_state.store().set_metadata(metadata);
305  }
306  m_state.store().finalize_build();
307  return tree_type(std::move(m_state), std::move(m_comp));
308  }

◆ push()

template<typename T , typename O >
void tpie::bbits::builder< T, O >::push ( value_type  v)
inline

Push a value to the builder.

Values are expected to be received in order

Parameters
vThe value to be pushed

Definition at line 236 of file btree_builder.h.

236  {
237  ++m_size;
238  if (is_serialized) {
239  size_t s = serialized_size(v);
240  if (m_items.size() == S::max_leaf_size() ||
241  (s + m_serialized_size > block_size_getter<S, is_serialized>::v() && m_serialized_size))
242  extract_nodes();
243  m_items.push_back(v);
244  m_serialized_size += s;
245  } else {
246  m_items.push_back(v);
247 
248  // try to construct nodes from items if possible
249  if(m_items.size() < leaf_tipping_point()) return;
250  extract_nodes();
251  }
252  }

References tpie::serialized_size().


The documentation for this class was generated from the following files:
tpie::serialized_size
size_t serialized_size(const T &v)
Given a serializable, serialize it and measure its serialized size.
Definition: serialization2.h:354