Пример #1
0
	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++;
	}
Пример #2
0
	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);
	}
Пример #3
0
/**
 * @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_);
    }
}