From 09011a62c843d5756291328c2042f7cc5f59dcff Mon Sep 17 00:00:00 2001
From: Kyle K <kylek389@gmail.com>
Date: Wed, 11 Apr 2012 20:58:40 -0500
Subject: initial commit

---
 node.h | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 119 insertions(+)
 create mode 100644 node.h

(limited to 'node.h')

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
+
-- 
cgit v1.2.3