diff -r e98d9c028d7f src/config-store/model/attribute-default-iterator.cc --- a/src/config-store/model/attribute-default-iterator.cc Mon Mar 12 11:41:36 2012 +0100 +++ b/src/config-store/model/attribute-default-iterator.cc Tue Mar 13 11:34:50 2012 +0100 @@ -22,7 +22,8 @@ #include "ns3/pointer.h" #include "ns3/global-value.h" #include "ns3/string.h" -#include "ns3/object-ptr-container.h" +#include "ns3/object-ptr-vector.h" +#include "ns3/object-ptr-map.h" namespace ns3 { @@ -70,19 +71,25 @@ //No value, check next attribute continue; } - Ptr vector = DynamicCast (info.initialValue); + Ptr vector = DynamicCast (info.initialValue); if (vector != 0) { //a vector value, won't take it continue; } + Ptr map = DynamicCast (info.initialValue); + if (map != 0) + { + //a map value, won't take it + continue; + } Ptr pointer = DynamicCast (info.initialValue); if (pointer != 0) { //pointer value, won't take it continue; } - //We take only values, no pointers or vectors + //We take only values, no pointers or vectors or maps if (!calledStart) { StartVisitTypeId (tid.GetName ()); diff -r e98d9c028d7f src/config-store/model/attribute-iterator.cc --- a/src/config-store/model/attribute-iterator.cc Mon Mar 12 11:41:36 2012 +0100 +++ b/src/config-store/model/attribute-iterator.cc Tue Mar 13 11:34:50 2012 +0100 @@ -109,7 +109,8 @@ { } void -AttributeIterator::DoStartVisitArrayAttribute (Ptr object, std::string name, const ObjectPtrContainerValue &vector) +AttributeIterator::DoStartVisitArrayAttribute (Ptr object, + std::string name, const ObjectPtrVectorValue &vector) { } void @@ -117,7 +118,8 @@ { } void -AttributeIterator::DoStartVisitArrayItem (const ObjectPtrContainerValue &vector, uint32_t index, Ptr item) +AttributeIterator::DoStartVisitArrayItem (const ObjectPtrVectorValue &vector, + uint32_t index, Ptr item) { } void @@ -126,6 +128,31 @@ } void +AttributeIterator::DoStartVisitMapAttribute (Ptr object, + std::string name, const ObjectPtrMapValue &map) +{ + +} +void +AttributeIterator::DoEndVisitMapAttribute (void) +{ + +} + +void +AttributeIterator::DoStartVisitMapItem (const ObjectPtrMapValue &vector, + uint32_t index, Ptr item) +{ + +} + +void +AttributeIterator::DoEndVisitMapItem (void) +{ + +} + +void AttributeIterator::VisitAttribute (Ptr object, std::string name) { m_currentPath.push_back (name); @@ -160,7 +187,8 @@ DoEndVisitPointerAttribute (); } void -AttributeIterator::StartVisitArrayAttribute (Ptr object, std::string name, const ObjectPtrContainerValue &vector) +AttributeIterator::StartVisitArrayAttribute (Ptr object, + std::string name, const ObjectPtrVectorValue &vector) { m_currentPath.push_back (name); DoStartVisitArrayAttribute (object, name, vector); @@ -173,7 +201,8 @@ } void -AttributeIterator::StartVisitArrayItem (const ObjectPtrContainerValue &vector, uint32_t index, Ptr item) +AttributeIterator::StartVisitArrayItem (const ObjectPtrVectorValue &vector, + uint32_t index, Ptr item) { std::ostringstream oss; oss << index; @@ -189,8 +218,43 @@ DoEndVisitArrayItem (); } +void +AttributeIterator::StartVisitMapAttribute (Ptr object, + std::string name, const ObjectPtrMapValue &map) +{ + m_currentPath.push_back (name); + DoStartVisitMapAttribute (object, name, map); + NS_LOG_INFO (this << GetCurrentPath ()); +} void +AttributeIterator::EndVisitMapAttribute (void) +{ + m_currentPath.pop_back (); + DoEndVisitMapAttribute (); +} + +void +AttributeIterator::StartVisitMapItem (const ObjectPtrMapValue &map, + uint32_t index, Ptr item) +{ + std::ostringstream oss; + oss << index; + m_currentPath.push_back (oss.str ()); + m_currentPath.push_back ("$" + item->GetInstanceTypeId ().GetName ()); + DoStartVisitMapItem (map, index, item); + NS_LOG_INFO (this << GetCurrentPath ()); +} + +void +AttributeIterator::EndVisitMapItem (void) +{ + m_currentPath.pop_back (); + m_currentPath.pop_back (); + DoEndVisitMapItem (); +} + +void AttributeIterator::DoIterate (Ptr object) { if (IsExamined (object)) @@ -198,13 +262,15 @@ return; } TypeId tid; - for (tid = object->GetInstanceTypeId (); tid.HasParent (); tid = tid.GetParent ()) + for (tid = object->GetInstanceTypeId (); tid.HasParent (); tid + = tid.GetParent ()) { NS_LOG_DEBUG ("store " << tid.GetName ()); for (uint32_t i = 0; i < tid.GetAttributeN (); ++i) { - struct TypeId::AttributeInformation info = tid.GetAttribute(i); - const PointerChecker *ptrChecker = dynamic_cast (PeekPointer (info.checker)); + struct TypeId::AttributeInformation info = tid.GetAttribute (i); + const PointerChecker *ptrChecker = + dynamic_cast (PeekPointer (info.checker)); if (ptrChecker != 0) { NS_LOG_DEBUG ("pointer attribute " << info.name); @@ -213,8 +279,7 @@ Ptr tmp = ptr.Get (); if (tmp != 0) { - StartVisitPointerAttribute (object, info.name, - tmp); + StartVisitPointerAttribute (object, info.name, tmp); m_examined.push_back (object); DoIterate (tmp); m_examined.pop_back (); @@ -223,11 +288,12 @@ continue; } // attempt to cast to an object vector. - const ObjectPtrContainerChecker *vectorChecker = dynamic_cast (PeekPointer (info.checker)); + const ObjectPtrVectorChecker *vectorChecker =dynamic_cast (PeekPointer ( + info.checker)); if (vectorChecker != 0) { NS_LOG_DEBUG ("vector attribute " << info.name); - ObjectPtrContainerValue vector; + ObjectPtrVectorValue vector; object->GetAttribute (info.name, vector); StartVisitArrayAttribute (object, info.name, vector); for (uint32_t j = 0; j < vector.GetN (); ++j) @@ -243,8 +309,27 @@ EndVisitArrayAttribute (); continue; } - if ((info.flags & TypeId::ATTR_GET) && info.accessor->HasGetter () && - (info.flags & TypeId::ATTR_SET) && info.accessor->HasSetter ()) + // attempt to cast to an object map. + const ObjectPtrMapChecker *mapChecker = dynamic_cast (PeekPointer (info.checker)); + if (mapChecker != 0) + { + ObjectPtrMapValue map; + object->GetAttribute (info.name, map); + StartVisitMapAttribute (object, info.name, map); + for (ObjectPtrMapValue::Iterator it = map.Begin (); it != map.End (); it++) + { + NS_LOG_DEBUG ("map attribute index " << (*it).first << " item " << (*it).second); + StartVisitMapItem (map, (*it).first, (*it).second); + m_examined.push_back (object); + DoIterate ((*it).second); + m_examined.pop_back (); + EndVisitMapItem (); + } + EndVisitMapAttribute (); + continue; + } + if ((info.flags & TypeId::ATTR_GET) && info.accessor->HasGetter () + && (info.flags & TypeId::ATTR_SET) && info.accessor->HasSetter ()) { VisitAttribute (object, info.name); } @@ -253,31 +338,30 @@ NS_LOG_DEBUG ("could not store " << info.name); } } - } - Object::AggregateIterator iter = object->GetAggregateIterator (); - bool recursiveAggregate = false; - while (iter.HasNext ()) - { - Ptr tmp = iter.Next (); - if (IsExamined (tmp)) - { - recursiveAggregate = true; - } - } - if (!recursiveAggregate) - { - iter = object->GetAggregateIterator (); + Object::AggregateIterator iter = object->GetAggregateIterator (); + bool recursiveAggregate = false; while (iter.HasNext ()) { - Ptr tmp = const_cast (PeekPointer (iter.Next ())); - StartVisitObject (tmp); - m_examined.push_back (object); - DoIterate (tmp); - m_examined.pop_back (); - EndVisitObject (); + Ptr tmp = iter.Next (); + if (IsExamined (tmp)) + { + recursiveAggregate = true; + } + } + if (!recursiveAggregate) + { + iter = object->GetAggregateIterator (); + while (iter.HasNext ()) + { + Ptr tmp = const_cast (PeekPointer (iter.Next ())); + StartVisitObject (tmp); + m_examined.push_back (object); + DoIterate (tmp); + m_examined.pop_back (); + EndVisitObject (); + } } } } - } // namespace ns3 diff -r e98d9c028d7f src/config-store/model/attribute-iterator.h --- a/src/config-store/model/attribute-iterator.h Mon Mar 12 11:41:36 2012 +0100 +++ b/src/config-store/model/attribute-iterator.h Tue Mar 13 11:34:50 2012 +0100 @@ -21,7 +21,8 @@ #include "ns3/ptr.h" #include "ns3/object.h" -#include "ns3/object-ptr-container.h" +#include "ns3/object-ptr-vector.h" +#include "ns3/object-ptr-map.h" #include namespace ns3 { @@ -46,10 +47,14 @@ virtual void DoEndVisitObject (void); virtual void DoStartVisitPointerAttribute (Ptr object, std::string name, Ptr value); virtual void DoEndVisitPointerAttribute (void); - virtual void DoStartVisitArrayAttribute (Ptr object, std::string name, const ObjectPtrContainerValue &vector); + virtual void DoStartVisitArrayAttribute (Ptr object, std::string name, const ObjectPtrVectorValue &vector); virtual void DoEndVisitArrayAttribute (void); - virtual void DoStartVisitArrayItem (const ObjectPtrContainerValue &vector, uint32_t index, Ptr item); + virtual void DoStartVisitArrayItem (const ObjectPtrVectorValue &vector, uint32_t index, Ptr item); virtual void DoEndVisitArrayItem (void); + virtual void DoStartVisitMapAttribute (Ptr object, std::string name, const ObjectPtrMapValue &map); + virtual void DoEndVisitMapAttribute (void); + virtual void DoStartVisitMapItem (const ObjectPtrMapValue &vector, uint32_t index, Ptr item); + virtual void DoEndVisitMapItem (void); void DoIterate (Ptr object); bool IsExamined (Ptr object); @@ -60,11 +65,14 @@ void EndVisitObject (void); void StartVisitPointerAttribute (Ptr object, std::string name, Ptr value); void EndVisitPointerAttribute (void); - void StartVisitArrayAttribute (Ptr object, std::string name, const ObjectPtrContainerValue &vector); + void StartVisitArrayAttribute (Ptr object, std::string name, const ObjectPtrVectorValue &vector); void EndVisitArrayAttribute (void); - void StartVisitArrayItem (const ObjectPtrContainerValue &vector, uint32_t index, Ptr item); + void StartVisitArrayItem (const ObjectPtrVectorValue &vector, uint32_t index, Ptr item); void EndVisitArrayItem (void); - + void StartVisitMapAttribute (Ptr object, std::string name, const ObjectPtrMapValue &map); + void EndVisitMapAttribute (void); + void StartVisitMapItem (const ObjectPtrMapValue &vector, uint32_t index, Ptr item); + void EndVisitMapItem (void); std::vector > m_examined; std::vector m_currentPath; diff -r e98d9c028d7f src/config-store/model/model-node-creator.cc --- a/src/config-store/model/model-node-creator.cc Mon Mar 12 11:41:36 2012 +0100 +++ b/src/config-store/model/model-node-creator.cc Tue Mar 13 11:34:50 2012 +0100 @@ -91,8 +91,9 @@ { Remove (); } -void -ModelCreator::DoStartVisitArrayAttribute (Ptr object, std::string name, const ObjectPtrContainerValue &vector) +void +ModelCreator::DoStartVisitArrayAttribute (Ptr object, std::string name, + const ObjectPtrVectorValue &vector) { ModelNode *node = new ModelNode (); node->type = ModelNode::NODE_VECTOR; @@ -106,7 +107,8 @@ Remove (); } void -ModelCreator::DoStartVisitArrayItem (const ObjectPtrContainerValue &vector, uint32_t index, Ptr item) +ModelCreator::DoStartVisitArrayItem (const ObjectPtrVectorValue &vector, + uint32_t index, Ptr item) { GtkTreeIter *parent = m_iters.back (); GtkTreeIter *current = g_new (GtkTreeIter, 1); @@ -127,4 +129,43 @@ g_free (iter); m_iters.pop_back (); } + +void +ModelCreator::DoStartVisitMapAttribute (Ptr object, std::string name, + const ObjectPtrMapValue &map) +{ + ModelNode *node = new ModelNode (); + node->type = ModelNode::NODE_VECTOR; + node->object = object; + node->name = name; + Add (node); +} +void +ModelCreator::DoEndVisitMapAttribute (void) +{ + Remove (); +} +void +ModelCreator::DoStartVisitMapItem (const ObjectPtrMapValue &map, uint32_t index, + Ptr item) +{ + GtkTreeIter *parent = m_iters.back (); + GtkTreeIter *current = g_new (GtkTreeIter, 1); + ModelNode *node = new ModelNode (); + node->type = ModelNode::NODE_VECTOR_ITEM; + node->object = item; + node->index = index; + gtk_tree_store_append (m_treestore, current, parent); + gtk_tree_store_set (m_treestore, current, COL_NODE, node, -1); + m_iters.push_back (current); +} + +void +ModelCreator::DoEndVisitMapItem (void) +{ + GtkTreeIter *iter = m_iters.back (); + g_free (iter); + m_iters.pop_back (); +} + } //end namespace ns3 diff -r e98d9c028d7f src/config-store/model/model-node-creator.h --- a/src/config-store/model/model-node-creator.h Mon Mar 12 11:41:36 2012 +0100 +++ b/src/config-store/model/model-node-creator.h Tue Mar 13 11:34:50 2012 +0100 @@ -56,19 +56,22 @@ public: ModelCreator (); - void Build (GtkTreeStore *treestore); + void + Build (GtkTreeStore *treestore); private: virtual void DoVisitAttribute (Ptr object, std::string name); virtual void DoStartVisitObject (Ptr object); virtual void DoEndVisitObject (void); virtual void DoStartVisitPointerAttribute (Ptr object, std::string name, Ptr value); virtual void DoEndVisitPointerAttribute (void); - virtual void DoStartVisitArrayAttribute (Ptr object, std::string name, - const ObjectPtrContainerValue &vector); + virtual void DoStartVisitArrayAttribute (Ptr object, std::string name, const ObjectPtrVectorValue &vector); virtual void DoEndVisitArrayAttribute (void); - virtual void DoStartVisitArrayItem (const ObjectPtrContainerValue &vector, - uint32_t index, Ptr item); + virtual void DoStartVisitArrayItem (const ObjectPtrVectorValue &vector, uint32_t index, Ptr item); virtual void DoEndVisitArrayItem (void); + virtual void DoStartVisitMapAttribute (Ptr object, std::string name, const ObjectPtrMapValue &map); + virtual void DoEndVisitMapAttribute (void); + virtual void DoStartVisitMapItem (const ObjectPtrMapValue &vector, uint32_t index, Ptr item); + virtual void DoEndVisitMapItem (void); void Add (ModelNode *node); void Remove (void); diff -r e98d9c028d7f src/core/model/config.cc --- a/src/core/model/config.cc Mon Mar 12 11:41:36 2012 +0100 +++ b/src/core/model/config.cc Tue Mar 13 11:34:50 2012 +0100 @@ -21,7 +21,8 @@ #include "singleton.h" #include "object.h" #include "global-value.h" -#include "object-ptr-container.h" +#include "object-ptr-vector.h" +#include "object-ptr-map.h" #include "names.h" #include "pointer.h" #include "log.h" @@ -226,7 +227,8 @@ private: void Canonicalize (void); void DoResolve (std::string path, Ptr root); - void DoArrayResolve (std::string path, const ObjectPtrContainerValue &vector); + void DoArrayResolve (std::string path, const ObjectPtrVectorValue &vector); + void DoMapResolve (std::string path, const ObjectPtrMapValue &map); void DoResolveOne (Ptr object); std::string GetResolvedPath (void) const; virtual void DoOne (Ptr object, std::string path) = 0; @@ -403,23 +405,34 @@ m_workStack.pop_back (); } // attempt to cast to an object vector. - const ObjectPtrContainerChecker *vectorChecker = dynamic_cast (PeekPointer (info.checker)); + const ObjectPtrVectorChecker *vectorChecker = dynamic_cast (PeekPointer (info.checker)); if (vectorChecker != 0) { NS_LOG_DEBUG ("GetAttribute(vector)="< v = tmp.checker->CreateValidValue (value); diff -r e98d9c028d7f src/core/model/object-map.h --- a/src/core/model/object-map.h Mon Mar 12 11:41:36 2012 +0100 +++ b/src/core/model/object-map.h Tue Mar 13 11:34:50 2012 +0100 @@ -20,15 +20,15 @@ #ifndef OBJECT_MAP_H #define OBJECT_MAP_H -#include +#include #include "object.h" #include "ptr.h" #include "attribute.h" -#include "object-ptr-container.h" +#include "object-ptr-map.h" namespace ns3 { -typedef ObjectPtrContainerValue ObjectMapValue; +typedef ObjectPtrMapValue ObjectMapValue; template Ptr @@ -39,12 +39,12 @@ template Ptr -MakeObjectVectorAccessor (Ptr (T::*get)(INDEX) const, +MakeObjectMapAccessor (Ptr (T::*get)(INDEX) const, INDEX (T::*getN)(void) const); template Ptr -MakeObjectVectorAccessor (INDEX (T::*getN)(void) const, +MakeObjectMapAccessor (INDEX (T::*getN)(void) const, Ptr (T::*get)(INDEX) const); } // namespace ns3 @@ -53,9 +53,9 @@ template Ptr -MakeObjectMapAccessor (U T::*memberVector) +MakeObjectMapAccessor (U T::*memberMap) { - struct MemberStdContainer : public ObjectPtrContainerAccessor + struct MemberStdContainer : public ObjectPtrMapAccessor { virtual bool DoGetN (const ObjectBase *object, uint32_t *n) const { const T *obj = dynamic_cast (object); @@ -63,18 +63,20 @@ { return false; } - *n = (obj->*m_memberVector).size (); + + *n = (obj->*m_memberMap).size (); return true; } - virtual Ptr DoGet (const ObjectBase *object, uint32_t i) const { + virtual Ptr DoGet (const ObjectBase *object, uint32_t i, uint32_t *index) 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 (); + typename U::const_iterator begin = (obj->*m_memberMap).begin (); + typename U::const_iterator end = (obj->*m_memberMap).end (); uint32_t k = 0; for (typename U::const_iterator j = begin; j != end; j++, k++) { if (k == i) { + *index = (*j).first; return (*j).second; break; } @@ -83,16 +85,16 @@ // quiet compiler. return 0; } - U T::*m_memberVector; + U T::*m_memberMap; } *spec = new MemberStdContainer (); - spec->m_memberVector = memberVector; + spec->m_memberMap = memberMap; return Ptr (spec, false); } template Ptr MakeObjectMapChecker (void) { - return MakeObjectPtrContainerChecker (); + return MakeObjectPtrMapChecker (); } template @@ -100,7 +102,7 @@ MakeObjectMapAccessor (Ptr (T::*get)(INDEX) const, INDEX (T::*getN)(void) const) { - return MakeObjectPtrContainerAccessor(get, getN); + return MakeObjectPtrMapAccessor(get, getN); } template @@ -108,7 +110,7 @@ MakeObjectMapAccessor (INDEX (T::*getN)(void) const, Ptr (T::*get)(INDEX) const) { - return MakeObjectPtrContainerAccessor(get, getN); + return MakeObjectPtrMapAccessor(get, getN); } diff -r e98d9c028d7f src/core/model/object-vector.h --- a/src/core/model/object-vector.h Mon Mar 12 11:41:36 2012 +0100 +++ b/src/core/model/object-vector.h Tue Mar 13 11:34:50 2012 +0100 @@ -24,11 +24,11 @@ #include "object.h" #include "ptr.h" #include "attribute.h" -#include "object-ptr-container.h" +#include "object-ptr-vector.h" namespace ns3 { -typedef ObjectPtrContainerValue ObjectVectorValue; +typedef ObjectPtrVectorValue ObjectVectorValue; template Ptr @@ -55,7 +55,7 @@ Ptr MakeObjectVectorAccessor (U T::*memberVector) { - struct MemberStdContainer : public ObjectPtrContainerAccessor + struct MemberStdContainer : public ObjectPtrVectorAccessor { virtual bool DoGetN (const ObjectBase *object, uint32_t *n) const { const T *obj = dynamic_cast (object); @@ -92,23 +92,23 @@ template Ptr MakeObjectVectorChecker (void) { - return MakeObjectPtrContainerChecker (); + return MakeObjectPtrVectorChecker (); } template Ptr MakeObjectVectorAccessor (Ptr (T::*get)(INDEX) const, - INDEX (T::*getN)(void) const) + INDEX (T::*getN)(void) const) { - return MakeObjectPtrContainerAccessor(get, getN); + return MakeObjectPtrVectorAccessor(get, getN); } template Ptr MakeObjectVectorAccessor (INDEX (T::*getN)(void) const, - Ptr (T::*get)(INDEX) const) + Ptr (T::*get)(INDEX) const) { - return MakeObjectPtrContainerAccessor(get, getN); + return MakeObjectPtrVectorAccessor(get, getN); } diff -r e98d9c028d7f src/core/wscript --- a/src/core/wscript Mon Mar 12 11:41:36 2012 +0100 +++ b/src/core/wscript Tue Mar 13 11:34:50 2012 +0100 @@ -138,6 +138,8 @@ 'model/string.cc', 'model/pointer.cc', 'model/object-ptr-container.cc', + 'model/object-ptr-vector.cc', + 'model/object-ptr-map.cc', 'model/object-factory.cc', 'model/global-value.cc', 'model/trace-source-accessor.cc', @@ -232,6 +234,8 @@ 'model/trace-source-accessor.h', 'model/config.h', 'model/object-ptr-container.h', + 'model/object-ptr-vector.h', + 'model/object-ptr-map.h', 'model/object-vector.h', 'model/object-map.h', 'model/deprecated.h',