20 #include <ripple/basics/contract.h>
21 #include <ripple/ledger/ApplyView.h>
22 #include <ripple/protocol/Protocol.h>
39 root = std::make_shared<SLE>(directory);
59 LogicError(
"Directory chain: root back-pointer broken.");
62 auto indexes = node->getFieldV256(
sfIndexes);
69 if (
std::find(indexes.begin(), indexes.end(), key) != indexes.end())
72 indexes.push_back(key);
79 std::sort(indexes.begin(), indexes.end());
83 if (pos != indexes.end() && key == *pos)
86 indexes.insert(pos, key);
108 indexes.push_back(key);
110 node = std::make_shared<SLE>(
keylet::page(directory, page));
127 auto node =
peek(directory);
136 assert(!
"emptyDirDelete() called with wrong node type");
141 if (!node->getFieldV256(
sfIndexes).empty())
148 if (nextPage == rootPage && prevPage != rootPage)
149 LogicError(
"Directory chain: fwd link broken");
151 if (prevPage == rootPage && nextPage != rootPage)
152 LogicError(
"Directory chain: rev link broken");
156 if (nextPage == prevPage && nextPage != rootPage)
161 LogicError(
"Directory chain: fwd link broken.");
163 if (!last->getFieldV256(
sfIndexes).empty())
182 if (nextPage == rootPage && prevPage == rootPage)
203 auto entries = node->getFieldV256(
sfIndexes);
205 auto it =
std::find(entries.begin(), entries.end(), key);
207 if (entries.end() == it)
216 if (!entries.empty())
230 if (page == rootPage)
232 if (nextPage == page && prevPage != page)
233 LogicError(
"Directory chain: fwd link broken");
235 if (prevPage == page && nextPage != page)
236 LogicError(
"Directory chain: rev link broken");
241 if (nextPage == prevPage && nextPage != page)
245 LogicError(
"Directory chain: fwd link broken.");
247 if (last->getFieldV256(
sfIndexes).empty())
269 if (nextPage == page && prevPage == page)
276 if (nextPage == page)
277 LogicError(
"Directory chain: fwd link broken");
279 if (prevPage == page)
280 LogicError(
"Directory chain: rev link broken");
288 LogicError(
"Directory chain: fwd link broken.");
295 LogicError(
"Directory chain: rev link broken.");
305 if (nextPage != rootPage && next->getFieldU64(
sfIndexNext) == rootPage &&
319 LogicError(
"Directory chain: root link broken.");
328 if (!keepRoot && nextPage == rootPage && prevPage == rootPage)
330 if (prev->getFieldV256(
sfIndexes).empty())
351 for (
auto const& item : page->getFieldV256(
sfIndexes))
const SF_UINT64 sfIndexNext
const SF_UINT256 sfRootIndex
A pair of SHAMap key and LedgerEntryType.
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.
void push_back(uint256 const &v)
constexpr std::uint64_t dirNodeMaxPages
The maximum number of pages allowed in a directory.
virtual void update(std::shared_ptr< SLE > const &sle)=0
Indicate changes to a peeked SLE.
@ ltDIR_NODE
A ledger object which contains a list of object identifiers.
const SF_VECTOR256 sfIndexes
bool dirRemove(Keylet const &directory, std::uint64_t page, uint256 const &key, bool keepRoot)
Remove an entry from a directory.
const SF_UINT64 sfIndexPrevious
Keylet page(uint256 const &key, std::uint64_t index) noexcept
A page in a directory.
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.
bool dirDelete(Keylet const &directory, std::function< void(uint256 const &)> const &)
Remove the specified directory, invoking the callback for every node.
virtual void insert(std::shared_ptr< SLE > const &sle)=0
Insert a new state SLE.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
bool emptyDirDelete(Keylet const &directory)
Remove the specified directory, if it is empty.
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
constexpr std::size_t dirNodeMaxEntries
The maximum number of entries per directory page.
Number root(Number f, unsigned d)