mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
68 lines
2.0 KiB
C++
68 lines
2.0 KiB
C++
#ifndef RIPPLE_SHAMAPNODE_H
|
|
#define RIPPLE_SHAMAPNODE_H
|
|
|
|
// Identifies a node in a SHA256 hash map
|
|
class SHAMapNode
|
|
{
|
|
public:
|
|
SHAMapNode() : mDepth(0), mHash(0) { ; }
|
|
SHAMapNode(int depth, uint256 const& hash);
|
|
|
|
int getDepth() const { return mDepth; }
|
|
uint256 const& getNodeID() const { return mNodeID; }
|
|
bool isValid() const { return (mDepth >= 0) && (mDepth < 64); }
|
|
bool isRoot() const { return mDepth == 0; }
|
|
size_t getMHash() const { if (mHash == 0) setMHash(); return mHash; }
|
|
|
|
virtual bool isPopulated() const { return false; }
|
|
|
|
SHAMapNode getParentNodeID() const
|
|
{
|
|
assert(mDepth);
|
|
return SHAMapNode(mDepth - 1, mNodeID);
|
|
}
|
|
|
|
SHAMapNode getChildNodeID(int m) const;
|
|
int selectBranch(uint256 const& hash) const;
|
|
|
|
bool operator<(const SHAMapNode&) const;
|
|
bool operator>(const SHAMapNode&) const;
|
|
bool operator<=(const SHAMapNode&) const;
|
|
bool operator>=(const SHAMapNode&) const;
|
|
|
|
bool operator==(const SHAMapNode& n) const { return (mDepth == n.mDepth) && (mNodeID == n.mNodeID); }
|
|
bool operator==(uint256 const& n) const { return n == mNodeID; }
|
|
bool operator!=(const SHAMapNode& n) const { return (mDepth != n.mDepth) || (mNodeID != n.mNodeID); }
|
|
bool operator!=(uint256 const& n) const { return n != mNodeID; }
|
|
|
|
virtual std::string getString() const;
|
|
void dump() const;
|
|
|
|
static bool ClassInit();
|
|
static uint256 getNodeID(int depth, uint256 const& hash);
|
|
|
|
// Convert to/from wire format (256-bit nodeID, 1-byte depth)
|
|
void addIDRaw(Serializer &s) const;
|
|
std::string getRawString() const;
|
|
static int getRawIDLength(void) { return 33; }
|
|
SHAMapNode(const void *ptr, int len);
|
|
|
|
protected:
|
|
SHAMapNode(int depth, uint256 const& id, bool) : mNodeID(id), mDepth(depth), mHash(0) { ; }
|
|
|
|
private:
|
|
static uint256 smMasks[65]; // AND with hash to get node id
|
|
|
|
uint256 mNodeID;
|
|
int mDepth;
|
|
mutable size_t mHash;
|
|
|
|
void setMHash() const;
|
|
};
|
|
|
|
extern std::size_t hash_value(const SHAMapNode& mn);
|
|
|
|
inline std::ostream& operator<<(std::ostream& out, const SHAMapNode& node) { return out << node.getString(); }
|
|
|
|
#endif
|