std::shared_ptr<SLE const> CachedViewImpl::read (Keylet const& k) const { { std::lock_guard< std::mutex> lock(mutex_); auto const iter = map_.find(k.key); if (iter != map_.end()) { if (! k.check(*iter->second)) return nullptr; return iter->second; } } auto const digest = base_.digest(k.key); if (! digest) return nullptr; auto sle = cache_.fetch(*digest, [&]() { return base_.read(k); }); std::lock_guard< std::mutex> lock(mutex_); auto const iter = map_.find(k.key); if (iter == map_.end()) { map_.emplace(k.key, sle); return sle; } if (! k.check(*iter->second)) LogicError("CachedView::read: wrong type"); return iter->second; }
std::shared_ptr<SLE> Ledger::peek (Keylet const& k) const { auto const& value = stateMap_->peekItem(k.key); if (! value) return nullptr; auto sle = std::make_shared<SLE>( SerialIter{value->data(), value->size()}, value->key()); if (! k.check(*sle)) return nullptr; return sle; }
bool RawStateTable::exists (ReadView const& base, Keylet const& k) const { assert(k.key.isNonZero()); auto const iter = items_.find(k.key); if (iter == items_.end()) return base.exists(k); auto const& item = iter->second; if (item.first == Action::erase) return false; if (! k.check(*item.second)) return false; return true; }
std::shared_ptr<SLE> Ledger::peek (Keylet const& k) const { auto const& value = stateMap_->peekItem(k.key); if (! value) return nullptr; auto sle = std::make_shared<SLE>( SerialIter{value->data(), value->size()}, value->key()); if (! k.check(*sle)) return nullptr; // VFALCO TODO Eliminate "immutable" runtime property sle->setImmutable(); return sle; }
std::shared_ptr<SLE const> RawStateTable::read (ReadView const& base, Keylet const& k) const { auto const iter = items_.find(k.key); if (iter == items_.end()) return base.read(k); auto const& item = iter->second; if (item.first == Action::erase) return nullptr; // Convert to SLE const std::shared_ptr< SLE const> sle = item.second; if (! k.check(*sle)) return nullptr; return sle; }
std::shared_ptr<SLE const> Ledger::read (Keylet const& k) const { if (k.key == zero) { assert(false); return nullptr; } auto const& item = stateMap_->peekItem(k.key); if (! item) return nullptr; auto sle = std::make_shared<SLE>( SerialIter{item->data(), item->size()}, item->key()); if (! k.check(*sle)) return nullptr; // need move otherwise makes a copy // because return type is different return std::move(sle); }