if (next_pos.is_end()) {
if (unlikely(is_level_tail())) {
return node_ertr::make_ready_future<Ref<tree_cursor_t>>(
- new tree_cursor_t(this));
+ tree_cursor_t::create_end(this));
} else {
return get_next_cursor_from_parent(c);
}
if (unlikely(impl->is_empty())) {
assert(is_root());
return node_ertr::make_ready_future<Ref<tree_cursor_t>>(
- new tree_cursor_t(this));
+ tree_cursor_t::create_end(this));
}
auto pos = search_position_t::begin();
key_view_t index_key;
if (unlikely(impl->is_empty())) {
assert(is_root());
return node_ertr::make_ready_future<Ref<tree_cursor_t>>(
- new tree_cursor_t(this));
+ tree_cursor_t::create_end(this));
}
search_position_t pos;
const value_header_t* p_value_header = nullptr;
Ref<tree_cursor_t> cursor;
if (result.position.is_end()) {
assert(!result.p_value);
- cursor = new tree_cursor_t(this);
+ cursor = tree_cursor_t::create_end(this);
} else {
cursor = get_or_track_cursor(result.position, index_key, result.p_value);
}
Ref<tree_cursor_t> p_cursor;
auto found = tracked_cursors.find(position);
if (found == tracked_cursors.end()) {
- p_cursor = new tree_cursor_t(this, position, key, p_value_header);
+ p_cursor = tree_cursor_t::create(this, position, key, p_value_header);
} else {
p_cursor = found->second;
assert(p_cursor->get_leaf_node() == this);
// track insert
// TODO: getting key_view_t from stage::proceed_insert() and
// stage::append_insert() has not supported yet
- return new tree_cursor_t(this, insert_pos);
+ return tree_cursor_t::create(this, insert_pos);
}
void LeafNode::track_split(
void update_cache(LeafNode&, const key_view_t&, const value_header_t*) const;
void maybe_update_cache(value_magic_t magic) const;
+ static Ref<tree_cursor_t> create(Ref<LeafNode> node, const search_position_t& pos) {
+ return new tree_cursor_t(node, pos);
+ }
+
+ static Ref<tree_cursor_t> create(Ref<LeafNode> node, const search_position_t& pos,
+ const key_view_t& key, const value_header_t* p_header) {
+ return new tree_cursor_t(node, pos, key, p_header);
+ }
+
+ static Ref<tree_cursor_t> create_end(Ref<LeafNode> node) {
+ return new tree_cursor_t(node);
+ }
+
/**
* Reversed resource management (tree_cursor_t)
*