add ObjectVector::GetItemTypeId
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 09 Apr 2008 14:58:52 -0700
changeset 2933 c7983cfa2cb3
parent 2932 db96af55f46e
child 2934 5bdc12f09798
add ObjectVector::GetItemTypeId
src/core/attribute-test.cc
src/core/config.cc
src/core/object-vector.cc
src/core/object-vector.h
src/internet-node/ipv4-l3-protocol.cc
src/internet-node/ipv4-l4-demux.cc
src/node/node-list.cc
src/node/node.cc
--- a/src/core/attribute-test.cc	Wed Apr 09 14:28:16 2008 -0700
+++ b/src/core/attribute-test.cc	Wed Apr 09 14:58:52 2008 -0700
@@ -143,12 +143,12 @@
       .AddAttribute ("TestVector1", "help text",
 		     ObjectVector (),
 		     MakeObjectVectorAccessor (&AttributeObjectTest::m_vector1),
-		     MakeObjectVectorChecker ())
+		     MakeObjectVectorChecker<Derived> ())
       .AddAttribute ("TestVector2", "help text",
 		     ObjectVector (),
 		     MakeObjectVectorAccessor (&AttributeObjectTest::DoGetVectorN,
 						&AttributeObjectTest::DoGetVector),
-		     MakeObjectVectorChecker ())
+		     MakeObjectVectorChecker<Derived> ())
       .AddAttribute ("IntegerTraceSource1", "help text",
 		     Integer (-2),
 		     MakeIntegerAccessor (&AttributeObjectTest::m_intSrc1),
--- a/src/core/config.cc	Wed Apr 09 14:28:16 2008 -0700
+++ b/src/core/config.cc	Wed Apr 09 14:58:52 2008 -0700
@@ -512,11 +512,11 @@
     .AddAttribute ("NodesA", "",
 		   ObjectVector (),
 		   MakeObjectVectorAccessor (&MyNode::m_nodesA),
-		   MakeObjectVectorChecker ())
+		   MakeObjectVectorChecker<MyNode> ())
     .AddAttribute ("NodesB", "",
 		   ObjectVector (),
 		   MakeObjectVectorAccessor (&MyNode::m_nodesB),
-		   MakeObjectVectorChecker ())
+		   MakeObjectVectorChecker<MyNode> ())
     .AddAttribute ("NodeA", "",
                    Pointer (),
 		   MakePointerAccessor (&MyNode::m_nodeA),
--- a/src/core/object-vector.cc	Wed Apr 09 14:28:16 2008 -0700
+++ b/src/core/object-vector.cc	Wed Apr 09 14:58:52 2008 -0700
@@ -102,6 +102,4 @@
   return true;
 }
 
-ATTRIBUTE_CHECKER_IMPLEMENT (ObjectVector);
-
 } // name
--- a/src/core/object-vector.h	Wed Apr 09 14:28:16 2008 -0700
+++ b/src/core/object-vector.h	Wed Apr 09 14:58:52 2008 -0700
@@ -5,7 +5,6 @@
 #include "object.h"
 #include "ptr.h"
 #include "attribute.h"
-#include "attribute-helper.h"
 
 namespace ns3 {
 
@@ -48,8 +47,14 @@
 MakeObjectVectorAccessor (INDEX (T::*getN) (void) const,
 			  Ptr<U> (T::*get) (INDEX) const);
 
+class ObjectVectorChecker : public AttributeChecker
+{
+public:
+  virtual TypeId GetItemTypeId (void) const = 0;
+};
 
-ATTRIBUTE_CHECKER_DEFINE (ObjectVector);
+template <typename T>
+Ptr<const AttributeChecker> MakeObjectVectorChecker (void);
 
 } // namespace ns3
 
@@ -72,6 +77,36 @@
   ObjectVector m_vector;
 };
 
