src/core/names.cc
author Craig Dowell <craigdo@ee.washington.edu>
Fri, 23 Jan 2009 15:18:40 -0800
changeset 4149 6a3dbc49cfa9
parent 4148 7f1a5bd869e5
child 4151 682a4cae7a5f
permissions -rw-r--r--
Alloc clients to omit /Names/ in Names::Find
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>
4145
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
    20
#include "object.h"
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
    21
#include "log.h"
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
    22
#include "assert.h"
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
    23
#include "abort.h"
4147
5d8530130930 rename object-names.{cc,h} to names.{cc,h} per convention
Craig Dowell <craigdo@ee.washington.edu>
parents: 4145
diff changeset
    24
#include "names.h"
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    25
#include "ns3/simulator.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);
4145
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
    95
  static void Delete (void);
4139
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    99
  NameNode *IsNamed (Ptr<Object>);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   100
  bool IsDuplicateName (NameNode *node, std::string name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   101
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   102
  NameNode m_root;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   103
  std::map<Ptr<Object>, NameNode *> m_objectMap;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   104
};
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
NamesPriv *
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   107
NamesPriv::Get (void)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   108
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   109
  return *(DoGet ());
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   110
}
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
NamesPriv **
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   113
NamesPriv::DoGet (void)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   114
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   115
  static NamesPriv *ptr = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   116
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   117
  if (ptr == 0)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   118
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   119
      ptr = new NamesPriv;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   120
      Simulator::ScheduleDestroy (&NamesPriv::Delete);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   121
    }
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
  return &ptr;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   124
}
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
void 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   127
NamesPriv::Delete (void)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   128
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   129
  NS_LOG_FUNCTION_NOARGS ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   130
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   131
  NamesPriv **ptr = DoGet ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   132
  delete *ptr;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   133
  *ptr = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   134
}
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
NamesPriv::NamesPriv ()
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   137
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   138
  NS_LOG_FUNCTION_NOARGS ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   140
  m_root.m_parent = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   141
  m_root.m_name = "Names";
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   142
  m_root.m_object = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   143
}
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
NamesPriv::~NamesPriv ()
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   146
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   147
  NS_LOG_FUNCTION_NOARGS ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   148
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
  // 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
   151
  // 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
   152
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   153
  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
   154
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   155
      delete i->second;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   156
      i->second = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   157
    }
