#ifndef ATTRIBUTE_H #define ATTRIBUTE_H #include #include #include "ptr.h" #include "object-base.h" namespace ns3 { class AttributeAccessor; class AttributeChecker; class Attribute; class AttributeValue { public: AttributeValue (); AttributeValue (const AttributeValue &o); AttributeValue &operator = (const AttributeValue &o); virtual ~AttributeValue (); virtual Attribute Copy (void) const = 0; virtual std::string SerializeToString (Ptr checker) const = 0; virtual bool DeserializeFromString (std::string value, Ptr checker) = 0; private: friend class Attribute; uint32_t m_count; }; class Attribute { public: Attribute (); Attribute (const Attribute &o); Attribute &operator = (const Attribute &o); ~Attribute (); Attribute Copy (void) const; std::string SerializeToString (Ptr checker) const; bool DeserializeFromString (std::string value, Ptr checker); template static Attribute Create (void); template static Attribute Create (T1 a1); template T DynCast (void) const; template Attribute (Ptr pointer); template operator Ptr (); Attribute (const char *value); Attribute (std::string value); private: Attribute (AttributeValue *value); AttributeValue *m_value; }; class AttributeAccessor : public ObjectBase { public: AttributeAccessor (); void Ref (void) const; void Unref (void) const; virtual ~AttributeAccessor (); /** * \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, Attribute value) const = 0; virtual bool Get (const ObjectBase * object, Attribute value) const = 0; private: mutable uint32_t m_count; }; class AttributeChecker : public ObjectBase { public: AttributeChecker (); void Ref (void) const; void Unref (void) const; virtual ~AttributeChecker (); virtual bool Check (Attribute value) const = 0; private: mutable uint32_t m_count; }; template Ptr MakeSimpleAttributeChecker (void); template Ptr MakePtrAccessor (Ptr T::*memberVariable); template Ptr MakePtrAccessor (void (T::*setter) (Ptr)); template Ptr MakePtrAccessor (Ptr (T::*getter) (void) const); } // namespace ns3 namespace ns3 { /******************************************************** * A class used to hold std::string values. ********************************************************/ class StringValue : public AttributeValue { public: StringValue (const char *value); StringValue (std::string value); void Set (std::string value); std::string Get (void) const; virtual Attribute Copy (void) const; virtual std::string SerializeToString (Ptr checker) const; virtual bool DeserializeFromString (std::string value, Ptr checker); StringValue (Attribute value); operator Attribute () const; private: std::string m_value; }; /******************************************************** * The class used to access the pointer stored in a * PtrValue AttributeValue instance. ********************************************************/ class PtrValueBase : public AttributeValue { public: virtual ObjectBase *PeekObjectBase (void) const = 0; virtual bool SetObjectBase (ObjectBase *object) = 0; virtual std::string SerializeToString (Ptr checker) const; virtual bool DeserializeFromString (std::string value, Ptr checker); }; /******************************************************** * Store the content of a Ptr in a AttributeValue ********************************************************/ 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 Attribute Copy (void) const { return Attribute::Create > (*this); } private: Ptr m_pointer; }; /******************************************************** * The implementation of the Attribute * class template methods. ********************************************************/ template Attribute Attribute::Create (void) { return Attribute (new T ()); } template Attribute Attribute::Create (T1 a1) { return Attribute (new T (a1)); } template T Attribute::DynCast (void) const { return dynamic_cast (m_value); } template Attribute::Attribute (Ptr pointer) : m_value (new PtrValue (pointer)) {} template Attribute::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 Accessor associated to * PtrValue ********************************************************/ template class PtrAccessor : public AttributeAccessor { public: virtual ~PtrAccessor () {} virtual bool Set (ObjectBase * object, Attribute 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, Attribute 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))); } private: virtual void DoSet (T *object, Ptr value) const = 0; virtual Ptr DoGet (const T *object) const = 0; }; template Ptr MakePtrAccessor (Ptr T::*memberVariable) { struct MemberVariable : public PtrAccessor { 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 MakePtrAccessor (void (T::*setter) (Ptr)) { struct MemberMethod : public PtrAccessor { 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 MakePtrAccessor (Ptr (T::*getter) (void) const) { struct MemberMethod : public PtrAccessor { 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); } template Ptr MakePtrChecker (void) { struct PtrChecker : public AttributeChecker { virtual bool Check (Attribute val) const { const PtrValueBase *value = val.DynCast (); if (value == 0) { return false; } if (value->PeekObjectBase () == 0) { return true; } T *ptr = dynamic_cast (value->PeekObjectBase ()); if (ptr == 0) { return false; } return true; } } *checker = new PtrChecker (); return Ptr (checker, false); } template Ptr MakeSimpleAttributeChecker (void) { struct SimpleAttributeChecker : public AttributeChecker { virtual bool Check (Attribute value) const { return value.DynCast () != 0; } } *checker = new SimpleAttributeChecker (); return Ptr (checker, false); } } // namespace ns3 #endif /* ATTRIBUTE_H */