#pragma once #include #include #include #include #include #include #include #include namespace xrpl::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); [[nodiscard]] bool exists(ReadView const& base, Keylet const& k) const; [[nodiscard]] std::optional succ(ReadView const& base, key_type const& key, std::optional const& last) const; [[nodiscard]] std::shared_ptr read(ReadView const& base, Keylet const& k) const; std::shared_ptr peek(ReadView const& base, Keylet const& k); [[nodiscard]] 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 [[nodiscard]] 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 xrpl::detail