src/node/node.cc
changeset 355 d18da75542c7
parent 244 caff04d90a66
child 358 cefde4f0d6b2
--- a/src/node/node.cc	Mon Mar 19 21:13:06 2007 -0700
+++ b/src/node/node.cc	Mon Mar 19 22:19:38 2007 -0700
@@ -23,15 +23,24 @@
 // George F. Riley, Georgia Tech, Fall 2006
 
 #include "node.h"
+#include "internet-node.h"
 
 namespace ns3{
 
-uint32_t Node::m_nodeId = 0;
+uint32_t Node::g_nextId = 0;
+Node::SmartNodeVec_t Node::g_prototypes;  // The node prototypes stack
+Node::SmartNodeVec_t Node::g_nodes;       // All nodes
 
 Node::Node()
-  : m_id(m_nodeId), m_sid(0)
+  : m_id(g_nextId), m_sid(0)
 {
-  m_nodeId++;
+  g_nextId++;
+}
+
+Node::Node(uint32_t sid)
+  : m_id(g_nextId), m_sid(sid)
+{ 
+  g_nextId++;
 }
   
 Node::~Node ()
@@ -55,6 +64,61 @@
   m_sid = s;
 }
 
+// Node stack creation and management routines.
+Node* Node::Create()
+{
+  if (g_prototypes.Empty()) CreateDefaultPrototype();
+  Node* n = g_prototypes.Back()->Copy(); // Copy the top of the stack
+  n->m_id = g_nextId++;                  // Set unique node id
+  g_nodes.Add(n);                        // Add to list of known nodes
+  return n;
+}
+
+Node* Node::Create(uint32_t sid)
+{ // Create with distributed simulation systemid
+  // ! Need to check if sid matches DistributedSimulator system id,
+  // and create an empty (ghost) node if so.  Code this later
+  Node* n = Create(sid);
+  return n;
+}
+
+Node* Node::GetNodePrototype()
+{ // Get node* to top of prototypes stack
+  if (g_prototypes.Empty()) CreateDefaultPrototype();
+  return g_prototypes.Back();
+}
+
+Node* Node::PushNodePrototype(const Node& n)
+{ // Add a new node to the top of the prototypes stack
+  g_prototypes.Add(n.Copy());
+  return g_prototypes.Back();
+}
+
+Node* Node::PushNodePrototype() 
+{ // Replicate the top of the prototype stack
+  if (g_prototypes.Empty()) CreateDefaultPrototype();
+  g_prototypes.Add(GetNodePrototype()->Copy());
+  return g_prototypes.Back();
+}
+
+void Node::PopNodePrototype()
+{ 
+  if (!g_prototypes.Empty()) g_prototypes.Remove();
+}
+
+void Node::ClearAll()
+{ // Delete all nodes for memory leak checking, including prototypes
+  g_nodes.Clear();
+  g_prototypes.Clear();
+}
+
+// Private method to ceate a reasonable default if stack is empty
+void Node::CreateDefaultPrototype()
+{
+  Node* n = new InternetNode();
+  g_prototypes.Add(n);
+}
+
 L3Demux*
 Node::GetL3Demux() const
 {