diff --git a/src/core/object.cc b/src/core/object.cc index 287ef0fb5..fac72094e 100644 --- a/src/core/object.cc +++ b/src/core/object.cc @@ -21,7 +21,6 @@ #include "object.h" #include "assert.h" #include "singleton.h" -#include "uid-manager.h" #include "trace-resolver.h" #include "log.h" #include @@ -34,30 +33,89 @@ NS_LOG_COMPONENT_DEFINE ("Object"); namespace { -class IidManager : public ns3::UidManager -{}; - -class IidTree +class IidManager { public: - void SetParent (uint16_t child, uint16_t parent); - uint16_t LookupParent (uint16_t child); - + uint16_t AllocateUid (std::string name); + void SetParent (uint16_t uid, uint16_t parent); + uint16_t GetUid (std::string name) const; + std::string GetName (uint16_t uid) const; + uint16_t GetParent (uint16_t uid) const; private: - std::vector m_parents; + struct IidInformation { + std::string name; + uint16_t parent; + }; + typedef std::vector::const_iterator Iterator; + + struct IidManager::IidInformation *LookupInformation (uint16_t uid) const; + + std::vector m_information; }; -void -IidTree::SetParent (uint16_t child, uint16_t parent) +uint16_t +IidManager::AllocateUid (std::string name) { - m_parents.resize (child+1); - m_parents[child] = parent; + uint16_t j = 1; + for (Iterator i = m_information.begin (); i != m_information.end (); i++) + { + if (i->name == name) + { + NS_FATAL_ERROR ("Trying to allocate twice the same uid: " << name); + return 0; + } + j++; + } + struct IidInformation information; + information.name = name; + information.parent = 0; + m_information.push_back (information); + uint32_t uid = m_information.size (); + NS_ASSERT (uid <= 0xffff); + return uid; +} + +struct IidManager::IidInformation * +IidManager::LookupInformation (uint16_t uid) const +{ + NS_ASSERT (uid <= m_information.size ()); + return const_cast (&m_information[uid-1]); +} + +void +IidManager::SetParent (uint16_t uid, uint16_t parent) +{ + NS_ASSERT (parent <= m_information.size ()); + struct IidInformation *information = LookupInformation (uid); + information->parent = parent; +} + +uint16_t +IidManager::GetUid (std::string name) const +{ + uint32_t j = 1; + for (Iterator i = m_information.begin (); i != m_information.end (); i++) + { + if (i->name == name) + { + NS_ASSERT (j <= 0xffff); + return j; + } + j++; + } + return 0; +} +std::string +IidManager::GetName (uint16_t uid) const +{ + struct IidInformation *information = LookupInformation (uid); + return information->name; } uint16_t -IidTree::LookupParent (uint16_t child) +IidManager::GetParent (uint16_t uid) const { - NS_ASSERT (child < m_parents.size ()); - return m_parents[child]; + struct IidInformation *information = LookupInformation (uid); + return information->parent; } } // anonymous namespace @@ -142,19 +200,20 @@ InterfaceId::~InterfaceId () InterfaceId InterfaceId::LookupByName (std::string name) { - uint32_t uid = Singleton::Get ()->LookupByName (name); - NS_ASSERT (uid != 0 && uid <= 0xffff); + uint16_t uid = Singleton::Get ()->GetUid (name); + NS_ASSERT (uid != 0); return InterfaceId (uid); } InterfaceId -InterfaceId::LookupParent (InterfaceId iid) +InterfaceId::GetParent (void) const { - return Singleton::Get ()->LookupParent (iid.m_iid); + uint16_t parent = Singleton::Get ()->GetParent (m_iid); + return InterfaceId (parent); } std::string InterfaceId::GetName (void) const { - std::string name = Singleton::Get ()->LookupByUid (m_iid); + std::string name = Singleton::Get ()->GetName (m_iid); return name; } @@ -171,19 +230,19 @@ bool operator != (InterfaceId a, InterfaceId b) InterfaceId MakeInterfaceId (std::string name, InterfaceId parent) { - uint32_t uid = Singleton::Get ()->Allocate (name); - NS_ASSERT (uid <= 0xffff); - InterfaceId iid = uid; - Singleton::Get ()->SetParent (iid.m_iid, parent.m_iid); - return iid; + uint16_t uid = Singleton::Get ()->AllocateUid (name); + NS_ASSERT (uid != 0); + Singleton::Get ()->SetParent (uid, parent.m_iid); + return InterfaceId (uid); } InterfaceId MakeObjectInterfaceId (void) { - InterfaceId iid = Singleton::Get ()->Allocate ("Object"); - Singleton::Get ()->SetParent (iid.m_iid, iid.m_iid); - return iid; + uint16_t uid = Singleton::Get ()->AllocateUid ("Object"); + NS_ASSERT (uid == 1); + Singleton::Get ()->SetParent (uid, uid); + return InterfaceId (uid); } @@ -221,7 +280,7 @@ Object::DoQueryInterface (InterfaceId iid) const InterfaceId cur = currentObject->m_iid; while (cur != iid && cur != Object::iid ()) { - cur = InterfaceId::LookupParent (cur); + cur = cur.GetParent (); } if (cur == iid) { @@ -379,7 +438,7 @@ Object::DoCollectSources (std::string path, const TraceContext &context, fullpath.append (name); NS_LOG_LOGIC("collect: " << fullpath); current->GetTraceResolver ()->CollectSources (fullpath, context, collection); - cur = InterfaceId::LookupParent (cur); + cur = cur.GetParent (); } current = current->m_next; } diff --git a/src/core/object.h b/src/core/object.h index 3f5590886..f366e9344 100644 --- a/src/core/object.h +++ b/src/core/object.h @@ -59,7 +59,7 @@ public: * This method cannot fail: it will crash if the input * id is not a valid interface id. */ - static InterfaceId LookupParent (InterfaceId iid); + InterfaceId GetParent (void) const; /** * \returns the name of this interface.