void BTree<Key, Value>::Node::insertValue(Key key, Value val) { auto kv = node_data(key, val); if (vals_size == 0) { vals_size++; vals[0] = kv; return; } else { if (vals.data()->first > key) { vals_size++; insert_to_array(vals.data(), vals_size, 0, kv); return; } } auto lb_iter = std::lower_bound( this->vals.data(), this->vals.data() + vals_size, kv, [](const std::pair<Key, Value> &l, const std::pair<Key, Value> &r) { return l.first < r.first; }); if (lb_iter != this->vals.data() + vals_size) { auto d = std::distance(vals.data(), lb_iter); vals_size++; insert_to_array(vals.data(), vals_size, d, kv); return; } this->vals[vals_size] = (kv); vals_size++; }
void BTree<Key, Value>::Node::insertChild(Key key, typename Node::Ptr C) { if (key == this->vals.back().first) { this->childs[childs_size] = C->id; childs_size++; return; } auto kv = std::make_pair(key, Value{}); auto lb_iter = std::lower_bound( this->vals.data(), vals.data() + vals_size, kv, [](const std::pair<Key, Value> &l, const std::pair<Key, Value> &r) { return l.first < r.first; }); if (lb_iter != this->vals.data() + vals_size) { auto d = std::distance(this->vals.data(), lb_iter); insert_to_array(this->childs.data(), childs_size + 1, d + 1, C->id); childs_size++; return; } else { this->childs[childs_size] = C->id; childs_size++; } assert(false); }
/** * @brief add * @param token_ * @return true if token is expected */ bool json_tree_builder::add(const token &token_) { if (_finished) // do not accept new tokens return false; if (_current == nullptr) { // first token return process_first(token_); } else if (_current->jtype() == json_type::J_OBJECT) { return insert_to_object(token_); } else { return insert_to_array(token_); } }