introduce AttributeChecker::Create and use it instead of AttributeValue::Copy.
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Sat, 01 Mar 2008 19:54:48 +0100
changeset 2520 a4896ebf6e1d
parent 2519 55057c67d4f6
child 2521 15e8f12266da
introduce AttributeChecker::Create and use it instead of AttributeValue::Copy.
src/core/attribute-helper.h
src/core/attribute.h
src/core/double.cc
src/core/enum.cc
src/core/enum.h
src/core/integer.cc
src/core/object.cc
src/core/uinteger.cc
--- a/src/core/attribute-helper.h	Sat Mar 01 05:42:14 2008 +0100
+++ b/src/core/attribute-helper.h	Sat Mar 01 19:54:48 2008 +0100
@@ -11,18 +11,19 @@
   template <typename T1>						\
   Ptr<const AttributeAccessor> Make##type##Accessor (T1 a1)		\
   {									\
-    return MakeAccessorHelper<type##Value> (a1);		\
+    return MakeAccessorHelper<type##Value> (a1);			\
   }									\
   template <typename T1, typename T2>					\
   Ptr<const AttributeAccessor> Make##type##Accessor (T1 a1, T2 a2)	\
   {									\
-    return MakeAccessorHelper<type##Value> (a1, a2);	\
+    return MakeAccessorHelper<type##Value> (a1, a2);			\
   }
 
 #define ATTRIBUTE_VALUE_DEFINE(type)					\
   class type##Value : public AttributeValue				\
   {									\
   public:								\
+    type##Value ();							\
     type##Value (const type &value);					\
     void Set (const type &value);					\
     type Get (void) const;						\
@@ -44,6 +45,8 @@
   Ptr<const AttributeChecker> Make##type##Checker (void);	\
 
 #define ATTRIBUTE_VALUE_IMPLEMENT_NO_SERIALIZE(type)			\
+  type##Value::type##Value ()						\
+    : m_value () {}							\
   type##Value::type##Value (const type &value)				\
   : m_value (value) {}							\
   void type##Value::Set (const type &v) {				\
--- a/src/core/attribute.h	Sat Mar 01 05:42:14 2008 +0100
+++ b/src/core/attribute.h	Sat Mar 01 19:54:48 2008 +0100
@@ -86,6 +86,7 @@
   void Unref (void) const;
   virtual ~AttributeChecker ();
   virtual bool Check (Attribute value) const = 0;
+  virtual Attribute Create (void) const = 0;
 private:
   mutable uint32_t m_count;
 };
@@ -141,6 +142,8 @@
 class PtrValue : public PtrValueBase
 {
 public:
+  PtrValue () 
+    : m_pointer () {}
   PtrValue (Ptr<T> pointer) 
     : m_pointer (pointer) {}
 
@@ -183,6 +186,9 @@
       }
     return true;
   }
