Files
xahaud/modules/ripple_app/shamap/ripple_SHAMapNode.h
2013-07-23 18:47:02 -07:00

118 lines
2.6 KiB
C++

//------------------------------------------------------------------------------
/*
Copyright (c) 2011-2013, OpenCoin, Inc.
*/
//==============================================================================
#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