diff --git a/src/core/boolean-value.h b/src/core/boolean-value.h index a9f1a4dd0..a8473e7cb 100644 --- a/src/core/boolean-value.h +++ b/src/core/boolean-value.h @@ -49,7 +49,7 @@ namespace ns3 { template Ptr MakeBooleanParamSpec (bool T::*v, bool initialValue) { - return Create > (v, initialValue); + return MakeMemberVariableParamSpec (v, BooleanValue (initialValue)); } template @@ -57,21 +57,21 @@ Ptr MakeBooleanParamSpec (void (T::*setter) (bool), bool (T::*getter) (void) const, bool initialValue) { - return Create > (setter, getter, initialValue); + return MakeMemberMethodParamSpec (setter, getter, BooleanValue (initialValue)); } template Ptr MakeBooleanParamSpec (bool (T::*getter) (void) const, bool initialValue) { - return Create > (getter, initialValue); + return MakeMemberMethodGetterParamSpec (getter, BooleanValue (initialValue)); } template Ptr MakeBooleanParamSpec (void (T::*setter) (bool), bool initialValue) { - return Create > (setter, initialValue); + return MakeMemberMethodSetterParamSpec (setter, BooleanValue (initialValue)); } } // namespace ns3 diff --git a/src/core/int-value.cc b/src/core/int-value.cc new file mode 100644 index 000000000..2ea001a61 --- /dev/null +++ b/src/core/int-value.cc @@ -0,0 +1,75 @@ +#include "int-value.h" +#include "object.h" +#include + +namespace ns3 { + +IntValue::IntValue (int64_t value) + : m_value (value) +{} +PValue +IntValue::Copy (void) const +{ + return PValue::Create (*this); +} + +void +IntValue::Set (int64_t value) +{ + m_value = value; +} +int64_t +IntValue::Get (void) const +{ + return m_value; +} +std::string +IntValue::SerializeToString (Ptr spec) const +{ + std::ostringstream oss; + oss << m_value; + return oss.str (); +} +bool +IntValue::DeserializeFromString (std::string value, Ptr spec) +{ + int64_t v; + std::istringstream iss; + iss.str (value); + iss >> v; + bool ok = !iss.bad () && !iss.fail (); + if (ok) + { + m_value = v; + } + return ok; +} + +IntValue::IntValue (PValue value) +{ + const IntValue *v = value.DynCast (); + if (v == 0) + { + NS_FATAL_ERROR ("assigning non-Int value to Int value."); + } + m_value = v->m_value; +} +IntValue::operator PValue () const +{ + return PValue::Create (*this); +} + + +IntValueChecker::IntValueChecker (int64_t minValue, int64_t maxValue) + : m_minValue (minValue), + m_maxValue (maxValue) +{} +bool +IntValueChecker::Check (const int64_t &value) const +{ + return value >= m_minValue && value <= m_maxValue; +} + + + +} // namespace ns3 diff --git a/src/core/int-value.h b/src/core/int-value.h new file mode 100644 index 000000000..eaf98768d --- /dev/null +++ b/src/core/int-value.h @@ -0,0 +1,105 @@ +#ifndef INT_VALUE_H +#define INT_VALUE_H + +#include "value.h" +#include "param-spec-helper.h" +#include + +namespace ns3 { + +class IntValue : public Value +{ +public: + IntValue (int64_t value); + void Set (int64_t value); + int64_t Get (void) const; + + virtual PValue Copy (void) const; + virtual std::string SerializeToString (Ptr spec) const; + virtual bool DeserializeFromString (std::string value, Ptr spec); + + IntValue (PValue value); + operator PValue () const; +private: + int64_t m_value; +}; + +template +Ptr MakeIntParamSpec (U T::*memberVariable, + int64_t initialValue); +template +Ptr MakeIntParamSpec (U T::*memberVariable, + int64_t initialValue, + int64_t minValue, + int64_t maxValue); +template +Ptr MakeIntParamSpec (void (T::*setter) (U), + U (T::*getter) (void) const, + int64_t initialValue); +template +Ptr MakeIntParamSpec (void (T::*setter) (U), + U (T::*getter) (void) const, + int64_t initialValue, + int64_t minValue, + int64_t maxValue); + +} // namespace ns3 + +namespace ns3 { + +class IntValueChecker +{ +public: + IntValueChecker (int64_t minValue, int64_t maxValue); + bool Check (const int64_t &value) const; +private: + int64_t m_minValue; + int64_t m_maxValue; +}; + + +template +Ptr +MakeIntParamSpec (U T::*memberVariable, + int64_t initialValue) +{ + int64_t minValue = std::numeric_limits::min (); + int64_t maxValue = std::numeric_limits::max (); + return MakeMemberVariableParamSpecWithChecker (memberVariable, IntValue (initialValue), + IntValueChecker (minValue, maxValue)); +} + +template +Ptr MakeIntParamSpec (U T::*memberVariable, + int64_t initialValue, + int64_t minValue, + int64_t maxValue) +{ + return MakeMemberVariableParamSpecWithChecker (memberVariable, IntValue (initialValue), + IntValueChecker (minValue, maxValue)); +} +template +Ptr MakeIntParamSpec (void (T::*setter) (U), + U (T::*getter) (void) const, + int64_t initialValue) +{ + int64_t minValue = std::numeric_limits::min (); + int64_t maxValue = std::numeric_limits::max (); + return MakeMemberMethodParamSpecWithChecker (setter, getter, IntValue (initialValue), + IntValueChecker (minValue, maxValue)); +} +template +Ptr MakeIntParamSpec (void (T::*setter) (U), + U (T::*getter) (void) const, + int64_t initialValue, + int64_t minValue, + int64_t maxValue) +{ + return MakeMemberMethodParamSpecWithChecker (setter, getter, IntValue (initialValue), + IntValueChecker (minValue, maxValue)); +} + + +} // namespace ns3 + +#endif /* INT_VALUE_H */ diff --git a/src/core/object.cc b/src/core/object.cc index c15400f86..dac166c7d 100644 --- a/src/core/object.cc +++ b/src/core/object.cc @@ -908,12 +908,13 @@ Object::DoSet (std::string name, PValue value) { return false; } - bool ok = spec->Set (this, value); + bool ok = spec->Check (value); if (!ok) { return false; } - return true; + ok = spec->Set (this, value); + return ok; } bool Object::Set (std::string name, PValue value) @@ -934,12 +935,13 @@ Object::Set (std::string name, std::string value) { return false; } - spec->Set (this, v); + ok = spec->Check (v); if (!ok) { return false; } - return true; + ok = spec->Set (this, v); + return ok; } bool Object::Get (std::string name, std::string &value) const diff --git a/src/core/param-spec-helper.h b/src/core/param-spec-helper.h index c5de1fd95..5e024893e 100644 --- a/src/core/param-spec-helper.h +++ b/src/core/param-spec-helper.h @@ -4,90 +4,202 @@ namespace ns3 { template +Ptr +MakeMemberVariableParamSpec (U T::*memberVariable, V initialValue); + +template +Ptr +MakeMemberMethodParamSpec (void (T::*setter) (U), + U (T::*getter) (void) const, + V initialValue); + + +} // namespace ns3 + + +/*************************************************************** + * The implementation of the above class functions + ***************************************************************/ + +namespace ns3 { + +template class ParamSpecHelper : public ParamSpec { public: - ParamSpecHelper (V initialValue); + ParamSpecHelper (PValue initialValue, CHECKER checker); virtual bool Set (ObjectBase * object, PValue value) const; virtual bool Get (const ObjectBase * object, PValue value) const; virtual bool Check (PValue value) const; virtual PValue CreateInitialValue (void) const; private: - virtual void DoSet (T *object, const V &v) const = 0; - virtual V DoGet (const T *object) const = 0; - virtual bool DoCheck (const V &v) const; - V m_initialValue; + virtual void DoSet (T *object, const U *v) const = 0; + virtual void DoGet (const T *object, U *v) const = 0; + PValue m_initialValue; + CHECKER m_checker; }; -template -class MemberVariableParamSpecHelper : public ParamSpecHelper +template +class ParamSpecHelperSimpleChecker { public: - MemberVariableParamSpecHelper (V T::*memberVariable, V initialValue); -private: - virtual void DoSet (T *object, const V &v) const; - virtual V DoGet (const T *object) const; - - V T::*m_memberVariable; + bool Check (const T &value) const {return true;} }; -template -class MemberMethodParamSpecHelper : public ParamSpecHelper + + +template +Ptr +MakeMemberVariableParamSpecWithChecker (U T::*memberVariable, V initialValue, CHECKER checker) { -public: - MemberMethodParamSpecHelper (void (T::*setter) (V), - V (T::*getter) (void) const, - V initialValue); -private: - virtual void DoSet (T *object, const V &v) const; - virtual V DoGet (const T *object) const; - - void (T::*m_setter) (V); - V (T::*m_getter) (void) const; -}; + class MemberVariable : public ParamSpecHelper + { + public: + MemberVariable (U T::*memberVariable, V initialValue, CHECKER checker) + : ParamSpecHelper (initialValue, checker), + m_memberVariable (memberVariable) + {} + private: + virtual void DoSet (T *object, const V *v) const { + (object->*m_memberVariable) = v->Get (); + } + virtual void DoGet (const T *object, V *v) const { + v->Set (object->*m_memberVariable); + } + + U T::*m_memberVariable; + }; + return Ptr (new MemberVariable (memberVariable, initialValue, checker), false); +} template -class MemberMethodSetterParamSpecHelper : public ParamSpecHelper +Ptr +MakeMemberVariableParamSpec (U T::*memberVariable, V initialValue) { -public: - MemberMethodSetterParamSpecHelper (void (T::*setter) (V), - V initialValue); -private: - virtual void DoSet (T *object, const V &v) const; - virtual V DoGet (const T *object) const; + return MakeMemberVariableParamSpecWithChecker (memberVariable, initialValue, + ParamSpecHelperSimpleChecker ()); +} - void (T::*m_setter) (V); -}; - -template -class MemberMethodGetterParamSpecHelper : public ParamSpecHelper +template +Ptr +MakeMemberMethodParamSpecWithChecker (void (T::*setter) (U), + U (T::*getter) (void) const, + V initialValue, CHECKER checker) { -public: - MemberMethodGetterParamSpecHelper (V (T::*getter) (void) const); -private: - virtual void DoSet (T *object, const V &v) const; - virtual V DoGet (const T *object) const; + class MemberMethod : public ParamSpecHelper + { + public: + MemberMethod (void (T::*setter) (U), + U (T::*getter) (void) const, + V initialValue, CHECKER checker) + : ParamSpecHelper (initialValue, checker), + m_setter (setter), + m_getter (getter) + {} + private: + virtual void DoSet (T *object, const V *v) const { + (object->*m_setter) (v->Get ()); + } + virtual void DoGet (const T *object, V *v) const { + v->Set ((object->*m_getter) ()); + } + void (T::*m_setter) (U); + U (T::*m_getter) (void) const; + }; + return Ptr (new MemberMethod (setter, getter, initialValue, checker), false); +} - V (T::*m_getter) (void) const; -}; - -} // namespace ns3 - - -/*************************************************************** - * The implementation of the above class templates. - ***************************************************************/ - -namespace ns3 { template -ParamSpecHelper::ParamSpecHelper (V initialValue) - : m_initialValue (initialValue) +Ptr +MakeMemberMethodParamSpec (void (T::*setter) (U), + U (T::*getter) (void) const, + V initialValue) +{ + return MakeMemberMethodParamSpecWithChecker (setter, getter, initialValue, + ParamSpecHelperSimpleChecker ()); +} + + +template +Ptr +MakeMemberMethodGetterParamSpecWithChecker (U (T::*getter) (void) const, + V initialValue, CHECKER checker) +{ + class MemberMethod : public ParamSpecHelper + { + public: + MemberMethod (U (T::*getter) (void) const, + V initialValue, CHECKER checker) + : ParamSpecHelper (initialValue, checker), + m_getter (getter) + {} + private: + virtual void DoSet (T *object, const V *v) const {} + virtual void DoGet (const T *object, V *v) const { + v->Set ((object->*m_getter) ()); + } + U (T::*m_getter) (void) const; + }; + return Ptr (new MemberMethod (getter, initialValue, checker), false); +} + + +template +Ptr +MakeMemberMethodGetterParamSpec (U (T::*getter) (void) const, + V initialValue) +{ + return MakeMemberMethodParamSpecWithChecker (getter, initialValue, + ParamSpecHelperSimpleChecker ()); +} + + +template +Ptr +MakeMemberMethodSetterParamSpecWithChecker (void (T::*setter) (U), + V initialValue, CHECKER checker) +{ + class MemberMethod : public ParamSpecHelper + { + public: + MemberMethod (void (T::*setter) (U), + V initialValue, CHECKER checker) + : ParamSpecHelper (initialValue, checker), + m_setter (setter) + {} + private: + virtual void DoSet (T *object, const V *v) const { + (object->*m_setter) (v->Get ()); + } + virtual void DoGet (const T *object, V *v) const { + v->Set ((object->*m_setter) ()); + } + void (T::*m_setter) (U); + }; + return Ptr (new MemberMethod (setter, initialValue, checker), false); +} + + +template +Ptr +MakeMemberMethodParamSpec (void (T::*setter) (U), + V initialValue) +{ + return MakeMemberMethodSetterParamSpecWithChecker (setter, initialValue, + ParamSpecHelperSimpleChecker ()); +} + + +template +ParamSpecHelper::ParamSpecHelper (PValue initialValue, CHECKER checker) + : m_initialValue (initialValue), + m_checker (checker) {} -template +template bool -ParamSpecHelper::Set (ObjectBase * object, PValue val) const +ParamSpecHelper::Set (ObjectBase * object, PValue val) const { const U *value = val.DynCast (); if (value == 0) @@ -99,13 +211,12 @@ ParamSpecHelper::Set (ObjectBase * object, PValue val) const { return false; } - V v = value->Get (); - DoSet (obj, v); + DoSet (obj, value); return true; } -template +template bool -ParamSpecHelper::Get (const ObjectBase * object, PValue val) const +ParamSpecHelper::Get (const ObjectBase * object, PValue val) const { U *value = val.DynCast (); if (value == 0) @@ -117,111 +228,27 @@ ParamSpecHelper::Get (const ObjectBase * object, PValue val) const { return false; } - V v = DoGet (obj); - value->Set (v); + DoGet (obj, value); return true; } -template +template bool -ParamSpecHelper::Check (PValue value) const +ParamSpecHelper::Check (PValue value) const { const U *val = value.DynCast (); if (val == 0) { return false; } - V v = val->Get (); - DoCheck (v); - return true; + return m_checker.Check (val->Get ()); } -template -bool -ParamSpecHelper::DoCheck (const V &v) const -{ - return true; -} -template +template PValue -ParamSpecHelper::CreateInitialValue (void) const +ParamSpecHelper::CreateInitialValue (void) const { - return PValue::Create (m_initialValue); + return m_initialValue; } - -template -MemberVariableParamSpecHelper::MemberVariableParamSpecHelper (V T::*memberVariable, V initialValue) - : ParamSpecHelper (initialValue), - m_memberVariable (memberVariable) -{} -template -void -MemberVariableParamSpecHelper::DoSet (T *object, const V &v) const -{ - (object->*m_memberVariable) = v; -} -template -V -MemberVariableParamSpecHelper::DoGet (const T *object) const -{ - return (object->*m_memberVariable); -} - -template -MemberMethodParamSpecHelper::MemberMethodParamSpecHelper (void (T::*setter) (V), - V (T::*getter) (void) const, - V initialValue) - : ParamSpecHelper (initialValue), - m_setter (setter), - m_getter (getter) -{} -template -void -MemberMethodParamSpecHelper::DoSet (T *object, const V &v) const -{ - (object->*m_setter) (v); -} -template -V -MemberMethodParamSpecHelper::DoGet (const T *object) const -{ - return (object->*m_getter) (); -} - -template -MemberMethodSetterParamSpecHelper::MemberMethodSetterParamSpecHelper (void (T::*setter) (V), - V initialValue) - : ParamSpecHelper (initialValue), - m_setter (setter) -{} -template -void -MemberMethodSetterParamSpecHelper::DoSet (T *object, const V &v) const -{ - (object->m_setter) (v); -} -template -V -MemberMethodSetterParamSpecHelper::DoGet (const T *object) const -{ - return V (); -} - -template -MemberMethodGetterParamSpecHelper::MemberMethodGetterParamSpecHelper (V (T::*getter) (void) const) - : m_getter (getter) -{} -template -void -MemberMethodGetterParamSpecHelper::DoSet (T *object, const V &v) const -{} -template -V -MemberMethodGetterParamSpecHelper::DoGet (const T *object) const -{ - return (object->*m_getter) (); -} - - } // namespace ns3 #endif /* PARAM_SPEC_HELPER_H */ diff --git a/src/core/value-test.cc b/src/core/value-test.cc index 993a2de2e..c1786539f 100644 --- a/src/core/value-test.cc +++ b/src/core/value-test.cc @@ -2,8 +2,8 @@ #include "test.h" #include "object.h" #include "boolean-value.h" -#if 0 #include "int-value.h" +#if 0 #include "uint-value.h" #include "fp-value.h" #include "enum-value.h" @@ -48,15 +48,17 @@ public: false)) .AddParameter ("TestPtr", "help text", MakePtrParamSpec (&ParamSpecObjectTest::m_derived)) -#if 0 .AddParameter ("TestInt16", "help text", - MakeIntParamSpec (-2, &ParamSpecObjectTest::m_int16)) + MakeIntParamSpec (&ParamSpecObjectTest::m_int16, + -2)) .AddParameter ("TestInt16WithBounds", "help text", - MakeIntParamSpec (-2, -5, 10, - &ParamSpecObjectTest::m_int16WithBounds)) + MakeIntParamSpec (&ParamSpecObjectTest::m_int16WithBounds, + -2, -5, 10)) .AddParameter ("TestInt16SetGet", "help text", - MakeIntParamSpec (6, &ParamSpecObjectTest::DoSetInt16, - &ParamSpecObjectTest::DoGetInt16)) + MakeIntParamSpec (&ParamSpecObjectTest::DoSetInt16, + &ParamSpecObjectTest::DoGetInt16, + 6)) +#if 0 .AddParameter ("TestUint8", "help text", MakeUintParamSpec (1, &ParamSpecObjectTest::m_uint8)) .AddParameter ("TestFloat", "help text", @@ -175,7 +177,6 @@ ParamSpecTest::RunTests (void) derived = p->Get ("TestPtr"); NS_TEST_ASSERT (derived != 0); -#if 0 CHECK_GET_STR (p, "TestInt16", "-2"); CHECK_GET_PARAM (p, "TestInt16", IntValue, -2); @@ -222,7 +223,8 @@ ParamSpecTest::RunTests (void) NS_TEST_ASSERT (p->Set ("TestInt16SetGet", IntValue (0))); CHECK_GET_STR (p, "TestInt16SetGet", "0"); CHECK_GET_PARAM (p, "TestInt16SetGet", IntValue, 0); - + +#if 0 CHECK_GET_STR (p, "TestUint8", "1"); CHECK_GET_PARAM (p, "TestUint8", UintValue, 1); NS_TEST_ASSERT (p->Set ("TestUint8", UintValue (0))); diff --git a/src/core/wscript b/src/core/wscript index 7105cae14..2c51687d7 100644 --- a/src/core/wscript +++ b/src/core/wscript @@ -56,6 +56,7 @@ def build(bld): 'value.cc', 'boolean-value.cc', 'value-test.cc', + 'int-value.cc', ] if sys.platform == 'win32':