#ifndef OBJECT_VECTOR_H #define OBJECT_VECTOR_H #include #include "object.h" #include "ptr.h" #include "attribute.h" #include "attribute-helper.h" namespace ns3 { class ObjectVector { public: typedef std::vector >::const_iterator Iterator; ObjectVector (); Iterator Begin (void) const; Iterator End (void) const; uint32_t GetN (void) const; Ptr Get (uint32_t i) const; ObjectVector (Attribute value); operator Attribute () const; private: friend class ObjectVectorAccessor; std::vector > m_objects; }; template Ptr MakeObjectVectorAccessor (U T::*memberVector); template Ptr MakeObjectVectorAccessor (Ptr (T::*get) (INDEX) const, INDEX (T::*getN) (void) const); template Ptr MakeObjectVectorAccessor (INDEX (T::*getN) (void) const, Ptr (T::*get) (INDEX) const); ATTRIBUTE_CHECKER_DEFINE (ObjectVector); } // namespace ns3 namespace ns3 { class ObjectVectorValue : public AttributeValue { public: ObjectVectorValue (); ObjectVectorValue (const ObjectVector &vector); ObjectVector Get (void) const; virtual Attribute Copy (void) const; virtual std::string SerializeToString (Ptr checker) const; virtual bool DeserializeFromString (std::string value, Ptr checker); private: friend class ObjectVectorAccessor; ObjectVector m_vector; }; class ObjectVectorAccessor : public AttributeAccessor { public: virtual bool Set (ObjectBase * object, Attribute value) const; virtual bool Get (const ObjectBase * object, Attribute value) const; private: virtual bool DoGetN (const ObjectBase *object, uint32_t *n) const = 0; virtual Ptr DoGet (const ObjectBase *object, uint32_t i) const = 0; }; template Ptr MakeObjectVectorAccessor (U T::*memberVector) { struct MemberStdContainer : public ObjectVectorAccessor { virtual bool DoGetN (const ObjectBase *object, uint32_t *n) const { const T *obj = dynamic_cast (object); if (obj == 0) { return false; } *n = (obj->*m_memberVector).size (); return true; } virtual Ptr DoGet (const ObjectBase *object, uint32_t i) const { const T *obj = static_cast (object); typename U::const_iterator begin = (obj->*m_memberVector).begin (); typename U::const_iterator end = (obj->*m_memberVector).end (); uint32_t k = 0; for (typename U::const_iterator j = begin; j != end; j++, k++) { if (k == i) { return *j; break; } } NS_ASSERT (false); // quiet compiler. return 0; } U T::*m_memberVector; } *spec = new MemberStdContainer (); spec->m_memberVector = memberVector; return Ptr (spec, false); } template Ptr MakeObjectVectorAccessor (Ptr (T::*get) (INDEX) const, INDEX (T::*getN) (void) const) { struct MemberGetters : public ObjectVectorAccessor { virtual bool DoGetN (const ObjectBase *object, uint32_t *n) const { const T *obj = dynamic_cast (object); if (obj == 0) { return false; } *n = (obj->*m_getN) (); return true; } virtual Ptr DoGet (const ObjectBase *object, uint32_t i) const { const T *obj = static_cast (object); return (obj->*m_get) (i); } Ptr (T::*m_get) (INDEX) const; INDEX (T::*m_getN) (void) const; } *spec = new MemberGetters (); spec->m_get = get; spec->m_getN = getN; return Ptr (spec, false); } template Ptr MakeObjectVectorAccessor (INDEX (T::*getN) (void) const, Ptr (T::*get) (INDEX) const) { return MakeObjectVectorAccessor (get, getN); } } // namespace ns3 #endif /* OBJECT_VECTOR_H */