19 static inline int ID_COUNTER = 0;
25 stool::SimpleDeque16<InternalNode *> children_;
26 stool::NaiveArray<MAX_DEGREE+2> children_value_count_deque_;
28 bool is_parent_of_leaves_ =
false;
34 this->
id = ID_COUNTER++;
43 void initialize(
const std::vector<InternalNode *> _children,
bool _is_parent_of_leaves,
const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
45 this->is_parent_of_leaves_ = _is_parent_of_leaves;
46 this->children_.clear();
49 this->children_.push_back(node);
52 this->children_value_count_deque_.clear();
53 if (this->is_parent_of_leaves_)
57 this->children_value_count_deque_.push_back(_leaf_container_vec[(uint64_t)child].size());
64 this->children_value_count_deque_.push_back(child->get_value_count());
70 this->parent_ = _parent;
72 void initialize(
BPInternalNode *_left_node,
BPInternalNode *_right_node,
const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
74 std::vector<InternalNode *> _children;
75 _children.push_back(_left_node);
76 _children.push_back(_right_node);
77 this->initialize(_children,
false, _leaf_container_vec);
79 void initialize(uint64_t _left_node, uint64_t _right_node,
const std::vector<stool::bptree::PermutationContainer> &leaf_container_vec)
81 std::vector<InternalNode *> _children;
84 this->initialize(_children,
true, leaf_container_vec);
86 void initialize(
bool _is_parent_of_leaves,
const std::vector<stool::bptree::PermutationContainer> &_leaf_container_vec)
88 std::vector<InternalNode *> _children;
89 this->initialize(_children, _is_parent_of_leaves, _leaf_container_vec);
99 const stool::SimpleDeque16<InternalNode *> &get_children()
const
101 return this->children_;
103 stool::SimpleDeque16<InternalNode *> &get_children()
105 return this->children_;
107 const stool::NaiveArray<MAX_DEGREE+2> &get_value_count_deque()
const
109 return this->children_value_count_deque_;
111 stool::NaiveArray<MAX_DEGREE+2> &get_value_count_deque()
113 return this->children_value_count_deque_;
115 const stool::NaiveArray<MAX_DEGREE+2> &get_value_sum_deque()
const
117 return this->children_value_count_deque_;
119 stool::NaiveArray<MAX_DEGREE+2> &get_value_sum_deque()
121 return this->children_value_count_deque_;
123 void __increment_a_value_of_sum_deque([[maybe_unused]] uint64_t pos, [[maybe_unused]]int64_t value){
124 throw std::runtime_error(
"BPInternalNode<PermutationContainer, PermutationItem>::__increment_a_value_of_sum_deque(): No Implementation");
126 void __push_back_on_sum_deque([[maybe_unused]]uint64_t value){
127 throw std::runtime_error(
"BPInternalNode<PermutationContainer, PermutationItem>::__push_back_on_sum_deque(): No Implementation");
129 void __push_front_on_sum_deque([[maybe_unused]]uint64_t value){
130 throw std::runtime_error(
"BPInternalNode<PermutationContainer, PermutationItem>::__push_front_on_sum_deque(): No Implementation");
132 void __pop_front_on_sum_deque(){
133 throw std::runtime_error(
"BPInternalNode<PermutationContainer, PermutationItem>::__pop_front_on_sum_deque: No Implementation");
135 void __pop_back_on_sum_deque(){
136 throw std::runtime_error(
"BPInternalNode<PermutationContainer, PermutationItem>::__pop_back_on_sum_deque(): No Implementation");
138 uint64_t __last_item_on_sum_deque()
const {
139 throw std::runtime_error(
"BPInternalNode<PermutationContainer, PermutationItem>::__last_item_on_sum_deque(): No Implementation");
142 bool use_psum()
const
146 bool has_parent_pointer_field()
const
151 bool is_parent_of_leaves()
const
153 return this->is_parent_of_leaves_;
155 uint64_t children_count()
const
157 return this->children_.size();
161 return this->children_[ith];
164 uint64_t get_degree()
const
166 return this->children_.size();
168 uint64_t get_height()
const
170 if (this->is_parent_of_leaves())
176 return this->children_[0]->get_height() + 1;
179 uint64_t size_in_bytes()
const
201 return this->parent_;
212 uint64_t get_value_count()
const
214 uint64_t sum = this->children_value_count_deque_.psum();
223 uint64_t get_value_sum()
const
235 void print_info([[maybe_unused]]
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
237 std::cout <<
"=================" << std::endl;
238 std::cout <<
"This: " << (uint64_t)
this;
239 std::cout <<
", parent: " << (uint64_t)this->parent_;
240 std::cout <<
", is_parent_of_leaves: " << this->is_parent_of_leaves();
241 std::cout <<
", count: " << this->get_value_count();
242 std::cout <<
", sum: " << this->get_value_sum() << std::endl;
246 std::vector<uint64_t> vec;
247 for (uint64_t i = 0; i < this->children_.size(); i++)
249 vec.push_back((uint64_t)this->children_[i]);
251 stool::Printer::print(
"child", vec);
252 std::cout <<
"=================" << std::endl;
265 this->children_.clear();
266 this->children_value_count_deque_.clear();
267 this->parent_ =
nullptr;
270 void increment(uint64_t child_index, int64_t count_delta, [[maybe_unused]] int64_t sum_delta)
272 this->children_value_count_deque_.increment(child_index, count_delta);
275 void move_container_index(uint64_t child_index, uint64_t new_leaf_index, std::vector<stool::bptree::PermutationContainer> &leaf_container_vec)
277 assert(this->is_parent_of_leaves_);
278 uint64_t old_leaf = (uint64_t)this->children_[child_index];
279 leaf_container_vec[new_leaf_index].swap(leaf_container_vec[old_leaf]);
280 this->children_[child_index] = (
InternalNode *)new_leaf_index;
282 void insert_child(uint64_t pos,
InternalNode *child, uint64_t child_count, [[maybe_unused]] uint64_t child_sum)
284 this->children_.insert(this->children_.begin() + pos, child);
285 this->children_value_count_deque_.insert(pos, child_count);
287 void remove_child(uint64_t pos)
289 this->children_.erase(this->children_.begin() + pos);
290 this->children_value_count_deque_.erase(pos);
292 void append_child(
InternalNode *child, uint64_t child_count, [[maybe_unused]] uint64_t child_sum)
294 this->children_.push_back(child);
295 this->children_value_count_deque_.push_back(child_count);
297 std::string to_string()
const{
300 s +=
"InternalNode ID: " + std::to_string(this->
id);
302 s +=
"InternalNode ID: " + std::to_string((uint64_t)
this);
304 s +=
", is_parent_of_leaves: " + std::to_string(this->is_parent_of_leaves());
305 s +=
", count: " + std::to_string(this->get_value_count());
307 s +=
", Count Array: ";
308 s += this->children_value_count_deque_.to_string();