20 static inline int ID_COUNTER = 0;
26 stool::SimpleDeque16<InternalNode *> children_;
27 stool::NaiveIntegerArray<MAX_DEGREE + 2> children_value_count_deque_;
31 bool is_parent_of_leaves_ =
false;
37 this->
id = ID_COUNTER++;
46 void initialize(
const std::vector<InternalNode *> _children,
bool _is_parent_of_leaves,
const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
48 this->is_parent_of_leaves_ = _is_parent_of_leaves;
49 this->children_.clear();
52 this->children_.push_back(node);
55 this->children_value_count_deque_.clear();
56 if (this->is_parent_of_leaves_)
60 this->children_value_count_deque_.push_back(_leaf_container_vec[(uint64_t)child].size());
67 this->children_value_count_deque_.push_back(child->psum_on_count_deque());
73 this->parent_ = _parent;
75 void initialize(
BPInternalNode *_left_node,
BPInternalNode *_right_node,
const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
77 std::vector<InternalNode *> _children;
78 _children.push_back(_left_node);
79 _children.push_back(_right_node);
80 this->initialize(_children,
false, _leaf_container_vec);
82 void initialize(uint64_t _left_node, uint64_t _right_node,
const std::vector<stool::bptree::PermutationContainer> &leaf_container_vec)
84 std::vector<InternalNode *> _children;
87 this->initialize(_children,
true, leaf_container_vec);
89 void initialize(
bool _is_parent_of_leaves,
const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
91 std::vector<InternalNode *> _children;
92 this->initialize(_children, _is_parent_of_leaves, _leaf_container_vec);
100 uint64_t psum_on_count_deque(uint64_t pos)
const
102 return this->children_value_count_deque_.psum(pos);
105 uint64_t psum_on_count_deque()
const
107 return this->children_value_count_deque_.psum();
109 int64_t search_query_on_count_deque(uint64_t value, uint64_t &sum)
const
111 return this->children_value_count_deque_.search(value, sum);
113 uint64_t access_count_deque(uint64_t pos)
const
115 return this->children_value_count_deque_[pos];
117 void pop_back_many_on_count_deque(uint64_t len)
119 this->children_value_count_deque_.pop_back_many(len);
121 void pop_front_many_on_count_deque(uint64_t len)
123 this->children_value_count_deque_.pop_front_many(len);
125 void push_front_many_on_count_deque(std::vector<uint64_t> values)
127 this->children_value_count_deque_.push_front_many(values);
129 void push_back_many_on_count_deque(std::vector<uint64_t> values)
131 this->children_value_count_deque_.push_back_many(values);
133 void increment_on_count_deque(uint64_t pos, int64_t value)
135 this->children_value_count_deque_.increment(pos, value);
137 void decrement_on_count_deque(uint64_t pos, int64_t value)
139 this->children_value_count_deque_.decrement(pos, value);
147 uint64_t psum_on_sum_deque()
const
149 throw std::runtime_error(
"BPInternalNode<PermutationContainer, PermutationItem>::psum_on_sum_deque(): No Implementation");
152 uint64_t access_last_item_on_sum_deque()
const
154 throw std::runtime_error(
"BPInternalNode<PermutationContainer, PermutationItem>::access_last_item_on_sum_deque(): No Implementation");
165 const stool::SimpleDeque16<InternalNode *> &get_children()
const
167 return this->children_;
169 stool::SimpleDeque16<InternalNode *> &get_children()
171 return this->children_;
174 bool use_psum()
const
178 bool has_parent_pointer_field()
const
183 bool is_parent_of_leaves()
const
185 return this->is_parent_of_leaves_;
187 uint64_t children_count()
const
189 return this->children_.size();
193 return this->children_[ith];
196 uint64_t get_degree()
const
198 return this->children_.size();
200 uint64_t get_height()
const
202 if (this->is_parent_of_leaves())
208 return this->children_[0]->get_height() + 1;
211 uint64_t size_in_bytes()
const
233 return this->parent_;
252 void print_info([[maybe_unused]]
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
254 std::cout <<
"=================" << std::endl;
255 std::cout <<
"This: " << (uint64_t)
this;
256 std::cout <<
", parent: " << (uint64_t)this->parent_;
257 std::cout <<
", is_parent_of_leaves: " << this->is_parent_of_leaves();
258 std::cout <<
", count: " << this->psum_on_count_deque();
259 std::cout <<
", sum: " << this->psum_on_sum_deque() << std::endl;
263 std::vector<uint64_t> vec;
264 for (uint64_t i = 0; i < this->children_.size(); i++)
266 vec.push_back((uint64_t)this->children_[i]);
268 stool::DebugPrinter::print_integers(vec,
"children");
269 std::cout <<
"=================" << std::endl;
282 this->children_.clear();
283 this->children_value_count_deque_.clear();
284 this->parent_ =
nullptr;
287 void increment(uint64_t child_index, int64_t count_delta, [[maybe_unused]] int64_t sum_delta)
289 this->children_value_count_deque_.increment(child_index, count_delta);
292 void move_container_index(uint64_t child_index, uint64_t new_leaf_index, std::vector<stool::bptree::PermutationContainer> &leaf_container_vec)
294 assert(this->is_parent_of_leaves_);
295 uint64_t old_leaf = (uint64_t)this->children_[child_index];
296 leaf_container_vec[new_leaf_index].swap(leaf_container_vec[old_leaf]);
297 this->children_[child_index] = (
InternalNode *)new_leaf_index;
299 void insert_child(uint64_t pos,
InternalNode *child, uint64_t child_count, [[maybe_unused]] uint64_t child_sum)
301 this->children_.insert(this->children_.begin() + pos, child);
302 this->children_value_count_deque_.insert(pos, child_count);
304 void remove_child(uint64_t pos)
306 this->children_.erase(this->children_.begin() + pos);
307 this->children_value_count_deque_.erase(pos);
309 void append_child(
InternalNode *child, uint64_t child_count, [[maybe_unused]] uint64_t child_sum)
311 this->children_.push_back(child);
312 this->children_value_count_deque_.push_back(child_count);
314 std::string to_string()
const
318 s +=
"InternalNode ID: " + std::to_string(this->
id);
320 s +=
"InternalNode ID: " + std::to_string((uint64_t)
this);
322 s +=
", is_parent_of_leaves: " + std::to_string(this->is_parent_of_leaves());
323 s +=
", count: " + std::to_string(this->psum_on_count_deque());
325 s +=
", Count Array: ";
326 s += this->children_value_count_deque_.to_string();