src/core/object.cc
changeset 2427 9245ec163111
parent 2426 9c9d1a49d061
child 2432 b946f13bc8cb
--- a/src/core/object.cc	Sun Feb 17 04:38:52 2008 +0100
+++ b/src/core/object.cc	Mon Feb 18 00:18:45 2008 +0100
@@ -58,12 +58,14 @@
                      std::string help, 
                      uint32_t flags,
                      ns3::PValue initialValue,
-                     ns3::Ptr<const ns3::ParamSpec> spec);
+                     ns3::Ptr<const ns3::ParamSpec> spec,
+                     ns3::Ptr<const ns3::AttributeChecker> checker);
   uint32_t GetParametersN (uint16_t uid) const;
   std::string GetParameterName (uint16_t uid, uint32_t i) const;
   uint32_t GetParameterFlags (uint16_t uid, uint32_t i) const;
   ns3::PValue GetParameterInitialValue (uint16_t uid, uint32_t i) const;
   ns3::Ptr<const ns3::ParamSpec> GetParameterParamSpec (uint16_t uid, uint32_t i) const;
+  ns3::Ptr<const ns3::AttributeChecker> GetParameterChecker (uint16_t uid, uint32_t i) const;
 private:
   struct ConstructorInformation {
     ns3::CallbackBase cb;
@@ -75,6 +77,7 @@
     uint32_t flags;
     ns3::PValue initialValue;
     ns3::Ptr<const ns3::ParamSpec> param;
+    ns3::Ptr<const ns3::AttributeChecker> checker;
   };
   struct IidInformation {
     std::string name;
@@ -244,7 +247,8 @@
                           std::string help, 
                           uint32_t flags,
                           ns3::PValue initialValue,
-                          ns3::Ptr<const ns3::ParamSpec> spec)
+                          ns3::Ptr<const ns3::ParamSpec> spec,
+                          ns3::Ptr<const ns3::AttributeChecker> checker)
 {
   struct IidInformation *information = LookupInformation (uid);
   for (std::vector<struct ParameterInformation>::const_iterator j = information->parameters.begin ();
@@ -262,6 +266,7 @@
   param.flags = flags;
   param.initialValue = initialValue;
   param.param = spec;
+  param.checker = checker;
   information->parameters.push_back (param);
 }
 
@@ -300,6 +305,13 @@
   NS_ASSERT (i < information->parameters.size ());
   return information->parameters[i].param;
 }
+ns3::Ptr<const ns3::AttributeChecker>
+IidManager::GetParameterChecker (uint16_t uid, uint32_t i) const
+{
+  struct IidInformation *information = LookupInformation (uid);
+  NS_ASSERT (i < information->parameters.size ());
+  return information->parameters[i].checker;
+}
 
 } // anonymous namespace
 
@@ -437,6 +449,7 @@
             info->spec = GetParameterParamSpec (i);
             info->flags = GetParameterFlags (i);
             info->initialValue = tid.GetParameterInitialValue (i);
+            info->checker = tid.GetParameterChecker (i);
             return true;
           }
       }
@@ -459,6 +472,7 @@
             info->spec = tid.GetParameterParamSpec (j);
             info->flags = tid.GetParameterFlags (j);
             info->initialValue = tid.GetParameterInitialValue (j);
+            info->checker = tid.GetParameterChecker (j);
             return true;
           }
         cur++;
@@ -530,9 +544,10 @@
 TypeId::AddParameter (std::string name,
                       std::string help, 
                       PValue initialValue,
-                      Ptr<const ParamSpec> param)
+                      Ptr<const ParamSpec> param,
+                      Ptr<const AttributeChecker> checker)
 {
-  Singleton<IidManager>::Get ()->AddParameter (m_tid, name, help, PARAM_SGC, initialValue, param);
+  Singleton<IidManager>::Get ()->AddParameter (m_tid, name, help, PARAM_SGC, initialValue, param, checker);
   return *this;
 }
 
