tree_cursor_t::tree_cursor_t(Ref<LeafNode> node, const search_position_t& pos)
: leaf_node{node}, position{pos} {
assert(!is_end());
- leaf_node->do_track_cursor(*this);
+ leaf_node->do_track_cursor<true>(*this);
}
tree_cursor_t::tree_cursor_t(
: leaf_node{node}, position{pos} {
assert(!is_end());
update_kv(key, _p_value, v);
- leaf_node->do_track_cursor(*this);
+ leaf_node->do_track_cursor<true>(*this);
}
tree_cursor_t::tree_cursor_t(Ref<LeafNode> node)
return p_value;
}
+template <bool VALIDATE>
void tree_cursor_t::update_track(
Ref<LeafNode> node, const search_position_t& pos) {
// the cursor must be already untracked
position = pos;
key_view.reset();
p_value = nullptr;
- leaf_node->do_track_cursor(*this);
+ leaf_node->do_track_cursor<VALIDATE>(*this);
}
+template void tree_cursor_t::update_track<true>(Ref<LeafNode>, const search_position_t&);
+template void tree_cursor_t::update_track<false>(Ref<LeafNode>, const search_position_t&);
void tree_cursor_t::update_kv(
const key_view_t& key, const onode_t* _p_value, layout_version_t v) const {
for (auto& p_cursor : p_cursors) {
search_position_t new_pos = p_cursor->get_position();
++new_pos.index_by_stage(insert_stage);
- p_cursor->update_track(this, new_pos);
+ p_cursor->update_track<true>(this, new_pos);
}
// track insert
while (iter != tracked_cursors.end()) {
search_position_t new_pos = iter->first;
new_pos -= split_pos;
- iter->second->update_track(right_node, new_pos);
+ iter->second->update_track<false>(right_node, new_pos);
++iter;
}
tracked_cursors.erase(first, tracked_cursors.end());
tree_cursor_t(Ref<LeafNode>);
const search_position_t& get_position() const { return position; }
Ref<LeafNode> get_leaf_node() { return leaf_node; }
+ template <bool VALIDATE>
void update_track(Ref<LeafNode>, const search_position_t&);
void update_kv(const key_view_t&, const onode_t*, layout_version_t) const;
void ensure_kv() const;
layout_version_t get_layout_version() const { return layout_version; }
std::tuple<key_view_t, const onode_t*, layout_version_t> get_kv(
const search_position_t&) const;
+ template <bool VALIDATE>
void do_track_cursor(tree_cursor_t& cursor) {
- validate_cursor(cursor);
+ if constexpr (VALIDATE) {
+ validate_cursor(cursor);
+ }
auto& cursor_pos = cursor.get_position();
assert(tracked_cursors.find(cursor_pos) == tracked_cursors.end());
tracked_cursors[cursor_pos] = &cursor;