void fork_database::_push_block(const item_ptr& item) { if( _head ) // make sure the block is within the range that we are caching { FC_ASSERT( item->num > std::max<int64_t>( 0, int64_t(_head->num) - (_max_size) ), "attempting to push a block that is too old", ("item->num",item->num)("head",_head->num)("max_size",_max_size)); } if( _head && item->previous_id() != block_id_type() ) { auto& index = _index.get<block_id>(); auto itr = index.find(item->previous_id()); GRAPHENE_ASSERT(itr != index.end(), unlinkable_block_exception, "block does not link to known chain"); item->prev = *itr; } _index.insert(item); if( !_head ) _head = item; else if( item->num > _head->num ) { _head = item; uint32_t min_num = _head->num - std::min( _max_size, _head->num ); // ilog( "min block in fork DB ${n}, max_size: ${m}", ("n",min_num)("m",_max_size) ); auto& num_idx = _index.get<block_num>(); while( num_idx.size() && (*num_idx.begin())->num < min_num ) num_idx.erase( num_idx.begin() ); _unlinked_index.get<block_num>().erase(_head->num - _max_size); } //_push_next( item ); }
void fork_database::_push_block(const item_ptr& item) { if( _head ) // make sure the block is within the range that we are caching { FC_ASSERT( item->num > std::max<int64_t>( 0, int64_t(_head->num) - (_max_size) ), "attempting to push a block that is too old", ("item->num",item->num)("head",_head->num)("max_size",_max_size)); FC_ASSERT( item->num < _head->num + MAX_BLOCK_REORDERING ); } if( _head && item->previous_id() != block_id_type() ) { auto& index = _index.get<block_id>(); auto itr = index.find(item->previous_id()); GRAPHENE_ASSERT(itr != index.end(), unlinkable_block_exception, "block does not link to known chain"); FC_ASSERT(!(*itr)->invalid); item->prev = *itr; } _index.insert(item); if( !_head ) _head = item; else if( item->num > _head->num ) { _head = item; _index.get<block_num>().erase(_head->num - _max_size); _unlinked_index.get<block_num>().erase(_head->num - _max_size); } _push_next( item ); }
item_ptr remove(item_ptr i, unsigned int n) { auto part = std::make_shared<item_type>(); if (i->split(n, *part) == 0) remove(i); return part; }
void add(item_ptr i) { for (item_ptr stack : m_items) { if (stack->can_stack(*i)) { stack->stack(*i); if (i->stack_size() == 0) return; } } m_items.push_back(i); }
item_list eval(item_ptr &item) { item->eval(); return item->output; }