--- a/src/core/object.cc Sun Mar 16 20:47:46 2008 +0100
+++ b/src/core/object.cc Sun Mar 16 20:55:18 2008 +0100
@@ -30,918 +30,9 @@
NS_LOG_COMPONENT_DEFINE ("Object");
-/*********************************************************************
- * Helper code
- *********************************************************************/
-
-namespace {
-
-class IidManager
-{
-public:
- IidManager ();
- uint16_t AllocateUid (std::string name);
- void SetParent (uint16_t uid, uint16_t parent);
- void SetTypeName (uint16_t uid, std::string typeName);
- void SetGroupName (uint16_t uid, std::string groupName);
- void AddConstructor (uint16_t uid, ns3::Callback<ns3::ObjectBase *> callback);
- void HideFromDocumentation (uint16_t uid);
- uint16_t GetUid (std::string name) const;
- std::string GetName (uint16_t uid) const;
- uint16_t GetParent (uint16_t uid) const;
- std::string GetTypeName (uint16_t uid) const;
- std::string GetGroupName (uint16_t uid) const;
- ns3::Callback<ns3::ObjectBase *> GetConstructor (uint16_t uid) const;
- bool HasConstructor (uint16_t uid) const;
- uint32_t GetRegisteredN (void) const;
- uint16_t GetRegistered (uint32_t i) const;
- void AddAttribute (uint16_t uid,
- std::string name,
- std::string help,
- uint32_t flags,
- ns3::Attribute initialValue,
- ns3::Ptr<const ns3::AttributeAccessor> spec,
- ns3::Ptr<const ns3::AttributeChecker> checker);
- uint32_t GetAttributeListN (uint16_t uid) const;
- std::string GetAttributeName (uint16_t uid, uint32_t i) const;
- std::string GetAttributeHelp (uint16_t uid, uint32_t i) const;
- uint32_t GetAttributeFlags (uint16_t uid, uint32_t i) const;
- ns3::Attribute GetAttributeInitialValue (uint16_t uid, uint32_t i) const;
- ns3::Ptr<const ns3::AttributeAccessor> GetAttributeAccessor (uint16_t uid, uint32_t i) const;
- ns3::Ptr<const ns3::AttributeChecker> GetAttributeChecker (uint16_t uid, uint32_t i) const;
- void AddTraceSource (uint16_t uid,
- std::string name,
- std::string help,
- ns3::Ptr<const ns3::TraceSourceAccessor> accessor);
- uint32_t GetTraceSourceN (uint16_t uid) const;
- std::string GetTraceSourceName (uint16_t uid, uint32_t i) const;
- std::string GetTraceSourceHelp (uint16_t uid, uint32_t i) const;
- ns3::Ptr<const ns3::TraceSourceAccessor> GetTraceSourceAccessor (uint16_t uid, uint32_t i) const;
- bool MustHideFromDocumentation (uint16_t uid) const;
-
-private:
- struct AttributeInformation {
- std::string name;
- std::string help;
- uint32_t flags;
- ns3::Attribute initialValue;
- ns3::Ptr<const ns3::AttributeAccessor> param;
- ns3::Ptr<const ns3::AttributeChecker> checker;
- };
- struct TraceSourceInformation {
- std::string name;
- std::string help;
- ns3::Ptr<const ns3::TraceSourceAccessor> accessor;
- };
- struct IidInformation {
- std::string name;
- uint16_t parent;
- std::string typeName;
- std::string groupName;
- bool hasConstructor;
- ns3::Callback<ns3::ObjectBase *> constructor;
- bool mustHideFromDocumentation;
- std::vector<struct AttributeInformation> attributes;
- std::vector<struct TraceSourceInformation> traceSources;
- };
- typedef std::vector<struct IidInformation>::const_iterator Iterator;
-
- struct IidManager::IidInformation *LookupInformation (uint16_t uid) const;
-
- std::vector<struct IidInformation> m_information;
-};
-
-IidManager::IidManager ()
-{}
-
-uint16_t
-IidManager::AllocateUid (std::string name)
-{
- 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;
- information.typeName = "";
- information.groupName = "";
- information.hasConstructor = false;
- information.mustHideFromDocumentation = false;
- 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<struct IidInformation *> (&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;
-}
-void
-IidManager::SetTypeName (uint16_t uid, std::string typeName)
-{
- struct IidInformation *information = LookupInformation (uid);
- information->typeName = typeName;
-}
-void
-IidManager::SetGroupName (uint16_t uid, std::string groupName)
-{
- struct IidInformation *information = LookupInformation (uid);
- information->groupName = groupName;
-}
-void
-IidManager::HideFromDocumentation (uint16_t uid)
-{
- struct IidInformation *information = LookupInformation (uid);
- information->mustHideFromDocumentation = true;
-}
-
-void
-IidManager::AddConstructor (uint16_t uid, ns3::Callback<ns3::ObjectBase *> callback)
-{
- struct IidInformation *information = LookupInformation (uid);
- if (information->hasConstructor)
- {
- NS_FATAL_ERROR (information->name<<" already has a constructor.");
- }
- information->hasConstructor = true;
- information->constructor = callback;
-}
-
-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
-IidManager::GetParent (uint16_t uid) const
-{
- struct IidInformation *information = LookupInformation (uid);
- return information->parent;
-}
-std::string
-IidManager::GetTypeName (uint16_t uid) const
-{
- struct IidInformation *information = LookupInformation (uid);
- return information->typeName;
-}
-std::string
-IidManager::GetGroupName (uint16_t uid) const
-{
- struct IidInformation *information = LookupInformation (uid);
- return information->groupName;
-}
-
-ns3::Callback<ns3::ObjectBase *>
-IidManager::GetConstructor (uint16_t uid) const
-{
- struct IidInformation *information = LookupInformation (uid);
- if (!information->hasConstructor)
- {
- NS_FATAL_ERROR ("Requested constructor for "<<information->name<<" but it does not have one.");
- }
- return information->constructor;
-}
-
-bool
-IidManager::HasConstructor (uint16_t uid) const
-{
- struct IidInformation *information = LookupInformation (uid);
- return information->hasConstructor;
-}
-
-uint32_t
-IidManager::GetRegisteredN (void) const
-{
- return m_information.size ();
-}
-uint16_t
-IidManager::GetRegistered (uint32_t i) const
-{
- return i + 1;
-}
-
-void
-IidManager::AddAttribute (uint16_t uid,
- std::string name,
- std::string help,
- uint32_t flags,
- ns3::Attribute initialValue,
- ns3::Ptr<const ns3::AttributeAccessor> spec,
- ns3::Ptr<const ns3::AttributeChecker> checker)
-{
- struct IidInformation *information = LookupInformation (uid);
- for (std::vector<struct AttributeInformation>::const_iterator j = information->attributes.begin ();
- j != information->attributes.end (); j++)
- {
- if (j->name == name)
- {
- NS_FATAL_ERROR ("Registered the same attribute twice name=\""<<name<<"\" in TypeId=\""<<information->name<<"\"");
- return;
- }
- }
- struct AttributeInformation param;
- param.name = name;
- param.help = help;
- param.flags = flags;
- param.initialValue = initialValue;
- param.param = spec;
- param.checker = checker;
- information->attributes.push_back (param);
-}
-
-
-uint32_t
-IidManager::GetAttributeListN (uint16_t uid) const
-{
- struct IidInformation *information = LookupInformation (uid);
- return information->attributes.size ();
-}
-std::string
-IidManager::GetAttributeName (uint16_t uid, uint32_t i) const
-{
- struct IidInformation *information = LookupInformation (uid);
- NS_ASSERT (i < information->attributes.size ());
- return information->attributes[i].name;
-}
-std::string
-IidManager::GetAttributeHelp (uint16_t uid, uint32_t i) const
-{
- struct IidInformation *information = LookupInformation (uid);
- NS_ASSERT (i < information->attributes.size ());
- return information->attributes[i].help;
-}
-uint32_t
-IidManager::GetAttributeFlags (uint16_t uid, uint32_t i) const
-{
- struct IidInformation *information = LookupInformation (uid);
- NS_ASSERT (i < information->attributes.size ());
- return information->attributes[i].flags;
-}
-ns3::Attribute
-IidManager::GetAttributeInitialValue (uint16_t uid, uint32_t i) const
-{
- struct IidInformation *information = LookupInformation (uid);
- NS_ASSERT (i < information->attributes.size ());
- return information->attributes[i].initialValue;
-}
-ns3::Ptr<const ns3::AttributeAccessor>
-IidManager::GetAttributeAccessor (uint16_t uid, uint32_t i) const
-{
- struct IidInformation *information = LookupInformation (uid);
- NS_ASSERT (i < information->attributes.size ());
- return information->attributes[i].param;
-}
-ns3::Ptr<const ns3::AttributeChecker>
-IidManager::GetAttributeChecker (uint16_t uid, uint32_t i) const
-{
- struct IidInformation *information = LookupInformation (uid);
- NS_ASSERT (i < information->attributes.size ());
- return information->attributes[i].checker;
-}
-
-void
-IidManager::AddTraceSource (uint16_t uid,
- std::string name,
- std::string help,
- ns3::Ptr<const ns3::TraceSourceAccessor> accessor)
-{
- struct IidInformation *information = LookupInformation (uid);
- struct TraceSourceInformation source;
- source.name = name;
- source.help = help;
- source.accessor = accessor;
- information->traceSources.push_back (source);
-}
-uint32_t
-IidManager::GetTraceSourceN (uint16_t uid) const
-{
- struct IidInformation *information = LookupInformation (uid);
- return information->traceSources.size ();
-}
-std::string
-IidManager::GetTraceSourceName (uint16_t uid, uint32_t i) const
-{
- struct IidInformation *information = LookupInformation (uid);
- NS_ASSERT (i < information->traceSources.size ());
- return information->traceSources[i].name;
-}
-std::string
-IidManager::GetTraceSourceHelp (uint16_t uid, uint32_t i) const
-{
- struct IidInformation *information = LookupInformation (uid);
- NS_ASSERT (i < information->traceSources.size ());
- return information->traceSources[i].help;
-}
-ns3::Ptr<const ns3::TraceSourceAccessor>
-IidManager::GetTraceSourceAccessor (uint16_t uid, uint32_t i) const
-{
- struct IidInformation *information = LookupInformation (uid);
- NS_ASSERT (i < information->traceSources.size ());
- return information->traceSources[i].accessor;
-}
-bool
-IidManager::MustHideFromDocumentation (uint16_t uid) const
-{
- struct IidInformation *information = LookupInformation (uid);
- return information->mustHideFromDocumentation;
-}
-
-} // anonymous namespace
-
namespace ns3 {
/*********************************************************************
- * The TypeId class
- *********************************************************************/
-
-TypeId::TypeId ()
- : m_tid (0)
-{}
-
-TypeId::TypeId (const char *name)
-{
- uint16_t uid = Singleton<IidManager>::Get ()->AllocateUid (name);
- NS_ASSERT (uid != 0);
- m_tid = uid;
-}
-
-
-TypeId::TypeId (uint16_t tid)
- : m_tid (tid)
-{}
-TypeId::~TypeId ()
-{}
-TypeId
-TypeId::LookupByName (std::string name)
-{
- uint16_t uid = Singleton<IidManager>::Get ()->GetUid (name);
- NS_ASSERT (uid != 0);
- return TypeId (uid);
-}
-bool
-TypeId::LookupByNameFailSafe (std::string name, TypeId *tid)
-{
- uint16_t uid = Singleton<IidManager>::Get ()->GetUid (name);
- if (uid == 0)
- {
- return false;
- }
- *tid = TypeId (uid);
- return true;
-}
-
-bool
-TypeId::LookupAttributeByFullName (std::string fullName, struct TypeId::AttributeInfo *info)
-{
- std::string::size_type pos = fullName.rfind ("::");
- if (pos == std::string::npos)
- {
- return 0;
- }
- std::string tidName = fullName.substr (0, pos);
- std::string paramName = fullName.substr (pos+2, fullName.size () - (pos+2));
- TypeId tid;
- bool ok = LookupByNameFailSafe (tidName, &tid);
- if (!ok)
- {
- return false;
- }
- return tid.LookupAttributeByName (paramName, info);
-}
-uint32_t
-TypeId::GetRegisteredN (void)
-{
- return Singleton<IidManager>::Get ()->GetRegisteredN ();
-}
-TypeId
-TypeId::GetRegistered (uint32_t i)
-{
- return TypeId (Singleton<IidManager>::Get ()->GetRegistered (i));
-}
-
-bool
-TypeId::LookupAttributeByName (std::string name, struct TypeId::AttributeInfo *info) const
-{
- TypeId tid;
- TypeId nextTid = *this;
- do {
- tid = nextTid;
- for (uint32_t i = 0; i < tid.GetAttributeListN (); i++)
- {
- std::string paramName = tid.GetAttributeName (i);
- if (paramName == name)
- {
- info->accessor = tid.GetAttributeAccessor (i);
- info->flags = tid.GetAttributeFlags (i);
- info->initialValue = tid.GetAttributeInitialValue (i);
- info->checker = tid.GetAttributeChecker (i);
- return true;
- }
- }
- nextTid = tid.GetParent ();
- } while (nextTid != tid);
- return false;
-}
-
-TypeId
-TypeId::SetParent (TypeId tid)
-{
- Singleton<IidManager>::Get ()->SetParent (m_tid, tid.m_tid);
- return *this;
-}
-TypeId
-TypeId::SetGroupName (std::string groupName)
-{
- Singleton<IidManager>::Get ()->SetGroupName (m_tid, groupName);
- return *this;
-}
-TypeId
-TypeId::SetTypeName (std::string typeName)
-{
- Singleton<IidManager>::Get ()->SetTypeName (m_tid, typeName);
- return *this;
-}
-TypeId
-TypeId::GetParent (void) const
-{
- uint16_t parent = Singleton<IidManager>::Get ()->GetParent (m_tid);
- return TypeId (parent);
-}
-std::string
-TypeId::GetGroupName (void) const
-{
- std::string groupName = Singleton<IidManager>::Get ()->GetGroupName (m_tid);
- return groupName;
-}
-std::string
-TypeId::GetTypeName (void) const
-{
- std::string typeName = Singleton<IidManager>::Get ()->GetTypeName (m_tid);
- return typeName;
-}
-
-std::string
-TypeId::GetName (void) const
-{
- std::string name = Singleton<IidManager>::Get ()->GetName (m_tid);
- return name;
-}
-
-bool
-TypeId::HasConstructor (void) const
-{
- bool hasConstructor = Singleton<IidManager>::Get ()->HasConstructor (m_tid);
- return hasConstructor;
-}
-
-void
-TypeId::DoAddConstructor (Callback<ObjectBase *> cb)
-{
- Singleton<IidManager>::Get ()->AddConstructor (m_tid, cb);
-}
-
-TypeId
-TypeId::AddAttribute (std::string name,
- std::string help,
- Attribute initialValue,
- Ptr<const AttributeAccessor> param,
- Ptr<const AttributeChecker> checker)
-{
- Singleton<IidManager>::Get ()->AddAttribute (m_tid, name, help, ATTR_SGC, initialValue, param, checker);
- return *this;
-}
-
-TypeId
-TypeId::AddAttribute (std::string name,
- std::string help,
- uint32_t flags,
- Attribute initialValue,
- Ptr<const AttributeAccessor> param,
- Ptr<const AttributeChecker> checker)
-{
- Singleton<IidManager>::Get ()->AddAttribute (m_tid, name, help, flags, initialValue, param, checker);
- return *this;
-}
-
-Callback<ObjectBase *>
-TypeId::GetConstructor (void) const
-{
- Callback<ObjectBase *> cb = Singleton<IidManager>::Get ()->GetConstructor (m_tid);
- return cb;
-}
-
-bool
-TypeId::MustHideFromDocumentation (void) const
-{
- bool mustHide = Singleton<IidManager>::Get ()->MustHideFromDocumentation (m_tid);
- return mustHide;
-}
-
-uint32_t
-TypeId::GetAttributeListN (void) const
-{
- uint32_t n = Singleton<IidManager>::Get ()->GetAttributeListN (m_tid);
- return n;
-}
-std::string
-TypeId::GetAttributeName (uint32_t i) const
-{
- std::string name = Singleton<IidManager>::Get ()->GetAttributeName (m_tid, i);
- return name;
-}
-std::string
-TypeId::GetAttributeHelp (uint32_t i) const
-{
- std::string help = Singleton<IidManager>::Get ()->GetAttributeHelp (m_tid, i);
- return help;
-}
-std::string
-TypeId::GetAttributeFullName (uint32_t i) const
-{
- return GetName () + "::" + GetAttributeName (i);
-}
-Attribute
-TypeId::GetAttributeInitialValue (uint32_t i) const
-{
- Attribute value = Singleton<IidManager>::Get ()->GetAttributeInitialValue (m_tid, i);
- return value;
-}
-Ptr<const AttributeAccessor>
-TypeId::GetAttributeAccessor (uint32_t i) const
-{
- // Used exclusively by the Object class.
- Ptr<const AttributeAccessor> param = Singleton<IidManager>::Get ()->GetAttributeAccessor (m_tid, i);
- return param;
-}
-uint32_t
-TypeId::GetAttributeFlags (uint32_t i) const
-{
- // Used exclusively by the Object class.
- uint32_t flags = Singleton<IidManager>::Get ()->GetAttributeFlags (m_tid, i);
- return flags;
-}
-Ptr<const AttributeChecker>
-TypeId::GetAttributeChecker (uint32_t i) const
-{
- // Used exclusively by the Object class.
- Ptr<const AttributeChecker> checker = Singleton<IidManager>::Get ()->GetAttributeChecker (m_tid, i);
- return checker;
-}
-
-uint32_t
-TypeId::GetTraceSourceN (void) const
-{
- return Singleton<IidManager>::Get ()->GetTraceSourceN (m_tid);
-}
-std::string
-TypeId::GetTraceSourceName (uint32_t i) const
-{
- return Singleton<IidManager>::Get ()->GetTraceSourceName (m_tid, i);
-}
-std::string
-TypeId::GetTraceSourceHelp (uint32_t i) const
-{
- return Singleton<IidManager>::Get ()->GetTraceSourceHelp (m_tid, i);
-}
-Ptr<const TraceSourceAccessor>
-TypeId::GetTraceSourceAccessor (uint32_t i) const
-{
- return Singleton<IidManager>::Get ()->GetTraceSourceAccessor (m_tid, i);
-}
-
-TypeId
-TypeId::AddTraceSource (std::string name,
- std::string help,
- Ptr<const TraceSourceAccessor> accessor)
-{
- Singleton<IidManager>::Get ()->AddTraceSource (m_tid, name, help, accessor);
- return *this;
-}
-
-TypeId
-TypeId::HideFromDocumentation (void)
-{
- Singleton<IidManager>::Get ()->HideFromDocumentation (m_tid);
- return *this;
-}
-
-
-Ptr<const TraceSourceAccessor>
-TypeId::LookupTraceSourceByName (std::string name) const
-{
- TypeId tid;
- TypeId nextTid = *this;
- do {
- tid = nextTid;
- for (uint32_t i = 0; i < tid.GetTraceSourceN (); i++)
- {
- std::string srcName = tid.GetTraceSourceName (i);
- if (srcName == name)
- {
- return tid.GetTraceSourceAccessor (i);
- }
- }
- nextTid = tid.GetParent ();
- } while (nextTid != tid);
- return 0;
-}
-
-std::ostream & operator << (std::ostream &os, TypeId tid)
-{
- os << tid.GetName ();
- return os;
-}
-std::istream & operator >> (std::istream &is, TypeId &tid)
-{
- std::string tidString;
- is >> tidString;
- bool ok = TypeId::LookupByNameFailSafe (tidString, &tid);
- if (!ok)
- {
- is.setstate (std::ios_base::badbit);
- }
- return is;
-}
-
-
-ATTRIBUTE_HELPER_CPP (TypeId);
-
-bool operator == (TypeId a, TypeId b)
-{
- return a.m_tid == b.m_tid;
-}
-
-bool operator != (TypeId a, TypeId b)
-{
- return a.m_tid != b.m_tid;
-}
-
-/*********************************************************************
- * The AttributeList container implementation
- *********************************************************************/
-
-AttributeList::AttributeList ()
-{}
-
-AttributeList::AttributeList (const AttributeList &o)
-{
- for (Attrs::const_iterator i = o.m_attributes.begin (); i != o.m_attributes.end (); i++)
- {
- struct Attr attr;
- attr.checker = i->checker;
- attr.value = i->value.Copy ();
- m_attributes.push_back (attr);
- }
-}
-AttributeList &
-AttributeList::operator = (const AttributeList &o)
-{
- Reset ();
- for (Attrs::const_iterator i = o.m_attributes.begin (); i != o.m_attributes.end (); i++)
- {
- struct Attr attr;
- attr.checker = i->checker;
- attr.value = i->value.Copy ();
- m_attributes.push_back (attr);
- }
- return *this;
-}
-AttributeList::~AttributeList ()
-{
- Reset ();
-}
-
-void
-AttributeList::Set (std::string name, Attribute value)
-{
- struct TypeId::AttributeInfo info;
- bool ok = TypeId::LookupAttributeByFullName (name, &info);
- if (!ok)
- {
- NS_FATAL_ERROR ("Could not find attribute "<<name);
- }
- ok = DoSet (&info, value);
- if (!ok)
- {
- NS_FATAL_ERROR ("Could not set value for attribute "<<name);
- }
-}
-bool
-AttributeList::SetFailSafe (std::string name, Attribute value)
-{
- struct TypeId::AttributeInfo info;
- bool ok = TypeId::LookupAttributeByFullName (name, &info);
- if (!ok)
- {
- return false;
- }
- ok = DoSet (&info, value);
- return ok;
-}
-void
-AttributeList::SetWithTid (TypeId tid, std::string name, Attribute value)
-{
- struct TypeId::AttributeInfo info;
- bool ok = tid.LookupAttributeByName (name, &info);
- if (!ok)
- {
- NS_FATAL_ERROR ("Could not find attribute "<<tid.GetName ()<<"::"<<name);
- }
- ok = DoSet (&info, value);
- if (!ok)
- {
- NS_FATAL_ERROR ("Could not set value for attribute "<<tid.GetName ()<<"::"<<name);
- }
-}
-
-void
-AttributeList::DoSetOne (Ptr<const AttributeChecker> checker, Attribute value)
-{
- // get rid of any previous value stored in this
- // vector of values.
- for (Attrs::iterator k = m_attributes.begin (); k != m_attributes.end (); k++)
- {
- if (k->checker == checker)
- {
- m_attributes.erase (k);
- break;
- }
- }
- // store the new value.
- struct Attr attr;
- attr.checker = checker;
- attr.value = value.Copy ();
- m_attributes.push_back (attr);
-}
-bool
-AttributeList::DoSet (struct TypeId::AttributeInfo *info, Attribute value)
-{
- if (info->checker == 0)
- {
- return false;
- }
- bool ok = info->checker->Check (value);
- if (!ok)
- {
- // attempt to convert to string.
- const StringValue *str = value.DynCast<const StringValue *> ();
- if (str == 0)
- {
- return false;
- }
- // attempt to convert back to value.
- Attribute v = info->checker->Create ();
- ok = v.DeserializeFromString (str->Get ().Get (), info->checker);
- if (!ok)
- {
- return false;
- }
- ok = info->checker->Check (v);
- if (!ok)
- {
- return false;
- }
- value = v;
- }
- DoSetOne (info->checker, value);
- return true;
-}
-void
-AttributeList::Reset (void)
-{
- m_attributes.clear ();
-}
-AttributeList *
-AttributeList::GetGlobal (void)
-{
- return Singleton<AttributeList>::Get ();
-}
-
-std::string
-AttributeList::LookupAttributeFullNameByChecker (Ptr<const AttributeChecker> checker) const
-{
- for (uint32_t i = 0; i < TypeId::GetRegisteredN (); i++)
- {
- TypeId tid = TypeId::GetRegistered (i);
- for (uint32_t j = 0; j < tid.GetAttributeListN (); j++)
- {
- if (checker == tid.GetAttributeChecker (j))
- {
- return tid.GetAttributeFullName (j);
- }
- }
- }
- NS_FATAL_ERROR ("Could not find requested Accessor.");
- // quiet compiler.
- return "";
-}
-
-std::string
-AttributeList::SerializeToString (void) const
-{
- std::ostringstream oss;
- for (Attrs::const_iterator i = m_attributes.begin (); i != m_attributes.end (); i++)
- {
- std::string name = LookupAttributeFullNameByChecker (i->checker);
- oss << name << "=" << i->value.SerializeToString (i->checker);
- if (i != m_attributes.end ())
- {
- oss << "|";
- }
- }
- return oss.str ();
-}
-bool
-AttributeList::DeserializeFromString (std::string str)
-{
- Reset ();
-
- std::string::size_type cur;
- cur = 0;
- do {
- std::string::size_type equal = str.find ("=", cur);
- if (equal == std::string::npos)
- {
- // XXX: invalid attribute.
- break;
- }
- else
- {
- std::string name = str.substr (cur, equal-cur);
- struct TypeId::AttributeInfo info;
- if (!TypeId::LookupAttributeByFullName (name, &info))
- {
- // XXX invalid name.
- break;
- }
- else
- {
- std::string::size_type next = str.find ("|", cur);
- std::string value;
- if (next == std::string::npos)
- {
- value = str.substr (equal+1, str.size () - (equal+1));
- cur = str.size ();
- }
- else
- {
- value = str.substr (equal+1, next - (equal+1));
- cur++;
- }
- Attribute val = info.checker->Create ();
- bool ok = val.DeserializeFromString (value, info.checker);
- if (!ok)
- {
- // XXX invalid value
- break;
- }
- else
- {
- DoSetOne (info.checker, val);
- }
- }
- }
- } while (cur != str.size ());
-
- return true;
-}
-
-
-/*********************************************************************
* The Object implementation
*********************************************************************/