@@ -541,9 +556,10 @@
                       std::string help, 
                       uint32_t flags,
                       PValue initialValue,
-                      Ptr<const ParamSpec> param)
+                      Ptr<const ParamSpec> param,
+                      Ptr<const AttributeChecker> checker)
 {
-  Singleton<IidManager>::Get ()->AddParameter (m_tid, name, help, flags, initialValue, param);
+  Singleton<IidManager>::Get ()->AddParameter (m_tid, name, help, flags, initialValue, param, checker);
   return *this;
 }
 
@@ -607,6 +623,13 @@
   uint32_t flags = Singleton<IidManager>::Get ()->GetParameterFlags (m_tid, i);
   return flags;
 }
+Ptr<const AttributeChecker>
+TypeId::GetParameterChecker (uint32_t i) const
+{
+  // Used exclusively by the Object class.
+  Ptr<const AttributeChecker> checker = Singleton<IidManager>::Get ()->GetParameterChecker (m_tid, i);
+  return checker;
+}
 
 
 bool operator == (TypeId a, TypeId b)
@@ -631,7 +654,7 @@
   for (Params::const_iterator i = o.m_parameters.begin (); i != o.m_parameters.end (); i++)
     {
       struct Param param;
-      param.spec = i->spec;
+      param.checker = i->checker;
       param.value = i->value.Copy ();
       m_parameters.push_back (param);
     }
@@ -643,7 +666,7 @@
   for (Params::const_iterator i = o.m_parameters.begin (); i != o.m_parameters.end (); i++)
     {
       struct Param param;
-      param.spec = i->spec;
+      param.checker = i->checker;
       param.value = i->value.Copy ();
       m_parameters.push_back (param);
     }
@@ -678,13 +701,13 @@
 }
 
 void
-Parameters::DoSetOne (Ptr<const ParamSpec> spec, PValue value)
+Parameters::DoSetOne (Ptr<const AttributeChecker> checker, PValue value)
 {
   // get rid of any previous value stored in this
   // vector of values.
   for (Params::iterator k = m_parameters.begin (); k != m_parameters.end (); k++)
     {
-      if (k->spec == spec)
+      if (k->checker == checker)
         {
           m_parameters.erase (k);
           break;
@@ -692,18 +715,18 @@
     }
   // store the new value.
   struct Param p;
-  p.spec = spec;
+  p.checker = checker;
   p.value = value.Copy ();
   m_parameters.push_back (p);
 }
 bool
 Parameters::DoSet (struct TypeId::ParameterInfo *info, PValue value)
 {
-  if (info->spec == 0)
+  if (info->checker == 0)
     {
       return false;
     }
-  bool ok = info->spec->Check (value);
+  bool ok = info->checker->Check (value);
   if (!ok)
     {
       // attempt to convert to string.
@@ -714,19 +737,19 @@
         }
       // attempt to convert back to value.
       PValue v = info->initialValue.Copy ();
-      ok = v.DeserializeFromString (str->Get (), info->spec);
+      ok = v.DeserializeFromString (str->Get (), info->checker);
       if (!ok)
         {
           return false;
         }
-      ok = info->spec->Check (v);
+      ok = info->checker->Check (v);
       if (!ok)
         {
           return false;
         }
       value = v;
     }
-  DoSetOne (info->spec, value);
+  DoSetOne (info->checker, value);
   return true;
 }
 void 
@@ -741,14 +764,14 @@
 }
 
 std::string
