19 static inline int ID_COUNTER = 0;
23 using DEQUE_TYPE = stool::NaiveIntegerArray<MAX_DEGREE + 2>;
30 stool::SimpleDeque16<InternalNode *> children_;
31 DEQUE_TYPE children_value_count_deque_;
32 DEQUE_TYPE children_value_sum_deque_;
33 bool is_parent_of_leaves_ =
false;
42 this->
id = ID_COUNTER++;
51 void initialize(
const std::vector<InternalNode *> &_children,
bool _is_parent_of_leaves,
const std::vector<LEAF_CONTAINER> &_leaf_container_vec)
53 this->is_parent_of_leaves_ = _is_parent_of_leaves;
54 this->children_.clear();
57 this->children_.push_back(node);
60 this->children_value_count_deque_.clear();
61 this->children_value_sum_deque_.clear();
62 if (this->is_parent_of_leaves_)
66 uint64_t child_count = _leaf_container_vec[(uint64_t)child].size();
67 this->children_value_count_deque_.push_back(child_count);
68 if constexpr (USE_PSUM)
70 uint64_t psum = _leaf_container_vec[(uint64_t)child].psum();
71 this->children_value_sum_deque_.push_back(psum);
79 uint64_t child_count_psum = child->psum_on_count_deque();
80 this->children_value_count_deque_.push_back(child_count_psum);
81 if constexpr (USE_PSUM)
83 this->children_value_sum_deque_.push_back(child->psum_on_sum_deque());
92 std::vector<InternalNode *> _children;
93 _children.push_back(_left_node);
94 _children.push_back(_right_node);
95 this->initialize(_children,
false, _leaf_container_vec);
97 void initialize(uint64_t _left_node, uint64_t _right_node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
99 std::vector<InternalNode *> _children;
102 this->initialize(_children,
true, leaf_container_vec);
104 void initialize(
bool _is_parent_of_leaves,
const std::vector<LEAF_CONTAINER> &_leaf_container_vec)
106 std::vector<InternalNode *> _children;
107 this->initialize(_children, _is_parent_of_leaves, _leaf_container_vec);
112 throw std::runtime_error(
"This function is not suppported");
120 int64_t search_query_on_count_deque(uint64_t value, uint64_t &sum)
const
123 return this->children_value_count_deque_.search(value, sum);
125 uint64_t psum_on_count_deque(uint64_t pos)
const
127 return this->children_value_count_deque_.psum(pos);
129 uint64_t access_count_deque(uint64_t pos)
const
131 return this->children_value_count_deque_[pos];
133 uint64_t psum_on_count_deque()
const
135 return this->children_value_count_deque_.psum();
138 void pop_back_many_on_count_deque(uint64_t len)
140 this->children_value_count_deque_.pop_back_many(len);
142 void pop_front_many_on_count_deque(uint64_t len)
144 this->children_value_count_deque_.pop_front_many(len);
146 void push_front_many_on_count_deque(std::vector<uint64_t> values)
148 this->children_value_count_deque_.push_front_many(values);
150 void push_back_many_on_count_deque(std::vector<uint64_t> values)
152 this->children_value_count_deque_.push_back_many(values);
154 void increment_on_count_deque(uint64_t pos, int64_t value)
156 this->children_value_count_deque_.increment(pos, value);
158 void decrement_on_count_deque(uint64_t pos, int64_t value)
160 this->children_value_count_deque_.decrement(pos, value);
169 int64_t search_query_on_sum_deque(uint64_t value, uint64_t &sum)
const
171 if constexpr (USE_PSUM)
173 return this->children_value_sum_deque_.search(value, sum);
177 throw std::runtime_error(
"search_query_on_sum_deque() is not supported");
180 void pop_back_on_sum_deque()
182 this->children_value_sum_deque_.pop_back();
185 void pop_front_on_sum_deque()
187 this->children_value_sum_deque_.pop_front();
190 void push_front_on_sum_deque(uint64_t value)
192 this->children_value_sum_deque_.push_front(value);
195 void push_back_on_sum_deque(uint64_t value)
197 this->children_value_sum_deque_.push_back(value);
200 void increment_on_sum_deque(uint64_t pos, int64_t value)
202 this->children_value_sum_deque_.increment(pos, value);
204 void decrement_on_sum_deque(uint64_t pos, int64_t value)
206 this->children_value_sum_deque_.decrement(pos, value);
209 uint64_t access_last_item_on_sum_deque()
const
211 if constexpr (USE_PSUM)
213 return this->children_value_sum_deque_[this->children_value_sum_deque_.size() - 1];
217 throw std::runtime_error(
"access_last_item_on_sum_deque() is not supported");
221 uint64_t psum_on_sum_deque()
const
223 return this->children_value_sum_deque_.psum();
226 uint64_t access_sum_deque(uint64_t pos)
const
228 if constexpr (USE_PSUM)
230 return this->children_value_sum_deque_[pos];
234 throw std::runtime_error(
"access_sum_deque() is not supported");
238 uint64_t psum_on_sum_deque(uint64_t pos)
const
240 if constexpr (USE_PSUM)
242 return this->children_value_sum_deque_.psum(pos);
246 throw std::runtime_error(
"psum_on_sum_deque() is not supported");
258 const stool::SimpleDeque16<InternalNode *> &get_children()
const
260 return this->children_;
262 stool::SimpleDeque16<InternalNode *> &get_children()
264 return this->children_;
267 bool has_parent_pointer_field()
const
272 bool is_parent_of_leaves()
const
274 return this->is_parent_of_leaves_;
276 uint64_t children_count()
const
278 return this->children_.size();
282 return this->children_[ith];
285 uint64_t get_degree()
const
287 return this->children_.size();
289 uint64_t get_height()
const
291 if (this->is_parent_of_leaves())
297 return this->children_[0]->get_height() + 1;
300 uint64_t size_in_bytes()
const
302 return sizeof(
BPInternalNode) + (this->children_.size_in_bytes(
true) + this->children_value_count_deque_.size_in_bytes(
true) + this->children_value_sum_deque_.size_in_bytes(
true));
323 throw std::runtime_error(
"BPInternalNode::get_parent(): this function is not supported");
334 void print_info(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
336 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"================= NODE =================" << std::endl;
338 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"InternalNode ID: " << this->id;
340 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"InternalNode ID: " << (uint64_t)
this;
342 std::cout <<
", is_parent_of_leaves: " << this->is_parent_of_leaves();
343 std::cout <<
", count: " << this->psum_on_count_deque();
344 std::cout <<
", sum: " << this->psum_on_sum_deque() << std::endl;
346 auto count_deq_str = this->children_value_count_deque_.to_string();
347 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"count_deque: " << count_deq_str << std::endl;
349 if constexpr (USE_PSUM)
351 auto sum_deq_str = this->children_value_sum_deque_.to_string();
352 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"sum_deque: " << sum_deq_str << std::endl;
357 std::vector<uint64_t> vec;
358 for (uint64_t i = 0; i < this->children_.size(); i++)
360 vec.push_back((uint64_t)this->children_[i]);
362 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"children: " << stool::ConverterToString::to_integer_string(vec) << std::endl;
364 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"==================================" << std::endl;
377 this->children_.clear();
378 this->children_value_count_deque_.clear();
379 this->children_value_sum_deque_.clear();
383 void increment(uint64_t child_index, int64_t count_delta, int64_t sum_delta)
385 assert(child_index < this->children_count());
386 if (count_delta != 0)
388 assert(child_index < this->children_value_count_deque_.size());
389 this->children_value_count_deque_.increment(child_index, count_delta);
392 if constexpr (USE_PSUM)
396 assert(child_index < this->children_value_sum_deque_.size());
397 this->children_value_sum_deque_.increment(child_index, sum_delta);
402 void move_container_index(uint64_t child_index, uint64_t new_leaf_index, std::vector<LEAF_CONTAINER> &leaf_container_vec)
404 assert(this->is_parent_of_leaves_);
405 uint64_t old_leaf = (uint64_t)this->children_[child_index];
406 leaf_container_vec[new_leaf_index].swap(leaf_container_vec[old_leaf]);
407 this->children_[child_index] = (
InternalNode *)new_leaf_index;
409 void insert_child(uint64_t pos,
InternalNode *child, uint64_t child_count, uint64_t child_sum)
411 this->children_.insert(this->children_.begin() + pos, child);
412 this->children_value_count_deque_.insert(pos, child_count);
413 if constexpr (USE_PSUM)
415 this->children_value_sum_deque_.insert(pos, child_sum);
419 void append_child(
InternalNode *child, uint64_t child_count, uint64_t child_sum)
421 this->children_.push_back(child);
422 this->children_value_count_deque_.push_back(child_count);
423 if constexpr (USE_PSUM)
425 this->children_value_sum_deque_.push_back(child_sum);
430 void remove_child(uint64_t pos)
432 this->children_.erase(this->children_.begin() + pos);
433 this->children_value_count_deque_.erase(pos);
434 if constexpr (USE_PSUM)
436 this->children_value_sum_deque_.erase(pos);
441 std::string to_string()
const
445 s +=
"InternalNode ID: " + std::to_string(this->
id);
447 s +=
"InternalNode ID: " + std::to_string((uint64_t)
this);
449 s +=
", is_parent_of_leaves: " + std::to_string(this->is_parent_of_leaves());
450 s +=
", count: " + std::to_string(this->psum_on_count_deque());
451 s +=
", sum: " + std::to_string(this->psum_on_sum_deque());