20 static inline int ID_COUNTER = 0;
24 using DEQUE_TYPE = stool::NaiveIntegerArray<MAX_DEGREE + 2>;
31 stool::SimpleDeque16<InternalNode *> children_;
32 DEQUE_TYPE children_value_count_deque_;
33 DEQUE_TYPE children_value_sum_deque_;
34 bool is_parent_of_leaves_ =
false;
43 this->
id = ID_COUNTER++;
52 void initialize(
const std::vector<InternalNode *> &_children,
bool _is_parent_of_leaves,
const std::vector<LEAF_CONTAINER> &_leaf_container_vec)
54 this->is_parent_of_leaves_ = _is_parent_of_leaves;
55 this->children_.clear();
58 this->children_.push_back(node);
61 this->children_value_count_deque_.clear();
62 this->children_value_sum_deque_.clear();
63 if (this->is_parent_of_leaves_)
67 uint64_t child_count = _leaf_container_vec[(uint64_t)child].size();
68 this->children_value_count_deque_.push_back(child_count);
69 if constexpr (USE_PSUM)
71 uint64_t psum = _leaf_container_vec[(uint64_t)child].psum();
72 this->children_value_sum_deque_.push_back(psum);
80 uint64_t child_count_psum = child->psum_on_count_deque();
81 this->children_value_count_deque_.push_back(child_count_psum);
82 if constexpr (USE_PSUM)
84 this->children_value_sum_deque_.push_back(child->psum_on_sum_deque());
93 std::vector<InternalNode *> _children;
94 _children.push_back(_left_node);
95 _children.push_back(_right_node);
96 this->initialize(_children,
false, _leaf_container_vec);
98 void initialize(uint64_t _left_node, uint64_t _right_node,
const std::vector<LEAF_CONTAINER> &leaf_container_vec)
100 std::vector<InternalNode *> _children;
103 this->initialize(_children,
true, leaf_container_vec);
105 void initialize(
bool _is_parent_of_leaves,
const std::vector<LEAF_CONTAINER> &_leaf_container_vec)
107 std::vector<InternalNode *> _children;
108 this->initialize(_children, _is_parent_of_leaves, _leaf_container_vec);
113 throw std::runtime_error(
"This function is not suppported");
121 int64_t search_query_on_count_deque(uint64_t value, uint64_t &sum)
const
124 return this->children_value_count_deque_.search(value, sum);
126 uint64_t psum_on_count_deque(uint64_t pos)
const
128 return this->children_value_count_deque_.psum(pos);
130 uint64_t access_count_deque(uint64_t pos)
const
132 return this->children_value_count_deque_[pos];
134 uint64_t psum_on_count_deque()
const
136 return this->children_value_count_deque_.psum();
139 void pop_back_many_on_count_deque(uint64_t len)
141 this->children_value_count_deque_.pop_back_many(len);
143 void pop_front_many_on_count_deque(uint64_t len)
145 this->children_value_count_deque_.pop_front_many(len);
147 void push_front_many_on_count_deque(std::vector<uint64_t> values)
149 this->children_value_count_deque_.push_front_many(values);
151 void push_back_many_on_count_deque(std::vector<uint64_t> values)
153 this->children_value_count_deque_.push_back_many(values);
155 void increment_on_count_deque(uint64_t pos, int64_t value)
157 this->children_value_count_deque_.increment(pos, value);
159 void decrement_on_count_deque(uint64_t pos, int64_t value)
161 this->children_value_count_deque_.decrement(pos, value);
170 int64_t search_query_on_sum_deque(uint64_t value, uint64_t &sum)
const
172 if constexpr (USE_PSUM)
174 return this->children_value_sum_deque_.search(value, sum);
178 throw std::runtime_error(
"search_query_on_sum_deque() is not supported");
181 void pop_back_on_sum_deque()
183 this->children_value_sum_deque_.pop_back();
186 void pop_front_on_sum_deque()
188 this->children_value_sum_deque_.pop_front();
191 void push_front_on_sum_deque(uint64_t value)
193 this->children_value_sum_deque_.push_front(value);
196 void push_back_on_sum_deque(uint64_t value)
198 this->children_value_sum_deque_.push_back(value);
201 void increment_on_sum_deque(uint64_t pos, int64_t value)
203 this->children_value_sum_deque_.increment(pos, value);
205 void decrement_on_sum_deque(uint64_t pos, int64_t value)
207 this->children_value_sum_deque_.decrement(pos, value);
210 uint64_t access_last_item_on_sum_deque()
const
212 if constexpr (USE_PSUM)
214 return this->children_value_sum_deque_[this->children_value_sum_deque_.size() - 1];
218 throw std::runtime_error(
"access_last_item_on_sum_deque() is not supported");
222 uint64_t psum_on_sum_deque()
const
224 return this->children_value_sum_deque_.psum();
227 uint64_t access_sum_deque(uint64_t pos)
const
229 if constexpr (USE_PSUM)
231 return this->children_value_sum_deque_[pos];
235 throw std::runtime_error(
"access_sum_deque() is not supported");
239 uint64_t psum_on_sum_deque(uint64_t pos)
const
241 if constexpr (USE_PSUM)
243 return this->children_value_sum_deque_.psum(pos);
247 throw std::runtime_error(
"psum_on_sum_deque() is not supported");
259 const stool::SimpleDeque16<InternalNode *> &get_children()
const
261 return this->children_;
263 stool::SimpleDeque16<InternalNode *> &get_children()
265 return this->children_;
268 bool has_parent_pointer_field()
const
273 bool is_parent_of_leaves()
const
275 return this->is_parent_of_leaves_;
277 uint64_t children_count()
const
279 return this->children_.size();
283 return this->children_[ith];
286 uint64_t get_degree()
const
288 return this->children_.size();
290 uint64_t get_height()
const
292 if (this->is_parent_of_leaves())
298 return this->children_[0]->get_height() + 1;
301 uint64_t size_in_bytes()
const
303 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));
324 throw std::runtime_error(
"BPInternalNode::get_parent(): this function is not supported");
335 void print_info(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
337 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"================= NODE =================" << std::endl;
339 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"InternalNode ID: " << this->id;
341 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"InternalNode ID: " << (uint64_t)
this;
343 std::cout <<
", is_parent_of_leaves: " << this->is_parent_of_leaves();
344 std::cout <<
", count: " << this->psum_on_count_deque();
345 std::cout <<
", sum: " << this->psum_on_sum_deque() << std::endl;
347 auto count_deq_str = this->children_value_count_deque_.to_string();
348 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"count_deque: " << count_deq_str << std::endl;
350 if constexpr (USE_PSUM)
352 auto sum_deq_str = this->children_value_sum_deque_.to_string();
353 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"sum_deque: " << sum_deq_str << std::endl;
358 std::vector<uint64_t> vec;
359 for (uint64_t i = 0; i < this->children_.size(); i++)
361 vec.push_back((uint64_t)this->children_[i]);
363 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"children: " << stool::DebugPrinter::to_integer_string(vec) << std::endl;
365 std::cout << stool::Message::get_paragraph_string(message_paragraph) <<
"==================================" << std::endl;
378 this->children_.clear();
379 this->children_value_count_deque_.clear();
380 this->children_value_sum_deque_.clear();
384 void increment(uint64_t child_index, int64_t count_delta, int64_t sum_delta)
386 assert(child_index < this->children_count());
387 if (count_delta != 0)
389 assert(child_index < this->children_value_count_deque_.size());
390 this->children_value_count_deque_.increment(child_index, count_delta);
393 if constexpr (USE_PSUM)
397 assert(child_index < this->children_value_sum_deque_.size());
398 this->children_value_sum_deque_.increment(child_index, sum_delta);
403 void move_container_index(uint64_t child_index, uint64_t new_leaf_index, std::vector<LEAF_CONTAINER> &leaf_container_vec)
405 assert(this->is_parent_of_leaves_);
406 uint64_t old_leaf = (uint64_t)this->children_[child_index];
407 leaf_container_vec[new_leaf_index].swap(leaf_container_vec[old_leaf]);
408 this->children_[child_index] = (
InternalNode *)new_leaf_index;
410 void insert_child(uint64_t pos,
InternalNode *child, uint64_t child_count, uint64_t child_sum)
412 this->children_.insert(this->children_.begin() + pos, child);
413 this->children_value_count_deque_.insert(pos, child_count);
414 if constexpr (USE_PSUM)
416 this->children_value_sum_deque_.insert(pos, child_sum);
420 void append_child(
InternalNode *child, uint64_t child_count, uint64_t child_sum)
422 this->children_.push_back(child);
423 this->children_value_count_deque_.push_back(child_count);
424 if constexpr (USE_PSUM)
426 this->children_value_sum_deque_.push_back(child_sum);
431 void remove_child(uint64_t pos)
433 this->children_.erase(this->children_.begin() + pos);
434 this->children_value_count_deque_.erase(pos);
435 if constexpr (USE_PSUM)
437 this->children_value_sum_deque_.erase(pos);
442 std::string to_string()
const
446 s +=
"InternalNode ID: " + std::to_string(this->
id);
448 s +=
"InternalNode ID: " + std::to_string((uint64_t)
this);
450 s +=
", is_parent_of_leaves: " + std::to_string(this->is_parent_of_leaves());
451 s +=
", count: " + std::to_string(this->psum_on_count_deque());
452 s +=
", sum: " + std::to_string(this->psum_on_sum_deque());