aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/bfc/node.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/bfc/node.h')
-rw-r--r--Src/Wasabi/bfc/node.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/Src/Wasabi/bfc/node.h b/Src/Wasabi/bfc/node.h
new file mode 100644
index 00000000..72850cbd
--- /dev/null
+++ b/Src/Wasabi/bfc/node.h
@@ -0,0 +1,118 @@
+#ifndef _NODE_H
+#define _NODE_H
+
+#include "ptrlist.h"
+
+//
+// node.h
+//
+// Some node classes.
+//
+
+
+
+// ==========================================================================
+//
+// class Node
+//
+// A generic "node" object from which one may subclass and create a set of
+// disparate objects that may be assembled into a hierarchical tree.
+//
+class Node {
+private:
+ PtrList<Node> childlist;
+ Node * parent;
+
+protected:
+
+#ifdef _DEBUG
+ static int count;
+#endif//_DEBUG
+
+public:
+
+ Node(Node * myParent = NULL) : childlist(), parent(myParent) {
+#ifdef _DEBUG
+ count++;
+#endif//_DEBUG
+ }
+
+ Node(const Node & a) : childlist(a.childlist), parent(a.parent) {
+#ifdef _DEBUG
+ count++;
+#endif//_DEBUG
+ }
+
+ virtual ~Node() {
+#ifdef _DEBUG
+ count--;
+#endif//_DEBUG
+ };
+
+ int nodeCount() {
+#ifdef _DEBUG
+ return count;
+#else //_DEBUG
+ return -1;
+#endif//_DEBUG
+ }
+
+ //
+ // Const Data Accessor Methods
+ int getNumChildren() const {
+ return childlist.getNumItems();
+ }
+
+ Node * enumChild(int index) const {
+ return childlist[index];
+ }
+
+ Node * getParent() const {
+ return parent;
+ }
+
+ //
+ // Nonconst Data Manipulator Methods
+ Node * addChild(Node * child) {
+ child->setParent(this);
+ return childlist.addItem(child);
+ }
+
+ Node * setParent(Node * myParent) {
+ return parent = myParent;
+ }
+
+ PtrList< Node > & ChildList() {
+ return childlist;
+ }
+};
+
+// ==========================================================================
+//
+// class NodeC< TPayload >
+//
+// If you would rather use Node as a container class than as a base class,
+// this object will allow you to contain a payload instance and be accessed
+// as if it were the payload instance using a reference operator and an
+// implicit cast operator.
+//
+template < class TPayload >
+class NodeC : public Node {
+protected:
+ TPayload payload;
+public:
+ NodeC( const TPayload & myPayload, NodeC * myParent = NULL ) : Node( myParent ), payload( myPayload ) {}
+ NodeC( const NodeC & a ) : Node( a ), payload( a.payload ) {}
+
+ //
+ // In addition to being able to call all of the Node methods, you can also
+ // simply treat the node objects themselves as if they were the payload
+ // instantiation through these simple methods:
+
+ // Explicit reference operator - for lvalues and force rvalues.
+ TPayload & operator () ( void ) { return payload; }
+ // Implicit cast operator - for rvalues that can accept a TPayload &
+ operator TPayload & ( void ) { return payload; }
+};
+
+#endif//_NODE_H