31 #include "IPMStream.h" 42 bool16 DV_ operator ==(
const NodeID& a,
const NodeID& b);
43 bool16 DV_ operator !=(
const NodeID& a,
const NodeID& b);
46 bool16 DV_ operator <=(
const NodeID& a,
const NodeID& b);
47 bool16 DV_ operator >=(
const NodeID& a,
const NodeID& b);
59 typedef int32 NodeType;
61 virtual NodeType GetNodeType()
const = 0;
65 virtual void Write(
IPMStream* stream)
const = 0;
70 virtual PMString GetDescription()
const {
return PMString(
"Override NodeID::GetDescription() to provide useful information here"); };
97 ~
NodeID_rv() { ASSERT_MSG(fNodeID == nil,
"NodeID_rv::fNodeID should be nil, NodeID_rv should only be used as a return value, and it should always Relinquish() it's NodeIDClass*. Otherwise we'll leak."); };
102 NodeID_rv(
NodeID_rv && other) noexcept : fNodeID(other.fNodeID) { other.fNodeID = nil; }
107 NodeIDClass* Relinquish()
const noexcept {
NodeIDClass* tempNodeID = fNodeID; fNodeID = nil;
return tempNodeID; }
108 NodeIDClass* Get()
const noexcept {
return fNodeID; }
123 NodeID() : fNodeID(nil) {}
125 NodeID(
const NodeID_rv& tempNodeID) { fNodeID = tempNodeID.Relinquish(); }
128 fNodeID(other.fNodeID)
132 NodeID(
NodeID_rv&& tempNodeID) noexcept { fNodeID = tempNodeID.Relinquish(); }
134 ~
NodeID() {
if (fNodeID) {
delete fNodeID; } }
136 NodeIDClass::NodeType GetNodeType()
const {
if (fNodeID)
return fNodeID->GetNodeType();
else return 0; }
137 bool16 IsValid()
const {
return fNodeID != nil; }
148 std::swap(a.fNodeID, b.fNodeID);
164 virtual PMString GetDescription()
const {
return fNodeID ? fNodeID->GetDescription() :
""; };
166 static void SetNodeIDTemplate(
const NodeID& templateNode );
167 static void ClearNodeIDTemplate( );
172 friend bool16 operator ==(
const NodeID& a,
const NodeID& b);
173 friend bool16 operator !=(
const NodeID& a,
const NodeID& b);
174 friend bool16 operator <(
const NodeID& a,
const NodeID& b);
175 friend bool16 operator >(
const NodeID& a,
const NodeID& b);
176 friend bool16 operator <=(
const NodeID& a,
const NodeID& b);
177 friend bool16 operator >=(
const NodeID& a,
const NodeID& b);
185 extern DV_
NodeID kInvalidNodeID;
190 inline NodeID_rv::NodeID_rv(
const NodeID& nodeID)
192 fNodeID = nodeID.Get() != nil ? nodeID.Get()->Clone() : nil;
196 template <
class TNode>
202 explicit TreeNodePtr(
const NodeID& nodeID) { fNodeClass = TNode::kNodeType == nodeID.GetNodeType() ?
static_cast<TNode*
>(nodeID.Get()) : nil; }
203 explicit TreeNodePtr(
const NodeID_rv& nodeID) { fNodeClass = TNode::kNodeType ==
static_cast<TNode*
>(nodeID.Get())->GetNodeType() ?
static_cast<TNode*
>(nodeID.Relinquish()) : nil; }
206 TNode* operator->()
const { ASSERT_MSG(fNodeClass,
"About to use nil TreeNodePtr!");
return fNodeClass; }
207 operator TNode*()
const {
return fNodeClass; }
209 void reset(
const NodeID& nodeID) { fNodeClass =
static_cast<TNode*
>(nodeID.Get()); }