+
+namespace internal {
+
+template <typename T>
+class AnObjectVectorChecker : public ObjectVectorChecker
+{
+public:
+  virtual TypeId GetItemTypeId (void) const {
+    return T::GetTypeId ();
+  }
+  virtual bool Check (Attribute value) const {
+    return value.DynCast<const ObjectVectorValue *> () != 0;
+  }
+  virtual std::string GetType (void) const {
+    return "ns3::ObjectVector";
+  }
+  virtual bool HasTypeConstraints (void) const {
+    return true;
+  }
+  virtual std::string GetTypeConstraints (void) const {
+    return T::GetTypeId ().GetName ();
+  }
+  virtual Attribute Create (void) const {
+    return Attribute::Create<ObjectVectorValue> ();
+  }
+};
+
+} // namespace internal
+
+
 class ObjectVectorAccessor : public AttributeAccessor
 {
 public:
@@ -156,6 +191,13 @@
   return MakeObjectVectorAccessor (get, getN);
 }
 
+template <typename T>
+Ptr<const AttributeChecker> MakeObjectVectorChecker (void)
+{
+  return Create<internal::AnObjectVectorChecker<T> > ();
+}
+
+
 } // namespace ns3
 
 #endif /* OBJECT_VECTOR_H */
--- a/src/internet-node/ipv4-l3-protocol.cc	Wed Apr 09 14:28:16 2008 -0700
+++ b/src/internet-node/ipv4-l3-protocol.cc	Wed Apr 09 14:58:52 2008 -0700
@@ -64,7 +64,7 @@
     .AddAttribute ("InterfaceList", "The set of Ipv4 interfaces associated to this Ipv4 stack.",
                    ObjectVector (),
                    MakeObjectVectorAccessor (&Ipv4L3Protocol::m_interfaces),
-                   MakeObjectVectorChecker ())
+                   MakeObjectVectorChecker<Ipv4Interface> ())
     ;
   return tid;
 }
--- a/src/internet-node/ipv4-l4-demux.cc	Wed Apr 09 14:28:16 2008 -0700
+++ b/src/internet-node/ipv4-l4-demux.cc	Wed Apr 09 14:58:52 2008 -0700
@@ -39,7 +39,7 @@
     .AddAttribute ("Protocols", "The set of protocols registered with this demux.",
                    ObjectVector (),
                    MakeObjectVectorAccessor (&Ipv4L4Demux::m_protocols),
-                   MakeObjectVectorChecker ())
+                   MakeObjectVectorChecker<Ipv4L4Protocol> ())
     ;
   return tid;
 }
--- a/src/node/node-list.cc	Wed Apr 09 14:28:16 2008 -0700
+++ b/src/node/node-list.cc	Wed Apr 09 14:58:52 2008 -0700
@@ -63,7 +63,7 @@
     .AddAttribute ("NodeList", "The list of all nodes created during the simulation.",
                    ObjectVector (),
                    MakeObjectVectorAccessor (&NodeListPriv::m_nodes),
-                   MakeObjectVectorChecker ())
+                   MakeObjectVectorChecker<Node> ())
     ;
   return tid;
 }
--- a/src/node/node.cc	Wed Apr 09 14:28:16 2008 -0700
+++ b/src/node/node.cc	Wed Apr 09 14:58:52 2008 -0700
@@ -39,11 +39,11 @@
     .AddAttribute ("DeviceList", "The list of devices associated to this Node.",
                    ObjectVector (),
                    MakeObjectVectorAccessor (&Node::m_devices),
-                   MakeObjectVectorChecker ())
+                   MakeObjectVectorChecker<NetDevice> ())
     .AddAttribute ("ApplicationList", "The list of applications associated to this Node.",
                    ObjectVector (),
                    MakeObjectVectorAccessor (&Node::m_applications),
-                   MakeObjectVectorChecker ())
+                   MakeObjectVectorChecker<Application> ())
     .AddAttribute ("Id", "The id (unique integer) of this Node.",
                    TypeId::ATTR_GET, // allow only getting it.
                    Uinteger (0),