43 std::shared_ptr<std::vector<UserData>>
data_;
48 data_ = std::make_shared<std::vector<UserData>>(
value);
51 ValueItem(std::vector<uint32_t>
const &col_count_list)
53 data_ = std::make_shared<std::vector<UserData>>(col_count_list.size());
54 for (
size_t i = 0; i < col_count_list.size(); i++) {
55 (*data_)[i].vcol_len = col_count_list[i];
73 for (
size_t i = 0; i + 1 <
data_->size(); i++) {
74 uint32_t len = (*data_)[i].vcol_len;
76 if (lcol < len)
break;
88 assert(row < data_->size());
90 for (
size_t i = 0; i < row; i++) {
91 lcol += (*data_)[i].vcol_len;
137 node->
leaves.push_back(std::move(leaf));
154 size_t half = node->
leaves.size() / 2;
156 newnode.
leaves.assign(std::make_move_iterator(node->
leaves.begin() + half), std::make_move_iterator(node->
leaves.end()));
157 node->
leaves.resize(half);
160 nodes_.insert(
nodes_.begin() + ni + 1, std::move(newnode));
170 leaf->
items.insert(leaf->
items.begin() + offset, item);
176 size_t half = leaf->
items.size() / 2;
184 leaf->
items.resize(half);
185 node->
leaves.insert(node->
leaves.begin() + li + 1, std::move(newleaf));
205 if (lrow >= node.num_items) {
206 result.
sum += node.sum_values;
207 lrow -= node.num_items;
208 if (lrow == 0)
break;
211 for (
Leaf const &leaf : node.leaves) {
212 size_t nvalues = leaf.
items.size();
213 if (lrow < nvalues) {
215 for (
size_t j = 0; j < lrow; j++) {
216 result.
sum += leaf.
items[j].value();
224 if (lrow == 0)
break;
237 if (node.leaves.empty())
return false;
239 size_t num_items = 0;
240 uint64_t node_sum = 0;
241 for (
Leaf const &leaf : node.leaves) {
242 if (leaf.
items.empty())
return false;
249 num_items += leaf.
items.size();
252 if (node.num_items != num_items)
return false;
253 if (node.sum_values != node_sum)
return false;
267 if (lrow >= node.num_items) {
268 lrow -= node.num_items;
271 for (
Leaf const &leaf : node.leaves) {
272 size_t nvalues = leaf.
items.size();
273 if (lrow < nvalues) {
274 return leaf.
items[lrow];
293 for (
size_t ni = 0; ni <
nodes_.size(); ni++) {
300 for (
size_t li = 0; li < node.
leaves.size(); li++) {
301 size_t nvalues = node.
leaves[li].items.size();
302 if (lrow <= nvalues) {
314 std::vector<value_type> *items = &node->
leaves.back().items;
316 items->insert(items->end(), n, {});
330 if (lrow >= node.num_items) {
331 lrow -= node.num_items;
334 for (
Leaf &leaf : node.leaves) {
335 size_t nvalues = leaf.
items.size();
336 if (lrow < nvalues) {
338 uint64_t oldvalue = leaf.
items[lrow].value();
339 uint64_t newvalue = value.
value();
342 node.sum_values -= oldvalue;
343 node.sum_values += newvalue;
344 leaf.
items[lrow] = value;
359 for (
size_t ni = 0; ni <
nodes_.size(); ni++) {
366 for (
size_t li = 0; li < node->
leaves.size(); li++) {
368 size_t nvalues = leaf->
items.size();
369 if (lrow < nvalues) {
370 uint64_t oldvalue = leaf->
items[lrow].value();
374 leaf->
items.erase(leaf->
items.begin() + lrow);
375 if (leaf->
items.empty()) {
377 if (node->
leaves.empty()) {
423 if (vrow >= node.sum_values) {
424 vrow -= node.sum_values;
425 lrow += node.num_items;
428 for (
Leaf const &leaf : node.leaves) {
432 lrow += leaf.
items.size();
437 uint32_t v = item.
value();
460 total += node.num_items;
469 total += node.sum_values;
Definition: LineIndexMap.h:40
std::shared_ptr< std::vector< UserData > > data_
Definition: LineIndexMap.h:43
ValueItem(uint32_t value=0)
Definition: LineIndexMap.h:46
uint32_t column_of_row(uint32_t row) const
Definition: LineIndexMap.h:85
ValueItem(std::vector< uint32_t > const &col_count_list)
Definition: LineIndexMap.h:51
std::pair< uint32_t, uint32_t > locate_column(uint32_t lcol) const
Definition: LineIndexMap.h:69
uint32_t value() const
Definition: LineIndexMap.h:59
Definition: LineIndexMap.h:29
void insert(key_type lrow, value_type item)
Definition: LineIndexMap.h:291
void update(key_type lrow, value_type value)
Definition: LineIndexMap.h:326
uint32_t key_type
Definition: LineIndexMap.h:96
void clear()
Definition: LineIndexMap.h:258
CountResult count_and_find(key_type lrow) const
Definition: LineIndexMap.h:200
uint64_t total_logical_row_count() const
Definition: LineIndexMap.h:456
std::vector< Node > nodes_
Definition: LineIndexMap.h:118
void ensure_tail()
Definition: LineIndexMap.h:124
VisualPosition logical_to_visual(key_type lrow, uint32_t lcol) const
Definition: LineIndexMap.h:396
void erase(key_type lrow)
Definition: LineIndexMap.h:357
bool validate() const
Definition: LineIndexMap.h:234
std::optional< value_type > find(key_type lrow) const
Definition: LineIndexMap.h:263
LogicalPosition visual_to_logical(uint64_t vrow) const
Definition: LineIndexMap.h:418
uint64_t count(key_type lrow) const
Definition: LineIndexMap.h:285
static constexpr size_t max_leaf_capacity
Definition: LineIndexMap.h:99
ValueItem value_type
Definition: LineIndexMap.h:97
uint64_t total_visual_row_count() const
Definition: LineIndexMap.h:465
void insert_into_leaf(size_t ni, size_t li, size_t offset, value_type item)
Definition: LineIndexMap.h:166
static constexpr size_t max_node_fanout
Definition: LineIndexMap.h:100
void split_node(size_t ni)
Definition: LineIndexMap.h:151
void recalc_node(Node *node)
Definition: LineIndexMap.h:141
Definition: LineIndexMap.h:193
uint64_t sum
Definition: LineIndexMap.h:194
ValueItem const * item
Definition: LineIndexMap.h:195
Definition: LineIndexMap.h:104
uint64_t sum_values
Definition: LineIndexMap.h:106
std::vector< value_type > items
Definition: LineIndexMap.h:105
Definition: LineIndexMap.h:413
uint32_t lcol
Definition: LineIndexMap.h:415
uint32_t lrow
Definition: LineIndexMap.h:414
uint32_t wrap_index
Definition: LineIndexMap.h:416
Definition: LineIndexMap.h:111
size_t num_items
Definition: LineIndexMap.h:113
uint64_t sum_values
Definition: LineIndexMap.h:114
std::vector< Leaf > leaves
Definition: LineIndexMap.h:112
Definition: LineIndexMap.h:32
uint32_t vcol_len
Definition: LineIndexMap.h:33
Definition: LineIndexMap.h:392
uint64_t vrow
Definition: LineIndexMap.h:393
uint32_t vcol
Definition: LineIndexMap.h:394