src/core/object-names.cc
author Craig Dowell <craigdo@ee.washington.edu>
Tue, 20 Jan 2009 15:47:14 -0800
changeset 4139 d45e62c78504
child 4141 3f7f08d9daad
permissions -rw-r--r--
add an object name service
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     1
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     2
/*
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     3
 * Copyright (c) 2009 University of Washington
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     4
 *
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     8
 *
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    12
 * GNU General Public License for more details.
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    13
 *
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    17
 */
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    18
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    19
#include <map>
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    20
#include "ns3/object.h"
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    21
#include "ns3/log.h"
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    22
#include "ns3/assert.h"
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    23
#include "ns3/abort.h"
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    24
#include "ns3/simulator.h"
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    25
#include "object-names.h"
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    26
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    27
namespace ns3 {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    28
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    29
NS_LOG_COMPONENT_DEFINE ("Names");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    30
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    31
class NameNode
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    32
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    33
public:
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    34
  NameNode ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    35
  NameNode (const NameNode &nameNode);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    36
  NameNode (NameNode *parent, std::string name, Ptr<Object> object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    37
  NameNode &operator = (const NameNode &rhs);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    38
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    39
 ~NameNode ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    40
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    41
  NameNode *m_parent;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    42
  std::string m_name;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    43
  Ptr<Object> m_object;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    44
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    45
  std::map<std::string, NameNode *> m_nameMap;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    46
};
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    47
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    48
NameNode::NameNode ()
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    49
  : m_parent (0), m_name (""), m_object (0)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    50
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    51
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    52
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    53
NameNode::NameNode (const NameNode &nameNode)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    54
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    55
  m_parent = nameNode.m_parent;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    56
  m_name = nameNode.m_name;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    57
  m_object = nameNode.m_object;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    58
  m_nameMap = nameNode.m_nameMap;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    59
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    60
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    61
NameNode &
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    62
NameNode::operator = (const NameNode &rhs)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    63
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    64
  m_parent = rhs.m_parent;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    65
  m_name = rhs.m_name;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    66
  m_object = rhs.m_object;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    67
  m_nameMap = rhs.m_nameMap;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    68
  return *this;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    69
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    70
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    71
NameNode::NameNode (NameNode *parent, std::string name, Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    72
  : m_parent (parent), m_name (name), m_object (object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    73
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    74
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    75
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    76
NameNode::~NameNode ()
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    77
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    78
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    79
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    80
class NamesPriv 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    81
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    82
public:
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    83
  NamesPriv ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    84
  ~NamesPriv ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    85
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    86
  bool Add (std::string name, Ptr<Object> obj);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    87
  bool Add (Ptr<Object> context, std::string name, Ptr<Object> object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    88
  bool Add (std::string context, std::string name, Ptr<Object> object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    89
  std::string FindShortName (Ptr<Object> object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    90
  std::string FindFullName (Ptr<Object> object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    91
  Ptr<Object> FindObjectFromFullName (std::string name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    92
  Ptr<Object> FindObjectFromShortName (Ptr<Object> context, std::string name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    93
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    94
  static NamesPriv *Get (void);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    95
  
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    96
private:
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    97
  static NamesPriv **DoGet (void);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    98
  static void Delete (void);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    99
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   100
  NameNode *IsNamed (Ptr<Object>);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   101
  bool IsDuplicateName (NameNode *node, std::string name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   102
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   103
  NameNode m_root;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   104
  std::map<Ptr<Object>, NameNode *> m_objectMap;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   105
};
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   106
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   107
NamesPriv *
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   108
NamesPriv::Get (void)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   109
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   110
  return *(DoGet ());
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   111
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   112
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   113
NamesPriv **
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   114
NamesPriv::DoGet (void)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   115
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   116
  static NamesPriv *ptr = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   117
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   118
  if (ptr == 0)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   119
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   120
      ptr = new NamesPriv;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   121
      Simulator::ScheduleDestroy (&NamesPriv::Delete);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   122
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   123
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   124
  return &ptr;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   125
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   126
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   127
void 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   128
NamesPriv::Delete (void)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   129
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   130
  NS_LOG_FUNCTION_NOARGS ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   131
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   132
  NamesPriv **ptr = DoGet ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   133
  delete *ptr;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   134
  *ptr = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   135
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   136
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   137
NamesPriv::NamesPriv ()
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   138
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   139
  NS_LOG_FUNCTION_NOARGS ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   140
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   141
  m_root.m_parent = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   142
  m_root.m_name = "Names";
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   143
  m_root.m_object = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   144
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   145
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   146
NamesPriv::~NamesPriv ()
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   147
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   148
  NS_LOG_FUNCTION_NOARGS ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   149
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   150
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   151
  // Every name is associated with an object in the object map, so freeing the
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   152
  // NameNodes in this map will free all of the memory allocated for the NameNodes
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   153
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   154
  for (std::map<Ptr<Object>, NameNode *>::iterator i = m_objectMap.begin (); i != m_objectMap.end (); ++i)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   155
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   156
      delete i->second;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   157
      i->second = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   158
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   159
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   160
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   161
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   162
NamesPriv::Add (std::string name, Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   163
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   164
  return Add (Ptr<Object> (0, false), name, object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   165
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   166
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   167
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   168
NamesPriv::Add (Ptr<Object> context, std::string name, Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   169
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   170
  NS_LOG_FUNCTION (context << name << object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   171
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   172
  if (IsNamed (object))
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   173
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   174
      NS_LOG_LOGIC ("Object is already named");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   175
      return false;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   176
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   177
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   178
  NameNode *node = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   179
  if (context)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   180
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   181
      node = IsNamed (context);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   182
      NS_ASSERT_MSG (node, "NamesPriv::Name(): context must point to a previously named node");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   183
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   184
  else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   185
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   186
      node = &m_root;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   187
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   188
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   189
  if (IsDuplicateName (node, name))
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   190
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   191
      NS_LOG_LOGIC ("Name is already taken");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   192
      return false;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   193
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   194
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   195
  NameNode *newNode = new NameNode(node, name, object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   196
  node->m_nameMap[name] = newNode;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   197
  m_objectMap[object] = newNode;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   198
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   199
  return true;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   200
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   201
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   202
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   203
NamesPriv::Add (std::string context, std::string name, Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   204
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   205
  if (context == "/Names")
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   206
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   207
      return Add (name, object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   208
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   209
  return Add (FindObjectFromFullName (context), name, object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   210
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   211
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   212
std::string
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   213
NamesPriv::FindShortName (Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   214
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   215
  NS_LOG_FUNCTION (object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   216
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   217
  std::map<Ptr<Object>, NameNode *>::iterator i = m_objectMap.find (object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   218
  if (i == m_objectMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   219
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   220
      NS_LOG_LOGIC ("Object does not exist in object map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   221
      return "";
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   222
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   223
  else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   224
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   225
      NS_LOG_LOGIC ("Object exists in object map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   226
      return i->second->m_name;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   227
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   228
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   229
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   230
std::string
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   231
NamesPriv::FindFullName (Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   232
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   233
  NS_LOG_FUNCTION (object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   234
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   235
  std::map<Ptr<Object>, NameNode *>::iterator i = m_objectMap.find (object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   236
  if (i == m_objectMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   237
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   238
      NS_LOG_LOGIC ("Object does not exist in object map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   239
      return "";
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   240
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   241
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   242
  NameNode *p = i->second;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   243
  NS_ASSERT_MSG (p, "NamesPriv::FindFullName(): Internal error: Invalid NameNode pointer from map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   244
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   245
  std::string fullname;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   246
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   247
  do
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   248
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   249
      fullname = "/" + p->m_name + fullname;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   250
      NS_LOG_LOGIC ("fullname is " << fullname);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   251
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   252
  while ((p = p->m_parent) != 0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   253
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   254
  return fullname;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   255
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   256
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   257
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   258
Ptr<Object>
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   259
NamesPriv::FindObjectFromFullName (std::string name)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   260
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   261
  std::string namespaceName = "/Names/";
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   262
  std::string::size_type offset = name.find (namespaceName);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   263
  if (offset == std::string::npos)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   264
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   265
      NS_LOG_LOGIC (name << " is not in the " << namespaceName << " name space");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   266
      return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   267
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   268
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   269
  std::string remaining = name.substr (namespaceName.size ());
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   270
  NameNode *node = &m_root;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   271
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   272
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   273
  // remaining is now composed entirely of path segments in the /Names name space.
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   274
  // and we have eaten the leading slash. e.g., remaining = "ClientNode/eth0"
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   275
  // The start of the search is at the root of the name space.
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   276
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   277
  for (;;)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   278
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   279
      NS_LOG_LOGIC ("Looking for the object of name " << remaining);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   280
      offset = remaining.find ("/");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   281
      if (offset == std::string::npos)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   282
        {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   283
          //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   284
          // There are no remaining slashes so this is the last segment of the 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   285
          // specified name.  We're done when we find it
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   286
          //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   287
          std::map<std::string, NameNode *>::iterator i = node->m_nameMap.find (remaining);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   288
          if (i == node->m_nameMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   289
            {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   290
              NS_LOG_LOGIC ("Name does not exist in name map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   291
              return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   292
            }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   293
          else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   294
            {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   295
              NS_LOG_LOGIC ("Name parsed, found object");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   296
              return i->second->m_object;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   297
            }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   298
        }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   299
      else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   300
        {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   301
          //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   302
          // There are more slashes so this is an intermediate segment of the 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   303
          // specified name.  We need to "recurse" when we find this segment.
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   304
          //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   305
          offset = remaining.find ("/");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   306
          std::string segment = remaining.substr(0, offset);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   307
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   308
          std::map<std::string, NameNode *>::iterator i = node->m_nameMap.find (segment);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   309
          if (i == node->m_nameMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   310
            {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   311
              NS_LOG_LOGIC ("Name does not exist in name map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   312
              return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   313
            }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   314
          else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   315
            {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   316
              node = i->second;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   317
              remaining = remaining.substr (offset + 1);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   318
              NS_LOG_LOGIC ("Intermediate segment parsed");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   319
              continue;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   320
            }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   321
        }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   322
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   323
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   324
  NS_ASSERT_MSG (node, "NamesPriv::FindObjectFromFullName(): Internal error:  this can't happen");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   325
  return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   326
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   327
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   328
Ptr<Object>
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   329
NamesPriv::FindObjectFromShortName (Ptr<Object> context, std::string name)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   330
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   331
  NS_LOG_FUNCTION (context << name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   332
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   333
  NameNode *node = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   334
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   335
  if (context == 0)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   336
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   337
      NS_LOG_LOGIC ("Zero context implies root NameNode");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   338
      node = &m_root;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   339
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   340
  else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   341
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   342
      node = IsNamed (context);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   343
      if (node == 0)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   344
        {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   345
          NS_LOG_LOGIC ("Context does not point to a previously named node");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   346
          return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   347
        }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   348
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   349
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   350
  std::map<std::string, NameNode *>::iterator i = node->m_nameMap.find (name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   351
  if (i == node->m_nameMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   352
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   353
      NS_LOG_LOGIC ("Name does not exist in name map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   354
      return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   355
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   356
  else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   357
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   358
      NS_LOG_LOGIC ("Name exists in name map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   359
      return i->second->m_object;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   360
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   361
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   362
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   363
NameNode *
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   364
NamesPriv::IsNamed (Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   365
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   366
  NS_LOG_FUNCTION (object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   367
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   368
  std::map<Ptr<Object>, NameNode *>::iterator i = m_objectMap.find (object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   369
  if (i == m_objectMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   370
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   371
      NS_LOG_LOGIC ("Object does not exist in object map, returning NameNode 0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   372
      return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   373
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   374
  else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   375
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   376
      NS_LOG_LOGIC ("Object exists in object map, returning NameNode " << &i->second);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   377
      return i->second;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   378
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   379
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   380
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   381
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   382
NamesPriv::IsDuplicateName (NameNode *node, std::string name)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   383
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   384
  NS_LOG_FUNCTION (node << name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   385
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   386
  std::map<std::string, NameNode *>::iterator i = node->m_nameMap.find (name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   387
  if (i == node->m_nameMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   388
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   389
      NS_LOG_LOGIC ("Name does not exist in name map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   390
      return false;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   391
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   392
  else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   393
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   394
      NS_LOG_LOGIC ("Name exists in name map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   395
      return true;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   396
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   397
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   398
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   399
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   400
Names::Add (std::string name, Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   401
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   402
  return NamesPriv::Get ()->Add (name, object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   403
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   404
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   405
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   406
Names::Add (Ptr<Object> context, std::string name, Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   407
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   408
  return NamesPriv::Get ()->Add (context, name, object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   409
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   410
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   411
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   412
Names::Add (std::string context, std::string name, Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   413
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   414
  return NamesPriv::Get ()->Add (context, name, object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   415
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   416
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   417
std::string
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   418
Names::FindShortName (Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   419
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   420
  return NamesPriv::Get ()->FindShortName (object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   421
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   422
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   423
std::string
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   424
Names::FindFullName (Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   425
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   426
  return NamesPriv::Get ()->FindFullName (object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   427
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   428
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   429
Ptr<Object>
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   430
Names::FindObjectFromFullNameInternal (std::string name)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   431
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   432
  return NamesPriv::Get ()->FindObjectFromFullName (name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   433
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   434
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   435
Ptr<Object>
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   436
Names::FindObjectFromShortNameInternal (Ptr<Object> context, std::string name)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   437
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   438
  return NamesPriv::Get ()->FindObjectFromShortName (context, name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   439
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   440
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   441
} //namespace ns3
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   442
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   443
#ifdef RUN_SELF_TESTS
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   444
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   445
#include "test.h"
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   446
#include "object-factory.h"
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   447
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   448
namespace ns3 {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   449
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   450
class TestObject : public Object
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   451
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   452
public:
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   453
  static TypeId GetTypeId (void) 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   454
  {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   455
    static TypeId tid = TypeId ("TestObject")
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   456
      .SetParent (Object::GetTypeId ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   457
      .HideFromDocumentation ()
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   458
      .AddConstructor<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   459
    return tid;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   460
  }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   461
  TestObject () {}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   462
  virtual void Dispose (void) {}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   463
};
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   464
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   465
class NamesTest : public Test
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   466
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   467
public:
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   468
  NamesTest ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   469
  virtual bool RunTests (void);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   470
};
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   471
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   472
NamesTest::NamesTest ()
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   473
  : Test ("Names")
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   474
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   475
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   476
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   477
bool 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   478
NamesTest::RunTests (void)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   479
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   480
  bool result = true;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   481
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   482
  // 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   483
  // Name a couple of objects at the root level
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   484
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   485
  Ptr<TestObject> client = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   486
  result = Names::Add ("Client", client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   487
  NS_TEST_ASSERT_EQUAL (result, true);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   488
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   489
  Ptr<TestObject> server = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   490
  result = Names::Add ("Server", server);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   491
  NS_TEST_ASSERT_EQUAL (result, true);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   492
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   493
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   494
  // We shouldn't be able to add another name to a previously named object
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   495
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   496
  result = Names::Add ("Not Client", client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   497
  NS_TEST_ASSERT_EQUAL (result, false);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   498
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   499
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   500
  // We shouldn't be able to duplicate a name at the root level.
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   501
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   502
  Ptr<TestObject> secondClient = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   503
  result = Names::Add ("Client", secondClient);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   504
  NS_TEST_ASSERT_EQUAL (result, false);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   505
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   506
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   507
  // We should be able to add a new name in the first object's context
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   508
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   509
  Ptr<TestObject> clientEth0 = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   510
  result = Names::Add (client, "eth0", clientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   511
  NS_TEST_ASSERT_EQUAL (result, true);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   512
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   513
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   514
  // We shouldn't be able to duplicate a name in that context.
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   515
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   516
  Ptr<TestObject> secondClientEth0 = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   517
  result = Names::Add (client, "eth0", secondClientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   518
  NS_TEST_ASSERT_EQUAL (result, false);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   519
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   520
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   521
  // We should be able to add the same name in the second object's context
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   522
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   523
  Ptr<TestObject> serverEth0 = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   524
  result = Names::Add (server, "eth0", serverEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   525
  NS_TEST_ASSERT_EQUAL (result, true);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   526
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   527
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   528
  // We should be able to find the short names for the objects we created
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   529
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   530
  std::string found;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   531
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   532
  found = Names::FindShortName (client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   533
  NS_TEST_ASSERT_EQUAL (found, "Client");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   534
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   535
  found = Names::FindShortName (server);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   536
  NS_TEST_ASSERT_EQUAL (found, "Server");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   537
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   538
  found = Names::FindShortName (clientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   539
  NS_TEST_ASSERT_EQUAL (found, "eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   540
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   541
  found = Names::FindShortName (serverEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   542
  NS_TEST_ASSERT_EQUAL (found, "eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   543
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   544
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   545
  // We should be able to find the full names for the objects we created
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   546
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   547
  found = Names::FindFullName (client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   548
  NS_TEST_ASSERT_EQUAL (found, "/Names/Client");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   549
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   550
  found = Names::FindFullName (server);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   551
  NS_TEST_ASSERT_EQUAL (found, "/Names/Server");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   552
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   553
  found = Names::FindFullName (clientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   554
  NS_TEST_ASSERT_EQUAL (found, "/Names/Client/eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   555
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   556
  found = Names::FindFullName (serverEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   557
  NS_TEST_ASSERT_EQUAL (found, "/Names/Server/eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   558
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   559
  // 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   560
  // We should be able to find the objects from the short names
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   561
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   562
  Ptr<TestObject> foundObject;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   563
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   564
  foundObject = Names::FindObjectFromShortName<TestObject> (0, "Client");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   565
  NS_TEST_ASSERT_EQUAL (foundObject, client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   566
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   567
  foundObject = Names::FindObjectFromShortName<TestObject> (0, "Server");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   568
  NS_TEST_ASSERT_EQUAL (foundObject, server);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   569
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   570
  foundObject = Names::FindObjectFromShortName<TestObject> (client, "eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   571
  NS_TEST_ASSERT_EQUAL (foundObject, clientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   572
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   573
  foundObject = Names::FindObjectFromShortName<TestObject> (server, "eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   574
  NS_TEST_ASSERT_EQUAL (foundObject, serverEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   575
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   576
  // 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   577
  // We should be able to find the objects from their full names
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   578
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   579
  foundObject = Names::Find<TestObject> ("/Names/Client");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   580
  NS_TEST_ASSERT_EQUAL (foundObject, client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   581
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   582
  foundObject = Names::Find<TestObject> ("/Names/Server");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   583
  NS_TEST_ASSERT_EQUAL (foundObject, server);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   584
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   585
  foundObject = Names::Find<TestObject> ("/Names/Client/eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   586
  NS_TEST_ASSERT_EQUAL (foundObject, clientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   587
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   588
  foundObject = Names::Find<TestObject> ("/Names/Server/eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   589
  NS_TEST_ASSERT_EQUAL (foundObject, serverEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   590
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   591
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   592
  // We also have some syntactical sugary methods, so make sure they do what
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   593
  // they should as well.
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   594
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   595
  Ptr<TestObject> bridge = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   596
  result = Names::Add ("/Names", "Bridge", client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   597
  NS_TEST_ASSERT_EQUAL (result, true);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   598
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   599
  Ptr<TestObject> bridgeEth0 = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   600
  result = Names::Add ("/Names/Bridge", "eth0", bridgeEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   601
  NS_TEST_ASSERT_EQUAL (result, true);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   602
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   603
  foundObject = Names::Find<TestObject> ("/Names/Bridge");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   604
  NS_TEST_ASSERT_EQUAL (foundObject, bridge);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   605
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   606
  foundObject = Names::Find<TestObject> ("/Names/Bridge/eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   607
  NS_TEST_ASSERT_EQUAL (foundObject, bridgeEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   608
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   609
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   610
  // Run the simulator and destroy it to get the Destroy method called on the
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   611
  // private implementation object.  We depend on seeing a valgrind-clean run of
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   612
  // the unit tests to really determine if the clean up was really successful.
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   613
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   614
  Simulator::Run ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   615
  Simulator::Destroy ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   616
  
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   617
  return true;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   618
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   619
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   620
static NamesTest g_namesTests;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   621
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   622
} // namespace ns3
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   623
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   624
#endif /* RUN_SELF_TESTS */