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 <xrpl/basics/IntrusivePointer.h>
24#include <xrpl/shamap/SHAMapNodeID.h>
25#include <xrpl/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
109 // Needed to support intrusive weak pointers
110 void
111 partialDestructor() override;
112
114 clone(std::uint32_t cowid) const override;
115
117 getType() const override
118 {
120 }
121
122 bool
123 isLeaf() const override
124 {
125 return false;
126 }
127
128 bool
129 isInner() const override
130 {
131 return true;
132 }
133
134 bool
135 isEmpty() const;
136
137 bool
138 isEmptyBranch(int m) const;
139
140 int
141 getBranchCount() const;
142
143 SHAMapHash const&
144 getChildHash(int m) const;
145
146 void
148
149 void
151
153 getChildPointer(int branch);
154
156 getChild(int branch);
157
160
161 // sync functions
162 bool
163 isFullBelow(std::uint32_t generation) const;
164
165 void
167
168 void
169 updateHash() override;
170
172 void
174
175 void
176 serializeForWire(Serializer&) const override;
177
178 void
179 serializeWithPrefix(Serializer&) const override;
180
182 getString(SHAMapNodeID const&) const override;
183
184 void
185 invariants(bool is_root = false) const override;
186
188 makeFullInner(Slice data, SHAMapHash const& hash, bool hashValid);
189
192};
193
194inline bool
196{
197 return isBranch_ == 0;
198}
199
200inline bool
202{
203 return (isBranch_ & (1 << m)) == 0;
204}
205
206inline int
211
212inline bool
214{
215 return fullBelowGen_ == generation;
216}
217
218inline void
223
224} // namespace ripple
225#endif
Tracks the number of instances of an object.
bool isInner() const override
Determines if this is an inner node.
std::optional< int > getChildIndex(int i) const
Get the child's index inside the hashes or children array (stored in hashesAndChildren_.
void setChild(int m, intr_ptr::SharedPtr< SHAMapTreeNode > child)
static intr_ptr::SharedPtr< SHAMapTreeNode > makeCompressedInner(Slice data)
intr_ptr::SharedPtr< 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)
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.
intr_ptr::SharedPtr< SHAMapTreeNode > getChild(int branch)
void partialDestructor() override
void shareChild(int m, intr_ptr::SharedPtr< SHAMapTreeNode > const &child)
SHAMapHash const & getChildHash(int m) const
void invariants(bool is_root=false) const override
std::string getString(SHAMapNodeID const &) const override
intr_ptr::SharedPtr< SHAMapTreeNode > canonicalizeChild(int branch, intr_ptr::SharedPtr< SHAMapTreeNode > node)
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.
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.
static intr_ptr::SharedPtr< SHAMapTreeNode > makeFullInner(Slice data, SHAMapHash const &hash, bool hashValid)
Identifies a node inside a SHAMap.
A shared intrusive pointer class that supports weak pointers.
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.
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:25
int popcnt16(std::uint16_t a)