#ifndef VALUE_H #define VALUE_H #include #include #include "ptr.h" #include "object-base.h" namespace ns3 { class ParamSpec; class PValue; class Value { public: Value (); Value (const Value &o); Value &operator = (const Value &o); virtual ~Value (); virtual PValue Copy (void) const = 0; virtual std::string SerializeToString (Ptr spec) const = 0; virtual bool DeserializeFromString (std::string value, Ptr spec) = 0; private: friend class PValue; uint32_t m_count; }; class PValue { public: PValue (); PValue (const PValue &o); PValue &operator = (const PValue &o); ~PValue (); PValue Copy (void) const; std::string SerializeToString (Ptr spec) const; bool DeserializeFromString (std::string value, Ptr spec); template static PValue Create (void); template static PValue Create (T1 a1); template T DynCast (void) const; template PValue (Ptr pointer); template operator Ptr (); PValue (const char *value); PValue (std::string value); private: PValue (Value *value); Value *m_value; }; class ParamSpec : public ObjectBase { public: ParamSpec (); void Ref (void) const; void Unref (void) const; virtual ~ParamSpec (); /** * \param object the object instance to set the value in * \param value the value to set * \returns true if the value is valid and it could be set * successfully, false otherwise. */ virtual bool Set (ObjectBase * object, PValue value) const = 0; virtual bool Get (const ObjectBase * object, PValue value) const = 0; virtual bool Check (PValue value) const = 0; private: mutable uint32_t m_count; }; template Ptr MakePtrParamSpec (Ptr T::*memberVariable); template Ptr MakePtrParamSpec (void (T::*setter) (Ptr)); template Ptr MakePtrParamSpec (Ptr (T::*getter) (void) const); } // namespace ns3 namespace ns3 { /******************************************************** * A class used to hold std::string values. ********************************************************/ class StringValue : public Value { public: StringValue (const char *value); StringValue (std::string value); void Set (std::string value); std::string Get (void) const; virtual PValue Copy (void) const; virtual std::string SerializeToString (Ptr spec) const; virtual bool DeserializeFromString (std::string value, Ptr spec); StringValue (PValue value); operator PValue () const; private: std::string m_value; }; /******************************************************** * The class used to access the pointer stored in a * PtrValue Value instance. ********************************************************/ class PtrValueBase : public Value { public: virtual ObjectBase *PeekObjectBase (void) const = 0; virtual bool SetObjectBase (ObjectBase *object) = 0; virtual std::string SerializeToString (Ptr spec) const; virtual bool DeserializeFromString (std::string value, Ptr spec); }; /******************************************************** * Store the content of a Ptr in a Value ********************************************************/ template class PtrValue : public PtrValueBase { public: PtrValue (Ptr pointer) : m_pointer (pointer) {} virtual ObjectBase *PeekObjectBase (void) const { return PeekPointer (m_pointer); } virtual bool SetObjectBase (ObjectBase *object) { T *ptr = dynamic_cast (object); if (ptr == 0) { return false; } m_pointer = ptr; return true; } virtual PValue Copy (void) const { return PValue::Create > (*this); } private: Ptr m_pointer; }; /******************************************************** * The implementation of the PValue * class template methods. ********************************************************/ template PValue PValue::Create (void) { return PValue (new T ()); } template PValue PValue::Create (T1 a1) { return PValue (new T (a1)); } template T PValue::DynCast (void) const { return dynamic_cast (m_value); } template PValue::PValue (Ptr pointer) : m_value (new PtrValue (pointer)) {} template PValue::operator Ptr () { PtrValueBase *value = DynCast (); if (value == 0) { return 0; } ObjectBase *objectBase = value->PeekObjectBase (); T *obj = dynamic_cast (objectBase); if (obj == 0) { return 0; } return obj; } /******************************************************** * The ParamSpec associated to * PtrValue ********************************************************/ template class PtrParamSpec : public ParamSpec { public: virtual ~PtrParamSpec () {} virtual bool Set (ObjectBase * object, PValue val) const { T *obj = dynamic_cast (object); if (obj == 0) { return false; } const PtrValueBase *value = val.DynCast (); if (value == 0) { return false; } Ptr ptr = dynamic_cast (value->PeekObjectBase ()); if (ptr == 0) { return false; } DoSet (obj, ptr); return true; } virtual bool Get (const ObjectBase * object, PValue val) const { const T *obj = dynamic_cast (object); if (obj == 0) { return false; } PtrValueBase *value = val.DynCast (); if (value == 0) { return false; } return value->SetObjectBase (PeekPointer (DoGet (obj))); } virtual bool Check (PValue val) const { const PtrValueBase *value = val.DynCast (); if (value == 0) { return false; } if (value->PeekObjectBase () == 0) { return true; } U *ptr = dynamic_cast (value->PeekObjectBase ()); if (ptr == 0) { return false; } return true; } private: virtual void DoSet (T *object, Ptr value) const = 0; virtual Ptr DoGet (const T *object) const = 0; }; template Ptr MakePtrParamSpec (Ptr T::*memberVariable) { struct MemberVariable : public PtrParamSpec { Ptr T::*m_memberVariable; virtual MemberVariable *Copy (void) const { return new MemberVariable (*this); } virtual void DoSet (T *object, Ptr value) const { (object->*m_memberVariable) = value; } virtual Ptr DoGet (const T *object) const { return object->*m_memberVariable; } } *spec = new MemberVariable (); spec->m_memberVariable = memberVariable; return Ptr (spec, false); } template Ptr MakePtrParamSpec (void (T::*setter) (Ptr)) { struct MemberMethod : public PtrParamSpec { void (T::*m_setter) (Ptr); virtual MemberMethod *Copy (void) const { return new MemberMethod (*this); } virtual void DoSet (T *object, Ptr value) const { (object->*m_setter) (value); } virtual Ptr DoGet (const T *object) const { return 0; //return (object->*m_getter) (); } } *spec = new MemberMethod (); spec->m_setter = setter; return Ptr (spec, false); } template Ptr MakePtrParamSpec (Ptr (T::*getter) (void) const) { struct MemberMethod : public PtrParamSpec { void (T::*m_getter) (Ptr); virtual MemberMethod *Copy (void) const { return new MemberMethod (*this); } virtual void DoSet (T *object, Ptr value) const { //(object->*m_setter) (value); } virtual Ptr DoGet (const T *object) const { return (object->*m_getter) (); } } *spec = new MemberMethod (); spec->m_getter = getter; return Ptr (spec, false); } } // namespace ns3 #endif /* VALUE_H */