rippled
Loading...
Searching...
No Matches
SHAMapInnerNode.h
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2012, 2013 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#ifndef RIPPLE_SHAMAP_SHAMAPINNERNODE_H_INCLUDED
21#define RIPPLE_SHAMAP_SHAMAPINNERNODE_H_INCLUDED
22
23#include <xrpld/shamap/SHAMapItem.h>
24#include <xrpld/shamap/SHAMapNodeID.h>
25#include <xrpld/shamap/SHAMapTreeNode.h>
26#include <xrpld/shamap/detail/TaggedPointer.h>
27#include <xrpl/basics/TaggedCache.h>
28#include <xrpl/beast/utility/Journal.h>
29
30#include <atomic>
31#include <bit>
32#include <bitset>
33#include <cstdint>
34#include <limits>
35#include <memory>
36#include <mutex>
37#include <optional>
38#include <string>
39
40namespace ripple {
41
42class SHAMapInnerNode final : public SHAMapTreeNode,
43 public CountedObject<SHAMapInnerNode>
44{
45public:
47 static inline constexpr unsigned int branchFactor = 16;
48
49private:
55
58
61
72 void
74
84 getChildIndex(int i) const;
85
92 template <class F>
93 void
94 iterChildren(F&& f) const;
95
103 template <class F>
104 void
105 iterNonEmptyChildIndexes(F&& f) const;
106
107public:
108 explicit SHAMapInnerNode(
110 std::uint8_t numAllocatedChildren = 2);
111
114 operator=(SHAMapInnerNode const&) = delete;
116
118 clone(std::uint32_t cowid) const override;
119
121 getType() const override
122 {
124 }
125
126 bool
127 isLeaf() const override
128 {
129 return false;
130 }
131
132 bool
133 isInner() const override
134 {
135 return true;
136 }
137
138 bool
139 isEmpty() const;
140
141 bool
142 isEmptyBranch(int m) const;
143
144 int
145 getBranchCount() const;
146
147 SHAMapHash const&
148 getChildHash(int m) const;
149
150 void
152
153 void
154 shareChild(int m, std::shared_ptr<SHAMapTreeNode> const& child);
155
157 getChildPointer(int branch);
158
160 getChild(int branch);
161
164
165 // sync functions
166 bool
167 isFullBelow(std::uint32_t generation) const;
168
169 void
171
172 void
173 updateHash() override;
174
176 void
178
179 void
180 serializeForWire(Serializer&) const override;
181
182 void
183 serializeWithPrefix(Serializer&) const override;
184
186 getString(SHAMapNodeID const&) const override;
187
188 void
189 invariants(bool is_root = false) const override;
190
192 makeFullInner(Slice data, SHAMapHash const& hash, bool hashValid);
193
196};
197
198inline bool
200{
201 return isBranch_ == 0;
202}
203
204inline bool
206{
207 return (isBranch_ & (1 << m)) == 0;
208}
209
210inline int
212{
213 return popcnt16(isBranch_);
214}
215
216inline bool
218{
219 return fullBelowGen_ == generation;
220}
221
222inline void
224{
225 fullBelowGen_ = gen;
226}
227
228} // namespace ripple
229#endif
Tracks the number of instances of an object.
std::uint32_t fullBelowGen_
bool isInner() const override
Determines if this is an inner node.
void shareChild(int m, std::shared_ptr< SHAMapTreeNode > const &child)
std::optional< int > getChildIndex(int i) const
Get the child's index inside the hashes or children array (stored in hashesAndChildren_.
std::shared_ptr< SHAMapTreeNode > clone(std::uint32_t cowid) const override
Make a copy of this node, setting the owner.
static constexpr unsigned int branchFactor
Each inner node has 16 children (the 'radix tree' part of the map)
std::shared_ptr< SHAMapTreeNode > getChild(int branch)
bool isFullBelow(std::uint32_t generation) const
bool isEmptyBranch(int m) const
void iterNonEmptyChildIndexes(F &&f) const
Call the f callback for all non-empty branches.
void serializeWithPrefix(Serializer &) const override
Serialize the node in a format appropriate for hashing.
void iterChildren(F &&f) const
Call the f callback for all 16 (branchFactor) branches - even if the branch is empty.
void resizeChildArrays(std::uint8_t toAllocate)
Convert arrays stored in hashesAndChildren_ so they can store the requested number of children.
bool isLeaf() const override
Determines if this is a leaf node.
void updateHash() override
Recalculate the hash of this node.
static std::shared_ptr< SHAMapTreeNode > makeCompressedInner(Slice data)
void setChild(int m, std::shared_ptr< SHAMapTreeNode > child)
SHAMapHash const & getChildHash(int m) const
void invariants(bool is_root=false) const override
std::string getString(SHAMapNodeID const &) const override
SHAMapInnerNode & operator=(SHAMapInnerNode const &)=delete
SHAMapInnerNode(SHAMapInnerNode const &)=delete
TaggedPointer hashesAndChildren_
Opaque type that contains the hashes array (array of type SHAMapHash) and the children array (array o...
void setFullBelowGen(std::uint32_t gen)
void serializeForWire(Serializer &) const override
Serialize the node in a format appropriate for sending over the wire.
std::shared_ptr< SHAMapTreeNode > canonicalizeChild(int branch, std::shared_ptr< SHAMapTreeNode > node)
static std::shared_ptr< SHAMapTreeNode > makeFullInner(Slice data, SHAMapHash const &hash, bool hashValid)
SHAMapNodeType getType() const override
Determines the type of node.
void updateHashDeep()
Recalculate the hash of all children and this node.
SHAMapTreeNode * getChildPointer(int branch)
std::atomic< std::uint16_t > lock_
A bitlock for the children of this node, with one bit per child.
Identifies a node inside a SHAMap.
Definition: SHAMapNodeID.h:34
An immutable linear range of bytes.
Definition: Slice.h:45
TaggedPointer is a combination of a pointer and a mask stored in the lowest two bits.
Definition: TaggedPointer.h:60
std::uint32_t cowid() const
Returns the SHAMap that owns this node.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
int popcnt16(std::uint16_t a)