Files
rippled/src/cpp/ripple/ripple_SHAMapNode.h
2013-06-09 11:26:18 -07:00

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