1#include <xrpl/basics/contract.h> 
    2#include <xrpl/beast/utility/instrumentation.h> 
    3#include <xrpl/ledger/ApplyView.h> 
    4#include <xrpl/protocol/Protocol.h> 
   24        root->setFieldH256(sfRootIndex, directory.
key);
 
   29        root->setFieldV256(sfIndexes, v);
 
   43            LogicError(
"Directory chain: root back-pointer broken.");
 
   46    auto indexes = node->getFieldV256(sfIndexes);
 
   53            if (
std::find(indexes.begin(), indexes.end(), key) != indexes.end())
 
   56            indexes.push_back(key);
 
   63            std::sort(indexes.begin(), indexes.end());
 
   67            if (pos != indexes.end() && key == *pos)
 
   70            indexes.insert(pos, key);
 
   73        node->setFieldV256(sfIndexes, indexes);
 
   97    node->setFieldU64(sfIndexNext, page);
 
  100    root->setFieldU64(sfIndexPrevious, page);
 
  105    indexes.push_back(key);
 
  108    node->setFieldH256(sfRootIndex, directory.
key);
 
  109    node->setFieldV256(sfIndexes, indexes);
 
  114        node->setFieldU64(sfIndexPrevious, page - 1);
 
 
  124    auto node = 
peek(directory);
 
  130    if (directory.
type != ltDIR_NODE ||
 
  131        node->getFieldH256(sfRootIndex) != directory.
key)
 
  134        UNREACHABLE(
"ripple::ApplyView::emptyDirDelete : invalid node type");
 
  140    if (!node->getFieldV256(sfIndexes).empty())
 
  144    auto prevPage = node->getFieldU64(sfIndexPrevious);
 
  145    auto nextPage = node->getFieldU64(sfIndexNext);
 
  147    if (nextPage == rootPage && prevPage != rootPage)
 
  148        LogicError(
"Directory chain: fwd link broken");
 
  150    if (prevPage == rootPage && nextPage != rootPage)
 
  151        LogicError(
"Directory chain: rev link broken");
 
  155    if (nextPage == prevPage && nextPage != rootPage)
 
  160            LogicError(
"Directory chain: fwd link broken.");
 
  162        if (!last->getFieldV256(sfIndexes).empty())
 
  167        node->setFieldU64(sfIndexNext, rootPage);
 
  168        node->setFieldU64(sfIndexPrevious, rootPage);
 
  181    if (nextPage == rootPage && prevPage == rootPage)
 
 
  202        auto entries = node->getFieldV256(sfIndexes);
 
  204        auto it = 
std::find(entries.begin(), entries.end(), key);
 
  206        if (entries.end() == it)
 
  212        node->setFieldV256(sfIndexes, entries);
 
  215        if (!entries.empty())
 
  222    auto prevPage = node->getFieldU64(sfIndexPrevious);
 
  223    auto nextPage = node->getFieldU64(sfIndexNext);
 
  229    if (page == rootPage)
 
  231        if (nextPage == page && prevPage != page)
 
  232            LogicError(
"Directory chain: fwd link broken");
 
  234        if (prevPage == page && nextPage != page)
 
  235            LogicError(
"Directory chain: rev link broken");
 
  240        if (nextPage == prevPage && nextPage != page)
 
  244                LogicError(
"Directory chain: fwd link broken.");
 
  246            if (last->getFieldV256(sfIndexes).empty())
 
  250                node->setFieldU64(sfIndexNext, page);
 
  251                node->setFieldU64(sfIndexPrevious, page);
 
  268        if (nextPage == page && prevPage == page)
 
  275    if (nextPage == page)
 
  276        LogicError(
"Directory chain: fwd link broken");
 
  278    if (prevPage == page)
 
  279        LogicError(
"Directory chain: rev link broken");
 
  287        LogicError(
"Directory chain: fwd link broken.");
 
  289    prev->setFieldU64(sfIndexNext, nextPage);
 
  294        LogicError(
"Directory chain: rev link broken.");
 
  296    next->setFieldU64(sfIndexPrevious, prevPage);
 
  304    if (nextPage != rootPage && next->getFieldU64(sfIndexNext) == rootPage &&
 
  305        next->getFieldV256(sfIndexes).empty())
 
  312        prev->setFieldU64(sfIndexNext, rootPage);
 
  318            LogicError(
"Directory chain: root link broken.");
 
  319        root->setFieldU64(sfIndexPrevious, prevPage);
 
  327    if (!keepRoot && nextPage == rootPage && prevPage == rootPage)
 
  329        if (prev->getFieldV256(sfIndexes).empty())
 
 
  350        for (
auto const& item : page->getFieldV256(sfIndexes))
 
  353        pi = (*page)[~sfIndexNext];
 
 
bool dirDelete(Keylet const &directory, std::function< void(uint256 const &)> const &)
Remove the specified directory, invoking the callback for every node.
 
virtual void update(std::shared_ptr< SLE > const &sle)=0
Indicate changes to a peeked SLE.
 
bool dirRemove(Keylet const &directory, std::uint64_t page, uint256 const &key, bool keepRoot)
Remove an entry from a directory.
 
bool emptyDirDelete(Keylet const &directory)
Remove the specified directory, if it is empty.
 
std::optional< std::uint64_t > dirAdd(bool preserveOrder, Keylet const &directory, uint256 const &key, std::function< void(std::shared_ptr< SLE > const &)> const &describe)
Add an entry to a directory using the specified insert strategy.
 
virtual void insert(std::shared_ptr< SLE > const &sle)=0
Insert a new state SLE.
 
virtual std::shared_ptr< SLE > peek(Keylet const &k)=0
Prepare to modify the SLE associated with key.
 
virtual void erase(std::shared_ptr< SLE > const &sle)=0
Remove a peeked SLE.
 
virtual Rules const & rules() const =0
Returns the tx processing rules.
 
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
 
void push_back(uint256 const &v)
 
Keylet page(uint256 const &root, std::uint64_t index=0) noexcept
A page in a directory.
 
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
 
std::uint64_t constexpr dirNodeMaxPages
The maximum number of pages allowed in a directory.
 
std::size_t constexpr dirNodeMaxEntries
The maximum number of entries per directory page.
 
Number root(Number f, unsigned d)
 
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
 
A pair of SHAMap key and LedgerEntryType.