4145
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
   158
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
   159
  m_root.m_parent = 0;
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
   160
  m_root.m_name = "";
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
   161
  m_root.m_object = 0;
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   162
}
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
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   165
NamesPriv::Add (std::string name, Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   166
{
4141
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   167
  NS_LOG_FUNCTION (name << object);
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   168
  //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   169
  // This is the simple, easy to use version of Add, so we want it to be flexible.
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   170
  //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   171
  // If we are provided a name that doesn't begin with "/Names", we assume 
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   172
  // that the caller has given us a shortname that she wants added to the root
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   173
  // namespace.  This results in a call to the "real" Add with context set to 
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   174
  // zero, indicating what we want to do.
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   175
  //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   176
  // If we are given a name that begins with "/Names/" we assume that this is a
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   177
  // fullname to the object we want to create.  We split the fullname into a 
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   178
  // context string and and a final segment and then call the "Real" Add.
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   179
  //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   180
  std::string namespaceName = "/Names";
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   181
  std::string::size_type offset = name.find (namespaceName);
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   182
  if (offset == 0)
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   183
    {
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   184
      //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   185
      // This must be a fully qualified longname.  All fully qualified names begin
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   186
      // with "/Names".  We have to split off the final segment which will become
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   187
      // the shortname of the object.
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   188
      //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   189
      std::string::size_type i = name.rfind ("/");
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   190
      NS_ASSERT_MSG (i != std::string::npos, "NamesPriv::Add(): Internal error.  Can't find '/' in name");
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   191
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   192
      //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   193
      // The slash we found cannot be the slash at the start of the namespaceName.
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   194
      // This would indicate there is no shortname in the path at all.
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   195
      //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   196
      NS_ASSERT_MSG (i != 0, "NamesPriv::Add(): Can't find a shortname in the name string");
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   197
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   198
      //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   199
      // We now know where the context string starts and ends, and where the
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   200
      // shortname starts and ends.  All we have to do is to call our available
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   201
      // function for creating addubg a shortname under a context string.
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   202
      //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   203
      return Add (name.substr (0, i), name.substr (i + 1), object);
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   204
    }
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   205
  else
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   206
    {
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   207
      //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   208
      // This must be a shortname.  Shortnames can't have ANY '/' characters in
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   209
      // them since they are interpreted as a final segment of a fullname.  A 
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   210
      // shortname in this context means creating a name in the root namespace.
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   211
      // We indicate this by passing a zero context to the "real" add.
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   212
      //
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   213
      NS_ASSERT_MSG (offset == std::string::npos, "NamesPriv::Add(): Unexpected '/' in shortname");
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   214
      return Add (Ptr<Object> (0, false), name, object);
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   215
    }
4139
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   218
bool
4148
7f1a5bd869e5 move a function definition in names.cc for a little more clarity
Craig Dowell <craigdo@ee.washington.edu>
parents: 4147
diff changeset
   219
NamesPriv::Add (std::string context, std::string name, Ptr<Object> object)
7f1a5bd869e5 move a function definition in names.cc for a little more clarity
Craig Dowell <craigdo@ee.washington.edu>
parents: 4147
diff changeset
   220
{
7f1a5bd869e5 move a function definition in names.cc for a little more clarity
Craig Dowell <craigdo@ee.washington.edu>
parents: 4147
diff changeset
   221
  if (context == "/Names")
7f1a5bd869e5 move a function definition in names.cc for a little more clarity
Craig Dowell <craigdo@ee.washington.edu>
parents: 4147
diff changeset
   222
    {
7f1a5bd869e5 move a function definition in names.cc for a little more clarity
Craig Dowell <craigdo@ee.washington.edu>
parents: 4147
diff changeset
   223
      return Add (Ptr<Object> (0, false), name, object);
7f1a5bd869e5 move a function definition in names.cc for a little more clarity
Craig Dowell <craigdo@ee.washington.edu>
parents: 4147
diff changeset
   224
    }
7f1a5bd869e5 move a function definition in names.cc for a little more clarity
Craig Dowell <craigdo@ee.washington.edu>
parents: 4147
diff changeset
   225
  return Add (FindObjectFromFullName (context), name, object);
7f1a5bd869e5 move a function definition in names.cc for a little more clarity
Craig Dowell <craigdo@ee.washington.edu>
parents: 4147
diff changeset
   226
}
7f1a5bd869e5 move a function definition in names.cc for a little more clarity
Craig Dowell <craigdo@ee.washington.edu>
parents: 4147
diff changeset
   227
7f1a5bd869e5 move a function definition in names.cc for a little more clarity
Craig Dowell <craigdo@ee.washington.edu>
parents: 4147
diff changeset
   228
bool
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   229
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
   230
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   231
  NS_LOG_FUNCTION (context << name << 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
  if (IsNamed (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
      NS_LOG_LOGIC ("Object is already named");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   236
      return false;
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   239
  NameNode *node = 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   240
  if (context)
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
      node = IsNamed (context);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   243
      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
   244
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   245
  else
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
      node = &m_root;
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   250
  if (IsDuplicateName (node, name))
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
      NS_LOG_LOGIC ("Name is already taken");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   253
      return false;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   254
    }
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
  NameNode *newNode = new NameNode(node, name, object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   257
  node->m_nameMap[name] = newNode;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   258
  m_objectMap[object] = newNode;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   259
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   260
  return true;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   261
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   262
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   263
std::string
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   264
NamesPriv::FindShortName (Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   265
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   266
  NS_LOG_FUNCTION (object);
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
  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
   269
  if (i == m_objectMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   270
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   271
      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
   272
      return "";
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   273
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   274
  else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   275
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   276
      NS_LOG_LOGIC ("Object exists in object map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   277
      return i->second->m_name;
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
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   280
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   281
std::string
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   282
NamesPriv::FindFullName (Ptr<Object> object)
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
  NS_LOG_FUNCTION (object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   285
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   286
  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
   287
  if (i == m_objectMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   288
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   289
      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
   290
      return "";
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   291
    }
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
  NameNode *p = i->second;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   294
  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
   295
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   296
  std::string fullname;
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
  do
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   299
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   300
      fullname = "/" + p->m_name + fullname;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   301
      NS_LOG_LOGIC ("fullname is " << fullname);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   302
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   303
  while ((p = p->m_parent) != 0);
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
  return fullname;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   306
}
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   309
Ptr<Object>
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   310
NamesPriv::FindObjectFromFullName (std::string name)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   311
{
4149
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   312
  //
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   313
  // This is hooked in from simple, easy to use version of Find, so we want it
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   314
  // to be flexible.
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   315
  //
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   316
  // If we are provided a name that doesn't begin with "/Names", we assume 
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   317
  // that the caller has simply given us a path starting with a shortname that
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   318
  // is in the root namespace.  This allows peole to omit the "/Names" prefix.
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   319
  // and simply do a Find ("Client/eth0") instead of having to always do a
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   320
  // Find ("/Names/Client/eth0");
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   321
  //
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   322
  // So, if we are given a name that begins with "/Names/" the upshot is that we
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   323
  // just remove that prefix and treat the rest of the string as starting with a 
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   324
  // shortname in the root namespace.
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   325
  //
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   326
  std::string namespaceName = "/Names/";
4149
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   327
  std::string remaining;
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   328
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   329
  std::string::size_type offset = name.find (namespaceName);
4149
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   330
  if (offset == 0)
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   331
    {
4149
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   332
      NS_LOG_LOGIC (name << " is a fully qualified name");
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   333
      remaining = name.substr (namespaceName.size ());
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   334
    }
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   335
  else
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   336
    {
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   337
      NS_LOG_LOGIC (name << " begins with a relative shortname");
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   338
      remaining = name;
4139
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   341
  NameNode *node = &m_root;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   342
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   343
  //
4149
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   344
  // The string <remaining> is now composed entirely of path segments in the
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   345
  // /Names name space and we have eaten the leading slash. e.g., 
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   346
  // remaining = "ClientNode/eth0"
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   347
  //
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   348
  // The start of the search is always at the root of the name space.
4139
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
  for (;;)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   351
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   352
      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
   353
      offset = remaining.find ("/");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   354
      if (offset == std::string::npos)
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
          //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   357
          // 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
   358
          // specified name.  We're done when we find it
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   359
          //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   360
          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
   361
          if (i == node->m_nameMap.end ())
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
              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
   364
              return 0;
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
          else
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
              NS_LOG_LOGIC ("Name parsed, found object");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   369
              return i->second->m_object;
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
        }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   372
      else
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
          //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   375
          // 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
   376
          // 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
   377
          //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   378
          offset = remaining.find ("/");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   379
          std::string segment = remaining.substr(0, offset);
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
          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
   382
          if (i == node->m_nameMap.end ())
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_LOGIC ("Name does not exist in name map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   385
              return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   386
            }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   387
          else
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
              node = i->second;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   390
              remaining = remaining.substr (offset + 1);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   391
              NS_LOG_LOGIC ("Intermediate segment parsed");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   392
              continue;
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
        }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   395
    }
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
  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
   398
  return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   399
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   400
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   401
Ptr<Object>
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   402
NamesPriv::FindObjectFromShortName (Ptr<Object> context, std::string name)
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
  NS_LOG_FUNCTION (context << name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   405
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   406
  NameNode *node = 0;
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
  if (context == 0)
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
      NS_LOG_LOGIC ("Zero context implies root NameNode");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   411
      node = &m_root;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   412
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   413
  else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   414
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   415
      node = IsNamed (context);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   416
      if (node == 0)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   417
        {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   418
          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
   419
          return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   420
        }
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::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
   424
  if (i == node->m_nameMap.end ())
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
      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
   427
      return 0;
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
  else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   430
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   431
      NS_LOG_LOGIC ("Name exists in name map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   432
      return i->second->m_object;
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   436
NameNode *
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   437
NamesPriv::IsNamed (Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   438
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   439
  NS_LOG_FUNCTION (object);
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
  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
   442
  if (i == m_objectMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   443
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   444
      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
   445
      return 0;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   446
    }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   447
  else
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   448
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   449
      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
   450
      return i->second;
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
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   453
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   454
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   455
NamesPriv::IsDuplicateName (NameNode *node, std::string name)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   456
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   457
  NS_LOG_FUNCTION (node << name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   458
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   459
  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
   460
  if (i == node->m_nameMap.end ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   461
    {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   462
      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
   463
      return false;
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
  else
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
      NS_LOG_LOGIC ("Name exists in name map");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   468
      return true;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   469
    }
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
4145
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
   472
void
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
   473
Names::Delete (void)
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
   474
{
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
   475
  NamesPriv::Delete ();
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
   476
}
bb930262e55c add NamesPriv cleanup for code that doesn't use simulator -- for valgrind-clean runs
Craig Dowell <craigdo@ee.washington.edu>
parents: 4141
diff changeset
   477
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   478
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   479
Names::Add (std::string name, Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   480
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   481
  return NamesPriv::Get ()->Add (name, object);
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   484
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   485
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
   486
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   487
  return NamesPriv::Get ()->Add (context, name, object);
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   490
bool
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   491
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
   492
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   493
  return NamesPriv::Get ()->Add (context, name, object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   494
}
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
std::string
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   497
Names::FindShortName (Ptr<Object> object)
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
  return NamesPriv::Get ()->FindShortName (object);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   500
}
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
std::string
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   503
Names::FindFullName (Ptr<Object> object)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   504
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   505
  return NamesPriv::Get ()->FindFullName (object);
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   508
Ptr<Object>
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   509
Names::FindObjectFromFullNameInternal (std::string name)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   510
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   511
  return NamesPriv::Get ()->FindObjectFromFullName (name);
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
Ptr<Object>
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   515
Names::FindObjectFromShortNameInternal (Ptr<Object> context, std::string name)
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   516
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   517
  return NamesPriv::Get ()->FindObjectFromShortName (context, name);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   518
}
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
} //namespace ns3
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   521
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   522
#ifdef RUN_SELF_TESTS
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   523
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   524
#include "test.h"
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   525
#include "object-factory.h"
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
namespace ns3 {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   528
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   529
class TestObject : public Object
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   530
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   531
public:
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   532
  static TypeId GetTypeId (void) 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   533
  {
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   534
    static TypeId tid = TypeId ("TestObject")
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   535
      .SetParent (Object::GetTypeId ())
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   536
      .HideFromDocumentation ()
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   537
      .AddConstructor<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   538
    return tid;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   539
  }
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   540
  TestObject () {}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   541
  virtual void Dispose (void) {}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   542
};
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
class NamesTest : public Test
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   545
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   546
public:
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   547
  NamesTest ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   548
  virtual bool RunTests (void);
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
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   551
NamesTest::NamesTest ()
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   552
  : Test ("Names")
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   553
{
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   554
}
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
bool 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   557
NamesTest::RunTests (void)
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
  bool result = true;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   560
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
  // Name a couple of objects at the root level
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
  Ptr<TestObject> client = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   565
  result = Names::Add ("Client", client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   566
  NS_TEST_ASSERT_EQUAL (result, true);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   567
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   568
  Ptr<TestObject> server = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   569
  result = Names::Add ("Server", server);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   570
  NS_TEST_ASSERT_EQUAL (result, true);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   571
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
  // 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
   574
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   575
  result = Names::Add ("Not Client", client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   576
  NS_TEST_ASSERT_EQUAL (result, false);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   577
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
  // 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
   580
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   581
  Ptr<TestObject> secondClient = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   582
  result = Names::Add ("Client", secondClient);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   583
  NS_TEST_ASSERT_EQUAL (result, false);
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
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   586
  // 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
   587
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   588
  Ptr<TestObject> clientEth0 = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   589
  result = Names::Add (client, "eth0", clientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   590
  NS_TEST_ASSERT_EQUAL (result, true);
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
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   593
  // 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
   594
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   595
  Ptr<TestObject> secondClientEth0 = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   596
  result = Names::Add (client, "eth0", secondClientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   597
  NS_TEST_ASSERT_EQUAL (result, false);
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
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   600
  // 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
   601
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   602
  Ptr<TestObject> serverEth0 = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   603
  result = Names::Add (server, "eth0", serverEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   604
  NS_TEST_ASSERT_EQUAL (result, true);
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
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   607
  // 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
   608
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   609
  std::string found;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   610
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   611
  found = Names::FindShortName (client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   612
  NS_TEST_ASSERT_EQUAL (found, "Client");
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
  found = Names::FindShortName (server);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   615
  NS_TEST_ASSERT_EQUAL (found, "Server");
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
  found = Names::FindShortName (clientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   618
  NS_TEST_ASSERT_EQUAL (found, "eth0");
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
  found = Names::FindShortName (serverEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   621
  NS_TEST_ASSERT_EQUAL (found, "eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   622
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
  // 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
   625
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   626
  found = Names::FindFullName (client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   627
  NS_TEST_ASSERT_EQUAL (found, "/Names/Client");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   628
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   629
  found = Names::FindFullName (server);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   630
  NS_TEST_ASSERT_EQUAL (found, "/Names/Server");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   631
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   632
  found = Names::FindFullName (clientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   633
  NS_TEST_ASSERT_EQUAL (found, "/Names/Client/eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   634
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   635
  found = Names::FindFullName (serverEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   636
  NS_TEST_ASSERT_EQUAL (found, "/Names/Server/eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   637
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   638
  // 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   639
  // 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
   640
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   641
  Ptr<TestObject> foundObject;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   642
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   643
  foundObject = Names::FindObjectFromShortName<TestObject> (0, "Client");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   644
  NS_TEST_ASSERT_EQUAL (foundObject, client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   645
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   646
  foundObject = Names::FindObjectFromShortName<TestObject> (0, "Server");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   647
  NS_TEST_ASSERT_EQUAL (foundObject, server);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   648
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   649
  foundObject = Names::FindObjectFromShortName<TestObject> (client, "eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   650
  NS_TEST_ASSERT_EQUAL (foundObject, clientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   651
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   652
  foundObject = Names::FindObjectFromShortName<TestObject> (server, "eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   653
  NS_TEST_ASSERT_EQUAL (foundObject, serverEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   654
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   655
  // 
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   656
  // 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
   657
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   658
  foundObject = Names::Find<TestObject> ("/Names/Client");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   659
  NS_TEST_ASSERT_EQUAL (foundObject, client);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   660
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   661
  foundObject = Names::Find<TestObject> ("/Names/Server");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   662
  NS_TEST_ASSERT_EQUAL (foundObject, server);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   663
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   664
  foundObject = Names::Find<TestObject> ("/Names/Client/eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   665
  NS_TEST_ASSERT_EQUAL (foundObject, clientEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   666
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   667
  foundObject = Names::Find<TestObject> ("/Names/Server/eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   668
  NS_TEST_ASSERT_EQUAL (foundObject, serverEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   669
4149
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   670
  // 
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   671
  // We should be able to omit the root of the namespace from the full names
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   672
  //
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   673
  foundObject = Names::Find<TestObject> ("Client");
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   674
  NS_TEST_ASSERT_EQUAL (foundObject, client);
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   675
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   676
  foundObject = Names::Find<TestObject> ("Server");
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   677
  NS_TEST_ASSERT_EQUAL (foundObject, server);
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   678
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   679
  foundObject = Names::Find<TestObject> ("Client/eth0");
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   680
  NS_TEST_ASSERT_EQUAL (foundObject, clientEth0);
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   681
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   682
  foundObject = Names::Find<TestObject> ("Server/eth0");
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   683
  NS_TEST_ASSERT_EQUAL (foundObject, serverEth0);
6a3dbc49cfa9 Alloc clients to omit /Names/ in Names::Find
Craig Dowell <craigdo@ee.washington.edu>
parents: 4148
diff changeset
   684
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   685
  //
4141
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   686
  // We also have some syntactically sugary methods, so make sure they do what
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   687
  // they should as well.
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   688
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   689
  Ptr<TestObject> bridge = CreateObject<TestObject> ();
4141
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   690
  result = Names::Add ("/Names", "Bridge", bridge);
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   691
  NS_TEST_ASSERT_EQUAL (result, true);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   692
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   693
  Ptr<TestObject> bridgeEth0 = CreateObject<TestObject> ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   694
  result = Names::Add ("/Names/Bridge", "eth0", bridgeEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   695
  NS_TEST_ASSERT_EQUAL (result, true);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   696
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   697
  foundObject = Names::Find<TestObject> ("/Names/Bridge");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   698
  NS_TEST_ASSERT_EQUAL (foundObject, bridge);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   699
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   700
  foundObject = Names::Find<TestObject> ("/Names/Bridge/eth0");
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   701
  NS_TEST_ASSERT_EQUAL (foundObject, bridgeEth0);
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   702
4141
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   703
  Ptr<TestObject> wireless = CreateObject<TestObject> ();
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   704
  result = Names::Add ("/Names/Wireless", wireless);
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   705
  NS_TEST_ASSERT_EQUAL (result, true);
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   706
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   707
  Ptr<TestObject> wirelessAth0 = CreateObject<TestObject> ();
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   708
  result = Names::Add ("/Names/Wireless/ath0", wirelessAth0);
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   709
  NS_TEST_ASSERT_EQUAL (result, true);
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   710
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   711
  foundObject = Names::Find<TestObject> ("/Names/Wireless");
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   712
  NS_TEST_ASSERT_EQUAL (foundObject, wireless);
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   713
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   714
  foundObject = Names::Find<TestObject> ("/Names/Wireless/ath0");
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   715
  NS_TEST_ASSERT_EQUAL (foundObject, wirelessAth0);
3f7f08d9daad make simple version of Names:Add even simpler. Use that in examples/names.cc
Craig Dowell <craigdo@ee.washington.edu>
parents: 4139
diff changeset
   716
4139
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   717
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   718
  // 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
   719
  // 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
   720
  // 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
   721
  //
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   722
  Simulator::Run ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   723
  Simulator::Destroy ();
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   724
  
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   725
  return true;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   726
}
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   727
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   728
static NamesTest g_namesTests;
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   729
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   730
} // namespace ns3
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   731
d45e62c78504 add an object name service
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   732
#endif /* RUN_SELF_TESTS */