+  virtual Attribute Create (void) const {
+    return Attribute::Create<PtrValue<T> > ();
+  }
 };
 
 /********************************************************
@@ -354,6 +360,9 @@
     virtual bool Check (Attribute value) const {
       return value.DynCast<const T *> () != 0;
     }
+    virtual Attribute Create (void) const {
+      return Attribute::Create<T> ();
+    }
   } *checker = new SimpleAttributeChecker ();
   return Ptr<AttributeChecker> (checker, false);
 }
--- a/src/core/double.cc	Sat Mar 01 05:42:14 2008 +0100
+++ b/src/core/double.cc	Sat Mar 01 19:54:48 2008 +0100
@@ -54,6 +54,9 @@
 	}
       return v->Get () >= m_minValue && v->Get () <= m_maxValue;
     }
+    virtual Attribute Create (void) const {
+      return Attribute::Create<DoubleValue> ();
+    }
     double m_minValue;
     double m_maxValue;
   } *checker = new Checker (min, max);
--- a/src/core/enum.cc	Sat Mar 01 05:42:14 2008 +0100
+++ b/src/core/enum.cc	Sat Mar 01 19:54:48 2008 +0100
@@ -4,7 +4,9 @@
 
 namespace ns3 {
 
-
+Enum::Enum ()
+  : m_v ()
+{}
 Enum::Enum (int v)
   : m_v (v)
 {}
@@ -103,6 +105,12 @@
     }
   return false;
 }
+Attribute 
+EnumChecker::Create (void) const
+{
+  return Attribute::Create<Enum> ();
+}
+
 
 Ptr<const AttributeChecker> 
 MakeEnumChecker (int v1, std::string n1,
--- a/src/core/enum.h	Sat Mar 01 05:42:14 2008 +0100
+++ b/src/core/enum.h	Sat Mar 01 19:54:48 2008 +0100
@@ -10,6 +10,7 @@
 class Enum : public AttributeValue
 {
 public:
+  Enum ();
   Enum (int v);
   void Set (int v);
   int Get (void) const;
@@ -33,6 +34,7 @@
   void Add (int v, std::string name);
 
   virtual bool Check (Attribute value) const;
+  virtual Attribute Create (void) const;
 
 private:
   friend class Enum;
--- a/src/core/integer.cc	Sat Mar 01 05:42:14 2008 +0100
+++ b/src/core/integer.cc	Sat Mar 01 19:54:48 2008 +0100
@@ -60,6 +60,9 @@
 	}
       return v->Get ().Get () >= m_minValue && v->Get ().Get() <= m_maxValue;
     }
+    virtual Attribute Create (void) const {
+      return Attribute::Create<IntegerValue> ();
+    }
     int64_t m_minValue;
     int64_t m_maxValue;
   } *checker = new IntegerChecker (min, max);
--- a/src/core/object.cc	Sat Mar 01 05:42:14 2008 +0100
+++ b/src/core/object.cc	Sat Mar 01 19:54:48 2008 +0100
@@ -860,7 +860,7 @@
           return false;
         }
       // attempt to convert back to value.
-      Attribute v = info->initialValue.Copy ();
+      Attribute v = info->checker->Create ();
       ok = v.DeserializeFromString (str->Get ().Get (), info->checker);
       if (!ok)
         {
@@ -958,7 +958,7 @@
                 value = str.substr (equal+1, next - (equal+1));
                 cur++;
               }
-            Attribute val = info.initialValue.Copy ();
+            Attribute val = info.checker->Create ();
             bool ok = val.DeserializeFromString (value, info.checker);
             if (!ok)
               {
@@ -1087,7 +1087,7 @@
           return false;
         }
       // attempt to convert back from string.
-      Attribute v = initialValue.Copy ();
+      Attribute v = checker->Create ();
       ok = v.DeserializeFromString (str->Get ().Get (), checker);
       if (!ok)
         {
@@ -1129,7 +1129,7 @@
     {
       return false;
     }
-  Attribute v = info.initialValue.Copy ();
+  Attribute v = info.checker->Create ();
   bool ok = info.accessor->Get (this, v);
   if (ok)
     {
@@ -1150,7 +1150,7 @@
     {
       return Attribute ();
     }
-  Attribute value = info.initialValue.Copy ();
+  Attribute value = info.checker->Create ();
   bool ok = info.accessor->Get (this, value);
   if (!ok)
     {
--- a/src/core/uinteger.cc	Sat Mar 01 05:42:14 2008 +0100
+++ b/src/core/uinteger.cc	Sat Mar 01 19:54:48 2008 +0100
@@ -55,6 +55,9 @@
 	}
       return v->Get ().Get () >= m_minValue && v->Get ().Get () <= m_maxValue;
     }
+    virtual Attribute Create (void) const {
+      return Attribute::Create<UintegerValue> ();
+    }
     uint64_t m_minValue;
     uint64_t m_maxValue;
   } *checker = new Checker (min, max);