introduce AttributeChecker::Create and use it instead of AttributeValue::Copy.
--- 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);