#ifndef XRPL_LEDGER_APPLYSTATETABLE_H_INCLUDED #define XRPL_LEDGER_APPLYSTATETABLE_H_INCLUDED #include #include #include #include #include #include #include #include namespace ripple { namespace detail { // Helper class that buffers modifications class ApplyStateTable { public: using key_type = ReadView::key_type; private: enum class Action { cache, erase, insert, modify, }; using items_t = std::map>>; items_t items_; XRPAmount dropsDestroyed_{0}; public: ApplyStateTable() = default; ApplyStateTable(ApplyStateTable&&) = default; ApplyStateTable(ApplyStateTable const&) = delete; ApplyStateTable& operator=(ApplyStateTable&&) = delete; ApplyStateTable& operator=(ApplyStateTable const&) = delete; void apply(RawView& to) const; std::optional apply( OpenView& to, STTx const& tx, TER ter, std::optional const& deliver, std::optional const& parentBatchId, bool isDryRun, beast::Journal j); bool exists(ReadView const& base, Keylet const& k) const; std::optional succ( ReadView const& base, key_type const& key, std::optional const& last) const; std::shared_ptr read(ReadView const& base, Keylet const& k) const; std::shared_ptr peek(ReadView const& base, Keylet const& k); std::size_t size() const; void visit( ReadView const& base, std::function const& before, std::shared_ptr const& after)> const& func) const; void erase(ReadView const& base, std::shared_ptr const& sle); void rawErase(ReadView const& base, std::shared_ptr const& sle); void insert(ReadView const& base, std::shared_ptr const& sle); void update(ReadView const& base, std::shared_ptr const& sle); void replace(ReadView const& base, std::shared_ptr const& sle); void destroyXRP(XRPAmount const& fee); // For debugging XRPAmount const& dropsDestroyed() const { return dropsDestroyed_; } private: using Mods = hash_map>; static void threadItem(TxMeta& meta, std::shared_ptr const& to); std::shared_ptr getForMod( ReadView const& base, key_type const& key, Mods& mods, beast::Journal j); void threadTx( ReadView const& base, TxMeta& meta, AccountID const& to, Mods& mods, beast::Journal j); void threadOwners( ReadView const& base, TxMeta& meta, std::shared_ptr const& sle, Mods& mods, beast::Journal j); }; } // namespace detail } // namespace ripple #endif