diff --git a/src/core/object.cc b/src/core/object.cc index e608b181f..ef051223a 100644 --- a/src/core/object.cc +++ b/src/core/object.cc @@ -385,8 +385,8 @@ TypeId::LookupByName (std::string name) NS_ASSERT (uid != 0); return TypeId (uid); } -Ptr -TypeId::LookupParamSpecByFullName (std::string fullName) +bool +TypeId::LookupParameterByFullName (std::string fullName, struct TypeId::ParameterInfo *info) { std::string::size_type pos = fullName.find ("::"); if (pos == std::string::npos) @@ -396,7 +396,7 @@ TypeId::LookupParamSpecByFullName (std::string fullName) std::string tidName = fullName.substr (0, pos); std::string paramName = fullName.substr (pos+2, fullName.size () - (pos+2)); TypeId tid = LookupByName (tidName); - return tid.LookupParamSpecByName (paramName); + return tid.LookupParameterByName (paramName, info); } uint32_t TypeId::GetRegisteredN (void) @@ -409,21 +409,29 @@ TypeId::GetRegistered (uint32_t i) return TypeId (Singleton::Get ()->GetRegistered (i)); } -Ptr -TypeId::LookupParamSpecByName (std::string name) const +bool +TypeId::LookupParameterByName (std::string name, struct TypeId::ParameterInfo *info) const { - for (uint32_t i = 0; i < GetParametersN (); i++) - { - std::string paramName = GetParameterName (i); - if (paramName == name) - { - return GetParameterParamSpec (i); - } - } - return 0; + TypeId tid = TypeId (0); + TypeId nextTid = *this; + do { + tid = nextTid; + for (uint32_t i = 0; i < GetParametersN (); i++) + { + std::string paramName = GetParameterName (i); + if (paramName == name) + { + info->spec = GetParameterParamSpec (i); + info->flags = GetParameterFlags (i); + return true; + } + } + nextTid = tid.GetParent (); + } while (nextTid != tid); + return false; } -Ptr -TypeId::LookupParamSpecByPosition (uint32_t i) const +bool +TypeId::LookupParameterByPosition (uint32_t i, struct TypeId::ParameterInfo *info) const { uint32_t cur = 0; TypeId tid = TypeId (0); @@ -434,13 +442,15 @@ TypeId::LookupParamSpecByPosition (uint32_t i) const { if (cur == i) { - return tid.GetParameterParamSpec (j); + info->spec = tid.GetParameterParamSpec (j); + info->flags = tid.GetParameterFlags (j); + return true; } cur++; } nextTid = tid.GetParent (); } while (nextTid != tid); - return 0; + return false; } @@ -506,7 +516,7 @@ TypeId::AddParameter (std::string name, std::string help, Ptr param) { - Singleton::Get ()->AddParameter (m_tid, name, help, 0, param); + Singleton::Get ()->AddParameter (m_tid, name, help, PARAM_SGC, param); return *this; } @@ -567,6 +577,13 @@ TypeId::GetParameterParamSpec (uint32_t i) const Ptr param = Singleton::Get ()->GetParameterParamSpec (m_tid, i); return param; } +uint32_t +TypeId::GetParameterFlags (uint32_t i) const +{ + // Used exclusively by the Object class. + uint32_t flags = Singleton::Get ()->GetParameterFlags (m_tid, i); + return flags; +} bool operator == (TypeId a, TypeId b) @@ -617,40 +634,46 @@ Parameters::~Parameters () bool Parameters::Set (std::string name, PValue value) { - Ptr spec = TypeId::LookupParamSpecByFullName (name); - bool ok = DoSet (spec, value); + struct TypeId::ParameterInfo info; + TypeId::LookupParameterByFullName (name, &info); + bool ok = DoSet (info.spec, value); return ok; } bool Parameters::Set (std::string name, std::string value) { - Ptr spec = TypeId::LookupParamSpecByFullName (name); - bool ok = DoSet (spec,value); + struct TypeId::ParameterInfo info; + TypeId::LookupParameterByFullName (name, &info); + bool ok = DoSet (info.spec,value); return ok; } void Parameters::SetWithTid (TypeId tid, std::string name, std::string value) { - Ptr spec = tid.LookupParamSpecByName (name); - DoSet (spec, value); + struct TypeId::ParameterInfo info; + tid.LookupParameterByName (name, &info); + DoSet (info.spec, value); } void Parameters::SetWithTid (TypeId tid, std::string name, PValue value) { - Ptr spec = tid.LookupParamSpecByName (name); - DoSet (spec, value); + struct TypeId::ParameterInfo info; + tid.LookupParameterByName (name, &info); + DoSet (info.spec, value); } void Parameters::SetWithTid (TypeId tid, uint32_t position, std::string value) { - Ptr spec = tid.LookupParamSpecByPosition (position); - DoSet (spec, value); + struct TypeId::ParameterInfo info; + tid.LookupParameterByPosition (position, &info); + DoSet (info.spec, value); } void Parameters::SetWithTid (TypeId tid, uint32_t position, PValue value) { - Ptr spec = tid.LookupParamSpecByPosition (position); - DoSet (spec, value); + struct TypeId::ParameterInfo info; + tid.LookupParameterByPosition (position, &info); + DoSet (info.spec, value); } void @@ -770,8 +793,8 @@ Parameters::DeserializeFromString (std::string str) else { std::string name = str.substr (cur, equal-cur); - Ptr spec = TypeId::LookupParamSpecByFullName (name); - if (spec == 0) + struct TypeId::ParameterInfo info; + if (!TypeId::LookupParameterByFullName (name, &info)) { // XXX invalid name. break; @@ -790,8 +813,8 @@ Parameters::DeserializeFromString (std::string str) value = str.substr (equal+1, next - (equal+1)); cur++; } - PValue val = spec->CreateValue (); - bool ok = val.DeserializeFromString (value, spec); + PValue val = info.spec->CreateValue (); + bool ok = val.DeserializeFromString (value, info.spec); if (!ok) { // XXX invalid value @@ -799,7 +822,7 @@ Parameters::DeserializeFromString (std::string str) } else { - DoSetOne (spec, val); + DoSetOne (info.spec, val); } } } @@ -855,6 +878,10 @@ Object::Construct (const Parameters ¶meters) Ptr paramSpec = tid.GetParameterParamSpec (i); NS_LOG_DEBUG ("try to construct \""<< tid.GetName ()<<"::"<< tid.GetParameterName (i)<<"\""); + if (!(tid.GetParameterFlags (i) & TypeId::PARAM_CONSTRUCT)) + { + continue; + } bool found = false; // is this parameter stored in this Parameters instance ? for (Parameters::Params::const_iterator j = parameters.m_parameters.begin (); @@ -901,61 +928,68 @@ Object::Construct (const Parameters ¶meters) NotifyConstructionCompleted (); } bool -Object::DoSet (std::string name, PValue value) +Object::Set (std::string name, PValue value) { - Ptr spec = m_tid.LookupParamSpecByName (name); - if (spec == 0) + struct TypeId::ParameterInfo info; + if (!m_tid.LookupParameterByName (name, &info)) { return false; } - bool ok = spec->Check (value); + if (!(info.flags & TypeId::PARAM_SET)) + { + return false; + } + bool ok = info.spec->Check (value); if (!ok) { return false; } - ok = spec->Set (this, value); + ok = info.spec->Set (this, value); return ok; } bool -Object::Set (std::string name, PValue value) -{ - return DoSet (name, value); -} -bool Object::Set (std::string name, std::string value) { - Ptr spec = m_tid.LookupParamSpecByName (name); - if (spec == 0) + struct TypeId::ParameterInfo info; + if (!m_tid.LookupParameterByName (name, &info)) { return false; } - PValue v = spec->CreateValue (); - bool ok = v.DeserializeFromString (value, spec); + if (!(info.flags & TypeId::PARAM_SET)) + { + return false; + } + PValue v = info.spec->CreateValue (); + bool ok = v.DeserializeFromString (value, info.spec); if (!ok) { return false; } - ok = spec->Check (v); + ok = info.spec->Check (v); if (!ok) { return false; } - ok = spec->Set (this, v); + ok = info.spec->Set (this, v); return ok; } bool Object::Get (std::string name, std::string &value) const { - Ptr paramSpec = m_tid.LookupParamSpecByName (name); - if (paramSpec == 0) + struct TypeId::ParameterInfo info; + if (!m_tid.LookupParameterByName (name, &info)) { return false; } - PValue v = paramSpec->CreateValue (); - bool ok = paramSpec->Get (this, v); + if (!(info.flags & TypeId::PARAM_GET)) + { + return false; + } + PValue v = info.spec->CreateValue (); + bool ok = info.spec->Get (this, v); if (ok) { - value = v.SerializeToString (paramSpec); + value = v.SerializeToString (info.spec); } return ok; } @@ -963,13 +997,17 @@ Object::Get (std::string name, std::string &value) const PValue Object::Get (std::string name) const { - Ptr paramSpec = m_tid.LookupParamSpecByName (name); - if (paramSpec == 0) + struct TypeId::ParameterInfo info; + if (!m_tid.LookupParameterByName (name, &info)) { return PValue (); } - PValue value = paramSpec->CreateValue (); - bool ok = paramSpec->Get (this, value); + if (!(info.flags & TypeId::PARAM_GET)) + { + return PValue (); + } + PValue value = info.spec->CreateValue (); + bool ok = info.spec->Get (this, value); if (!ok) { return PValue (); @@ -977,19 +1015,6 @@ Object::Get (std::string name) const return value; } -bool -Object::DoGet (std::string name, PValue parameter) const -{ - Ptr paramSpec = m_tid.LookupParamSpecByName (name); - if (paramSpec == 0) - { - return false; - } - bool ok = paramSpec->Get (this, parameter); - return ok; -} - - Ptr Object::DoQueryInterface (TypeId tid) const { diff --git a/src/core/object.h b/src/core/object.h index a7cf37d66..7da6ae27c 100644 --- a/src/core/object.h +++ b/src/core/object.h @@ -61,12 +61,12 @@ class TypeId { public: enum { - PARAM_READ = 1<<0, - PARAM_WRITE = 1<<1, + PARAM_GET = 1<<0, + PARAM_SET = 1<<1, PARAM_CONSTRUCT = 1<<2, - PARAM_RWC = PARAM_READ | PARAM_WRITE | PARAM_CONSTRUCT, - PARAM_NO_READ = 0, - PARAM_NO_WRITE = 0, + PARAM_SGC = PARAM_GET | PARAM_SET | PARAM_CONSTRUCT, + PARAM_NO_GET = 0, + PARAM_NO_SET = 0, PARAM_NO_CONSTRUCT = 0, }; @@ -240,26 +240,32 @@ private: friend bool operator == (TypeId a, TypeId b); friend bool operator != (TypeId a, TypeId b); + struct ParameterInfo { + Ptr spec; + uint32_t flags; + }; + /** * \param name the name of the requested parameter * \returns the ParamSpec associated to the requested parameter */ - Ptr LookupParamSpecByName (std::string name) const; + bool LookupParameterByName (std::string name, struct ParameterInfo *info) const; /** * \param i the position of the requested parameter * \returns the ParamSpec associated to the requested parameter */ - Ptr LookupParamSpecByPosition (uint32_t i) const; + bool LookupParameterByPosition (uint32_t i, struct ParameterInfo *info) const; /** * \param fullName the full name of the requested parameter * \returns the ParamSpec associated to the requested parameter */ - static Ptr LookupParamSpecByFullName (std::string fullName); + static bool LookupParameterByFullName (std::string fullName, struct ParameterInfo *info); explicit TypeId (uint16_t tid); void DoAddConstructor (CallbackBase callback, uint32_t nArguments); CallbackBase LookupConstructor (uint32_t nArguments) const; Ptr GetParameterParamSpec (uint32_t i) const; + uint32_t GetParameterFlags (uint32_t i) const; uint16_t m_tid; }; @@ -473,8 +479,6 @@ private: void DoTraceAll (std::ostream &os, const TraceContext &context) const; bool Check (void) const; bool CheckLoose (void) const; - bool DoSet (std::string name, PValue value); - bool DoGet (std::string name, PValue value) const; /** * Attempt to delete this object. This method iterates * over all aggregated objects to check if they all