From a75e91cc03526ff25530b9f32a39c55492fce3b2 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Wed, 9 Apr 2008 14:58:52 -0700 Subject: [PATCH] add ObjectVector::GetItemTypeId --- src/core/attribute-test.cc | 4 +-- src/core/config.cc | 4 +-- src/core/object-vector.cc | 2 -- src/core/object-vector.h | 46 +++++++++++++++++++++++++-- src/internet-node/ipv4-l3-protocol.cc | 2 +- src/internet-node/ipv4-l4-demux.cc | 2 +- src/node/node-list.cc | 2 +- src/node/node.cc | 4 +-- 8 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/core/attribute-test.cc b/src/core/attribute-test.cc index af261e891..8156c296a 100644 --- a/src/core/attribute-test.cc +++ b/src/core/attribute-test.cc @@ -143,12 +143,12 @@ public: .AddAttribute ("TestVector1", "help text", ObjectVector (), MakeObjectVectorAccessor (&AttributeObjectTest::m_vector1), - MakeObjectVectorChecker ()) + MakeObjectVectorChecker ()) .AddAttribute ("TestVector2", "help text", ObjectVector (), MakeObjectVectorAccessor (&AttributeObjectTest::DoGetVectorN, &AttributeObjectTest::DoGetVector), - MakeObjectVectorChecker ()) + MakeObjectVectorChecker ()) .AddAttribute ("IntegerTraceSource1", "help text", Integer (-2), MakeIntegerAccessor (&AttributeObjectTest::m_intSrc1), diff --git a/src/core/config.cc b/src/core/config.cc index cf2e75eb0..8e147346d 100644 --- a/src/core/config.cc +++ b/src/core/config.cc @@ -512,11 +512,11 @@ TypeId MyNode::GetTypeId (void) .AddAttribute ("NodesA", "", ObjectVector (), MakeObjectVectorAccessor (&MyNode::m_nodesA), - MakeObjectVectorChecker ()) + MakeObjectVectorChecker ()) .AddAttribute ("NodesB", "", ObjectVector (), MakeObjectVectorAccessor (&MyNode::m_nodesB), - MakeObjectVectorChecker ()) + MakeObjectVectorChecker ()) .AddAttribute ("NodeA", "", Pointer (), MakePointerAccessor (&MyNode::m_nodeA), diff --git a/src/core/object-vector.cc b/src/core/object-vector.cc index 618946fac..1c5d86993 100644 --- a/src/core/object-vector.cc +++ b/src/core/object-vector.cc @@ -102,6 +102,4 @@ ObjectVectorAccessor::Get (const ObjectBase * object, Attribute value) const return true; } -ATTRIBUTE_CHECKER_IMPLEMENT (ObjectVector); - } // name diff --git a/src/core/object-vector.h b/src/core/object-vector.h index 545d9c6ea..ef257c350 100644 --- a/src/core/object-vector.h +++ b/src/core/object-vector.h @@ -5,7 +5,6 @@ #include "object.h" #include "ptr.h" #include "attribute.h" -#include "attribute-helper.h" namespace ns3 { @@ -48,8 +47,14 @@ Ptr MakeObjectVectorAccessor (INDEX (T::*getN) (void) const, Ptr (T::*get) (INDEX) const); +class ObjectVectorChecker : public AttributeChecker +{ +public: + virtual TypeId GetItemTypeId (void) const = 0; +}; -ATTRIBUTE_CHECKER_DEFINE (ObjectVector); +template +Ptr MakeObjectVectorChecker (void); } // namespace ns3 @@ -72,6 +77,36 @@ private: ObjectVector m_vector; }; + +namespace internal { + +template +class AnObjectVectorChecker : public ObjectVectorChecker +{ +public: + virtual TypeId GetItemTypeId (void) const { + return T::GetTypeId (); + } + virtual bool Check (Attribute value) const { + return value.DynCast () != 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 (); + } +}; + +} // namespace internal + + class ObjectVectorAccessor : public AttributeAccessor { public: @@ -156,6 +191,13 @@ MakeObjectVectorAccessor (INDEX (T::*getN) (void) const, return MakeObjectVectorAccessor (get, getN); } +template +Ptr MakeObjectVectorChecker (void) +{ + return Create > (); +} + + } // namespace ns3 #endif /* OBJECT_VECTOR_H */ diff --git a/src/internet-node/ipv4-l3-protocol.cc b/src/internet-node/ipv4-l3-protocol.cc index 105995369..6776513d6 100644 --- a/src/internet-node/ipv4-l3-protocol.cc +++ b/src/internet-node/ipv4-l3-protocol.cc @@ -64,7 +64,7 @@ Ipv4L3Protocol::GetTypeId (void) .AddAttribute ("InterfaceList", "The set of Ipv4 interfaces associated to this Ipv4 stack.", ObjectVector (), MakeObjectVectorAccessor (&Ipv4L3Protocol::m_interfaces), - MakeObjectVectorChecker ()) + MakeObjectVectorChecker ()) ; return tid; } diff --git a/src/internet-node/ipv4-l4-demux.cc b/src/internet-node/ipv4-l4-demux.cc index 693cbbd59..311b6eb9f 100644 --- a/src/internet-node/ipv4-l4-demux.cc +++ b/src/internet-node/ipv4-l4-demux.cc @@ -39,7 +39,7 @@ Ipv4L4Demux::GetTypeId (void) .AddAttribute ("Protocols", "The set of protocols registered with this demux.", ObjectVector (), MakeObjectVectorAccessor (&Ipv4L4Demux::m_protocols), - MakeObjectVectorChecker ()) + MakeObjectVectorChecker ()) ; return tid; } diff --git a/src/node/node-list.cc b/src/node/node-list.cc index e687fe5fc..6de1691d4 100644 --- a/src/node/node-list.cc +++ b/src/node/node-list.cc @@ -63,7 +63,7 @@ NodeListPriv::GetTypeId (void) .AddAttribute ("NodeList", "The list of all nodes created during the simulation.", ObjectVector (), MakeObjectVectorAccessor (&NodeListPriv::m_nodes), - MakeObjectVectorChecker ()) + MakeObjectVectorChecker ()) ; return tid; } diff --git a/src/node/node.cc b/src/node/node.cc index d11bbe58b..c3d9fce25 100644 --- a/src/node/node.cc +++ b/src/node/node.cc @@ -39,11 +39,11 @@ Node::GetTypeId (void) .AddAttribute ("DeviceList", "The list of devices associated to this Node.", ObjectVector (), MakeObjectVectorAccessor (&Node::m_devices), - MakeObjectVectorChecker ()) + MakeObjectVectorChecker ()) .AddAttribute ("ApplicationList", "The list of applications associated to this Node.", ObjectVector (), MakeObjectVectorAccessor (&Node::m_applications), - MakeObjectVectorChecker ()) + MakeObjectVectorChecker ()) .AddAttribute ("Id", "The id (unique integer) of this Node.", TypeId::ATTR_GET, // allow only getting it. Uinteger (0),