-Parameters::LookupParameterFullNameByParamSpec (Ptr<const ParamSpec> spec) const
+Parameters::LookupParameterFullNameByChecker (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.GetParametersN (); j++)
         {
-          if (spec == tid.GetParameterParamSpec (j))
+          if (checker == tid.GetParameterChecker (j))
             {
               return tid.GetParameterFullName (j);
             }
@@ -765,8 +788,8 @@
   std::ostringstream oss;
   for (Params::const_iterator i = m_parameters.begin (); i != m_parameters.end (); i++)
     {
-      std::string name = LookupParameterFullNameByParamSpec (i->spec);
-      oss << name << "=" << i->value.SerializeToString (PeekPointer (i->spec));
+      std::string name = LookupParameterFullNameByChecker (i->checker);
+      oss << name << "=" << i->value.SerializeToString (i->checker);
       if (i != m_parameters.end ())
         {
           oss << "|";
@@ -812,7 +835,7 @@
                 cur++;
               }
             PValue val = info.initialValue.Copy ();
-            bool ok = val.DeserializeFromString (value, info.spec);
+            bool ok = val.DeserializeFromString (value, info.checker);
             if (!ok)
               {
                 // XXX invalid value
@@ -820,7 +843,7 @@
               }
             else
               {
-                DoSetOne (info.spec, val);
+                DoSetOne (info.checker, val);
               }
           }
       }
@@ -875,6 +898,7 @@
       {
         Ptr<const ParamSpec> paramSpec = tid.GetParameterParamSpec (i);
         PValue initial = tid.GetParameterInitialValue (i);
+        Ptr<const AttributeChecker> checker = tid.GetParameterChecker (i);
         NS_LOG_DEBUG ("try to construct \""<< tid.GetName ()<<"::"<<
                       tid.GetParameterName (i)<<"\"");
         if (!(tid.GetParameterFlags (i) & TypeId::PARAM_CONSTRUCT))
@@ -886,10 +910,10 @@
         for (Parameters::Params::const_iterator j = parameters.m_parameters.begin ();
              j != parameters.m_parameters.end (); j++)
           {
-            if (j->spec == paramSpec)
+            if (j->checker == checker)
               {
                 // We have a matching parameter value.
-                DoSet (paramSpec, initial, j->value);
+                DoSet (paramSpec, initial, checker, j->value);
                 NS_LOG_DEBUG ("construct \""<< tid.GetName ()<<"::"<<
                               tid.GetParameterName (i)<<"\"");
                 found = true;
@@ -902,10 +926,10 @@
             for (Parameters::Params::const_iterator j = Parameters::GetGlobal ()->m_parameters.begin ();
                  j != Parameters::GetGlobal ()->m_parameters.end (); j++)
               {
-                if (j->spec == paramSpec)
+                if (j->checker == checker)
                   {
                     // We have a matching parameter value.
-                    DoSet (paramSpec, initial, j->value);
+                    DoSet (paramSpec, initial, checker, j->value);
                     NS_LOG_DEBUG ("construct \""<< tid.GetName ()<<"::"<<
                                   tid.GetParameterName (i)<<"\" from global");
                     found = true;
@@ -926,9 +950,10 @@
   NotifyConstructionCompleted ();
 }
 bool
-Object::DoSet (Ptr<const ParamSpec> spec, PValue initialValue, PValue value)
+Object::DoSet (Ptr<const ParamSpec> spec, PValue initialValue, 
+               Ptr<const AttributeChecker> checker, PValue value)
 {
-  bool ok = spec->Check (value);
+  bool ok = checker->Check (value);
   if (!ok)
     {
       // attempt to convert to string
@@ -939,12 +964,12 @@
         }
       // attempt to convert back from string.
       PValue v = initialValue.Copy ();
-      ok = v.DeserializeFromString (str->Get (), spec);
+      ok = v.DeserializeFromString (str->Get (), checker);
       if (!ok)
         {
           return false;
         }
-      ok = spec->Check (v);
+      ok = checker->Check (v);
       if (!ok)
         {
           return false;
@@ -966,7 +991,7 @@
     {
       return false;
     }
-  return DoSet (info.spec, info.initialValue, value);
+  return DoSet (info.spec, info.initialValue, info.checker, value);
 }
 bool 
 Object::Get (std::string name, std::string &value) const
@@ -984,7 +1009,7 @@
   bool ok = info.spec->Get (this, v);
   if (ok)
     {
-      value = v.SerializeToString (info.spec);
+      value = v.SerializeToString (info.checker);
     }
   return ok;
 }