src/core/object-vector.h
changeset 2405 17f406c71505
child 2423 5609a96df2f6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/object-vector.h	Mon Feb 11 04:26:09 2008 +0100
@@ -0,0 +1,141 @@
+#ifndef OBJECT_VECTOR_H
+#define OBJECT_VECTOR_H
+
+#include <vector>
+#include "object.h"
+#include "ptr.h"
+#include "value.h"
+
+namespace ns3 {
+
+class ObjectVector
+{
+public:
+  typedef std::vector<Ptr<Object> >::const_iterator Iterator;
+
+  ObjectVector ();
+
+  Iterator Begin (void) const;
+  Iterator End (void) const;
+  uint32_t GetN (void) const;
+  Ptr<Object> Get (uint32_t i) const;
+
+  ObjectVector (PValue value);
+private:
+  friend class ObjectVectorParamSpec;
+  std::vector<Ptr<Object> > m_objects;
+};
+
+template <typename T, typename U>
+Ptr<ParamSpec>
+MakeObjectVectorParamSpec (U T::*memberVector);
+
+template <typename T, typename U, typename INDEX>
+Ptr<ParamSpec>
+MakeObjectVectorParamSpec (Ptr<U> (T::*get) (INDEX) const,
+			   INDEX (T::*getN) (void) const);
+
+template <typename T, typename U, typename INDEX>
+Ptr<ParamSpec>
+MakeObjectVectorParamSpec (INDEX (T::*getN) (void) const,
+			   Ptr<U> (T::*get) (INDEX) const);
+
+
+} // namespace ns3
+
+namespace ns3 {
+
+class ObjectVectorValue : public Value
+{
+public:
+  ObjectVectorValue ();
+  ObjectVectorValue (const ObjectVector &vector);
+
+  ObjectVector Get (void) const;
+
+  virtual PValue Copy (void) const;
+  virtual std::string SerializeToString (Ptr<const ParamSpec> spec) const;
+  virtual bool DeserializeFromString (std::string value, Ptr<const ParamSpec> spec);
+
+private:
+  friend class ObjectVectorParamSpec;
+  ObjectVector m_vector;
+};
+
+class ObjectVectorParamSpec : public ParamSpec
+{
+public:
+  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 GetInitialValue (void) const;
+  virtual PValue CreateValue (void) const;
+private:
+  virtual bool DoGetN (const ObjectBase *object, uint32_t *n) const = 0;
+  virtual Ptr<Object> DoGet (const ObjectBase *object, uint32_t i) const = 0;
+};
+
+template <typename T, typename U>
+Ptr<ParamSpec>
+MakeObjectVectorParamSpec (U T::*memberVector)
+{
+  struct MemberStdContainer : public ObjectVectorParamSpec
+  {
+    virtual bool DoGetN (const ObjectBase *object, uint32_t *n) const {
+      const T *obj = dynamic_cast<const T *> (object);
+      if (obj == 0)
+	{
+	  return false;
+	}
+      *n = (obj->*m_memberVector).size ();
+      return true;
+    }
+    virtual Ptr<Object> DoGet (const ObjectBase *object, uint32_t i) const {
+      const T *obj = static_cast<const T *> (object);
+      return (obj->*m_memberVector)[i];
+    }
+    U T::*m_memberVector;
+  } *spec = new MemberStdContainer ();
+  spec->m_memberVector = memberVector;
+  return Ptr<ParamSpec> (spec, false);
+}
+
+template <typename T, typename U, typename INDEX>
+Ptr<ParamSpec>
+MakeObjectVectorParamSpec (Ptr<U> (T::*get) (INDEX) const,
+			   INDEX (T::*getN) (void) const)
+{
+  struct MemberGetters : public ObjectVectorParamSpec
+  {
+    virtual bool DoGetN (const ObjectBase *object, uint32_t *n) const {
+      const T *obj = dynamic_cast<const T *> (object);
+      if (obj == 0)
+	{
+	  return false;
+	}
+      *n = (obj->*m_getN) ();
+      return true;
+    }
+    virtual Ptr<Object> DoGet (const ObjectBase *object, uint32_t i) const {
+      const T *obj = static_cast<const T *> (object);
+      return (obj->*m_get) (i);
+    }
+    Ptr<U> (T::*m_get) (INDEX) const;
+    INDEX (T::*m_getN) (void) const;
+  } *spec = new MemberGetters ();
+  spec->m_get = get;
+  spec->m_getN = getN;
+  return Ptr<ParamSpec> (spec, false);
+}
+
+template <typename T, typename U, typename INDEX>
+Ptr<ParamSpec>
+MakeObjectVectorParamSpec (INDEX (T::*getN) (void) const,
+			   Ptr<U> (T::*get) (INDEX) const)
+{
+  return MakeObjectVectorParamSpec (get, getN);
+}
+
+} // namespace ns3
+
+#endif /* OBJECT_VECTOR_H */