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/SHAMapNodeID.h>
24#include <xrpld/shamap/SHAMapTreeNode.h>
25#include <xrpld/shamap/detail/TaggedPointer.h>
26
27#include <atomic>
28#include <cstdint>
29#include <optional>
30#include <string>
31
32namespace ripple {
33
34class SHAMapInnerNode final : public SHAMapTreeNode,
35 public CountedObject<SHAMapInnerNode>
36{
37public:
39 static inline constexpr unsigned int branchFactor = 16;
40
41private:
47
50
53
64 void
66
76 getChildIndex(int i) const;
77
84 template <class F>
85 void
86 iterChildren(F&& f) const;
87
95 template <class F>
96 void
97 iterNonEmptyChildIndexes(F&& f) const;
98
99public:
100 explicit SHAMapInnerNode(
102 std::uint8_t numAllocatedChildren = 2);
103
106 operator=(SHAMapInnerNode const&) = delete;
108
110 clone(std::uint32_t cowid) const override;
111
113 getType() const override
114 {
116 }
117
118 bool
119 isLeaf() const override
120 {
121 return false;
122 }
123
124 bool
125 isInner() const override
126 {
127 return true;
128 }
129
130 bool
131 isEmpty() const;
132
133 bool
134 isEmptyBranch(int m) const;
135
136 int
137 getBranchCount() const;
138
139 SHAMapHash const&
140 getChildHash(int m) const;
141
142 void
144
145 void
146 shareChild(int m, std::shared_ptr<SHAMapTreeNode> const& child);
147
149 getChildPointer(int branch);
150
152 getChild(int branch);
153
156
157 // sync functions
158 bool
159 isFullBelow(std::uint32_t generation) const;
160
161 void
163
164 void
165 updateHash() override;
166
168 void
170
171 void
172 serializeForWire(Serializer&) const override;
173
174 void
175 serializeWithPrefix(Serializer&) const override;
176
178 getString(SHAMapNodeID const&) const override;
179
180 void
181 invariants(bool is_root = false) const override;
182
184 makeFullInner(Slice data, SHAMapHash const& hash, bool hashValid);
185
188};
189
190inline bool
192{
193 return isBranch_ == 0;
194}
195
196inline bool
198{
199 return (isBranch_ & (1 << m)) == 0;
200}
201
202inline int
204{
205 return popcnt16(isBranch_);
206}
207
208inline bool
210{
211 return fullBelowGen_ == generation;
212}
213
214inline void
216{
217 fullBelowGen_ = gen;
218}
219
220} // namespace ripple
221#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:46
TaggedPointer is a combination of a pointer and a mask stored in the lowest two bits.
Definition: TaggedPointer.h:59
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)