--- 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),