19 static inline int ID_COUNTER = 0;
25 stool::SimpleDeque16<InternalNode *> children_;
26 stool::NaiveIntegerArray<MAX_DEGREE + 2> children_value_count_deque_;
30 bool is_parent_of_leaves_ =
false;
36 this->
id = ID_COUNTER++;
45 void initialize(
const std::vector<InternalNode *> _children,
bool _is_parent_of_leaves,
const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
47 this->is_parent_of_leaves_ = _is_parent_of_leaves;
48 this->children_.clear();
51 this->children_.push_back(node);
54 this->children_value_count_deque_.clear();
55 if (this->is_parent_of_leaves_)
59 this->children_value_count_deque_.push_back(_leaf_container_vec[(uint64_t)child].size());
66 this->children_value_count_deque_.push_back(child->psum_on_count_deque());
72 this->parent_ = _parent;
74 void initialize(
BPInternalNode *_left_node,
BPInternalNode *_right_node,
const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
76 std::vector<InternalNode *> _children;
77 _children.push_back(_left_node);
78 _children.push_back(_right_node);
79 this->initialize(_children,
false, _leaf_container_vec);
81 void initialize(uint64_t _left_node, uint64_t _right_node,
const std::vector<stool::bptree::PermutationContainer> &leaf_container_vec)
83 std::vector<InternalNode *> _children;
86 this->initialize(_children,
true, leaf_container_vec);
88 void initialize(
bool _is_parent_of_leaves,
const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
90 std::vector<InternalNode *> _children;
91 this->initialize(_children, _is_parent_of_leaves, _leaf_container_vec);
99 uint64_t psum_on_count_deque(uint64_t pos)
const
101 return this->children_value_count_deque_.psum(pos);
104 uint64_t psum_on_count_deque()
const
106 return this->children_value_count_deque_.psum();
108 int64_t search_query_on_count_deque(uint64_t value, uint64_t &sum)
const
110 return this->children_value_count_deque_.search(value, sum);
112 uint64_t access_count_deque(uint64_t pos)
const
114 return this->children_value_count_deque_[pos];
116 void pop_back_many_on_count_deque(uint64_t len)
118 this->children_value_count_deque_.pop_back_many(len);
120 void pop_front_many_on_count_deque(uint64_t len)
122 this->children_value_count_deque_.pop_front_many(len);
124 void push_front_many_on_count_deque(std::vector<uint64_t> values)
126 this->children_value_count_deque_.push_front_many(values);
128 void push_back_many_on_count_deque(std::vector<uint64_t> values)
130 this->children_value_count_deque_.push_back_many(values);
132 void increment_on_count_deque(uint64_t pos, int64_t value)
134 this->children_value_count_deque_.increment(pos, value);
136 void decrement_on_count_deque(uint64_t pos, int64_t value)
138 this->children_value_count_deque_.decrement(pos, value);
146 uint64_t psum_on_sum_deque()
const
148 throw std::runtime_error(
"BPInternalNode<PermutationContainer, PermutationItem>::psum_on_sum_deque(): No Implementation");
151 uint64_t access_last_item_on_sum_deque()
const
153 throw std::runtime_error(
"BPInternalNode<PermutationContainer, PermutationItem>::access_last_item_on_sum_deque(): No Implementation");
164 const stool::SimpleDeque16<InternalNode *> &get_children()
const
166 return this->children_;
168 stool::SimpleDeque16<InternalNode *> &get_children()
170 return this->children_;
173 bool use_psum()
const
177 bool has_parent_pointer_field()
const
182 bool is_parent_of_leaves()
const
184 return this->is_parent_of_leaves_;
186 uint64_t children_count()
const
188 return this->children_.size();
192 return this->children_[ith];
195 uint64_t get_degree()
const
197 return this->children_.size();
199 uint64_t get_height()
const
201 if (this->is_parent_of_leaves())
207 return this->children_[0]->get_height() + 1;
210 uint64_t size_in_bytes()
const
232 return this->parent_;
251 void print_info([[maybe_unused]]
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
253 std::cout <<
"=================" << std::endl;
254 std::cout <<
"This: " << (uint64_t)
this;
255 std::cout <<
", parent: " << (uint64_t)this->parent_;
256 std::cout <<
", is_parent_of_leaves: " << this->is_parent_of_leaves();
257 std::cout <<
", count: " << this->psum_on_count_deque();
258 std::cout <<
", sum: " << this->psum_on_sum_deque() << std::endl;
262 std::vector<uint64_t> vec;
263 for (uint64_t i = 0; i < this->children_.size(); i++)
265 vec.push_back((uint64_t)this->children_[i]);
267 stool::DebugPrinter::print_integers(vec,
"children");
268 std::cout <<
"=================" << std::endl;
281 this->children_.clear();
282 this->children_value_count_deque_.clear();
283 this->parent_ =
nullptr;
286 void increment(uint64_t child_index, int64_t count_delta, [[maybe_unused]] int64_t sum_delta)
288 this->children_value_count_deque_.increment(child_index, count_delta);
291 void move_container_index(uint64_t child_index, uint64_t new_leaf_index, std::vector<stool::bptree::PermutationContainer> &leaf_container_vec)
293 assert(this->is_parent_of_leaves_);
294 uint64_t old_leaf = (uint64_t)this->children_[child_index];
295 leaf_container_vec[new_leaf_index].swap(leaf_container_vec[old_leaf]);
296 this->children_[child_index] = (
InternalNode *)new_leaf_index;
298 void insert_child(uint64_t pos,
InternalNode *child, uint64_t child_count, [[maybe_unused]] uint64_t child_sum)
300 this->children_.insert(this->children_.begin() + pos, child);
301 this->children_value_count_deque_.insert(pos, child_count);
303 void remove_child(uint64_t pos)
305 this->children_.erase(this->children_.begin() + pos);
306 this->children_value_count_deque_.erase(pos);
308 void append_child(
InternalNode *child, uint64_t child_count, [[maybe_unused]] uint64_t child_sum)
310 this->children_.push_back(child);
311 this->children_value_count_deque_.push_back(child_count);
313 std::string to_string()
const
317 s +=
"InternalNode ID: " + std::to_string(this->
id);
319 s +=
"InternalNode ID: " + std::to_string((uint64_t)
this);
321 s +=
", is_parent_of_leaves: " + std::to_string(this->is_parent_of_leaves());
322 s +=
", count: " + std::to_string(this->psum_on_count_deque());
324 s +=
", Count Array: ";
325 s += this->children_value_count_deque_.to_string();