Add static node factory methods to class Node

This commit is contained in:
Tom Henderson
2007-03-19 22:19:38 -07:00
parent a0f6d0c326
commit b9e6974c8e
3 changed files with 104 additions and 5 deletions

View File

@@ -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 @@ Node::SetSystemId(uint32_t s )
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
{