summaryrefslogtreecommitdiffstats
path: root/node.h
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2012-04-11 20:58:40 -0500
committerKyle Kaminski <kyle@kkaminsk.com>2012-04-11 20:58:40 -0500
commit09011a62c843d5756291328c2042f7cc5f59dcff (patch)
tree44b66e969cb7c4256fc178749be8cdc0a66343c3 /node.h
downloadbst++-master.tar.gz
bst++-master.tar.bz2
bst++-master.zip
initial commitHEADmaster
Diffstat (limited to 'node.h')
-rw-r--r--node.h119
1 files changed, 119 insertions, 0 deletions
diff --git a/node.h b/node.h
new file mode 100644
index 0000000..94ef4e0
--- /dev/null
+++ b/node.h
@@ -0,0 +1,119 @@
+/* definitions are residing in this header since that's how templates get
+ * expanded, we could have a separate node.cpp is compiler supports export keyword,
+ * instantiations of code are compiled along with the translation units that spawn them
+ */
+
+#ifndef _MYNODE_H_
+#define _MYNODE_H_
+
+#include <cstdio>
+
+template <class T>
+class Node
+{
+ public:
+ Node();
+ Node(const Node &);
+ Node& operator=(const Node &);
+ Node(T);
+ Node(T &);
+ ~Node();
+
+ T getVal(void) const;
+ void setVal(T);
+ void setLeft(const Node *);
+ void setRight(const Node *);
+ Node<T>& getLeft(void) const;
+ Node<T>& getRight(void) const;
+
+ private:
+ T v;
+ Node *left;
+ Node *right;
+
+ protected:
+};
+
+template <class T>
+Node<T>::Node() : v(0), left(NULL), right(NULL)
+{
+}
+
+template <class T>
+Node<T>::Node(const Node& n)
+{
+ this->v = n.v;
+ this->left = n.left;
+ this->right = n.right;
+}
+
+template <class T>
+Node<T>& Node<T>::operator=(const Node &rhs)
+{
+ /* don't assign same object */
+ if (this == &rhs) /* rhs is a rvalue, hence take addr of it */
+ return *this;
+
+ this->v = rhs.v;
+ /* these also will assign subtrees, use it wisely? */
+ this->left = rhs.left;
+ this->right = rhs.right;
+
+ return *this;
+}
+
+template <class T>
+Node<T>::Node(T n) : left(NULL), right(NULL)
+{
+ this->v = n;
+}
+
+template <class T>
+Node<T>::Node(T& n) : left(NULL), right(NULL)
+{
+ this->v = n;
+}
+
+template <class T>
+Node<T>::~Node()
+{
+}
+
+template <class T>
+T Node<T>::getVal(void) const
+{
+ return (this->v);
+}
+
+template <class T>
+void Node<T>::setVal(T v)
+{
+ this->v = v;
+}
+
+template <class T>
+void Node<T>::setLeft(const Node *n)
+{
+ this->left = const_cast<Node<T> *>(n);
+}
+
+template <class T>
+void Node<T>::setRight(const Node *n)
+{
+ this->right = const_cast<Node<T> *>(n);
+}
+
+template <class T>
+Node<T>& Node<T>::getLeft(void) const
+{
+ return *(this->left);
+}
+
+template <class T>
+Node<T>& Node<T>::getRight(void) const
+{
+ return *(this->right);
+}
+
+#endif
+