19 #include "attribute-iterator.h"
20 #include "ns3/config.h"
22 #include "ns3/pointer.h"
23 #include "ns3/object-ptr-container.h"
24 #include "ns3/string.h"
33 AttributeIterator::AttributeIterator ()
37 AttributeIterator::~AttributeIterator ()
42 AttributeIterator::Iterate (
void)
47 StartVisitObject (
object);
56 AttributeIterator::IsExamined (Ptr<const Object>
object)
58 for (uint32_t i = 0; i < m_examined.size (); ++i)
60 if (
object == m_examined[i])
70 AttributeIterator::GetCurrentPath (std::string attr)
const
72 std::ostringstream oss;
73 for (uint32_t i = 0; i < m_currentPath.size (); ++i)
75 oss <<
"/" << m_currentPath[i];
85 AttributeIterator::GetCurrentPath (
void)
const
87 std::ostringstream oss;
88 for (uint32_t i = 0; i < m_currentPath.size (); ++i)
90 oss <<
"/" << m_currentPath[i];
96 AttributeIterator::DoStartVisitObject (Ptr<Object>
object)
100 AttributeIterator::DoEndVisitObject (
void)
104 AttributeIterator::DoStartVisitPointerAttribute (Ptr<Object>
object, std::string name, Ptr<Object> item)
108 AttributeIterator::DoEndVisitPointerAttribute (
void)
112 AttributeIterator::DoStartVisitArrayAttribute (Ptr<Object>
object, std::string name,
const ObjectPtrContainerValue &vector)
116 AttributeIterator::DoEndVisitArrayAttribute (
void)
120 AttributeIterator::DoStartVisitArrayItem (
const ObjectPtrContainerValue &vector, uint32_t index, Ptr<Object> item)
124 AttributeIterator::DoEndVisitArrayItem (
void)
129 AttributeIterator::VisitAttribute (Ptr<Object>
object, std::string name)
131 m_currentPath.push_back (name);
132 DoVisitAttribute (
object, name);
133 m_currentPath.pop_back ();
137 AttributeIterator::StartVisitObject (Ptr<Object>
object)
139 m_currentPath.push_back (
"$" + object->GetInstanceTypeId ().GetName ());
140 DoStartVisitObject (
object);
143 AttributeIterator::EndVisitObject (
void)
145 m_currentPath.pop_back ();
149 AttributeIterator::StartVisitPointerAttribute (Ptr<Object>
object, std::string name, Ptr<Object> value)
151 m_currentPath.push_back (name);
152 m_currentPath.push_back (
"$" + value->GetInstanceTypeId ().GetName ());
153 DoStartVisitPointerAttribute (
object, name, value);
156 AttributeIterator::EndVisitPointerAttribute (
void)
158 m_currentPath.pop_back ();
159 m_currentPath.pop_back ();
160 DoEndVisitPointerAttribute ();
163 AttributeIterator::StartVisitArrayAttribute (Ptr<Object>
object, std::string name,
const ObjectPtrContainerValue &vector)
165 m_currentPath.push_back (name);
166 DoStartVisitArrayAttribute (
object, name, vector);
169 AttributeIterator::EndVisitArrayAttribute (
void)
171 m_currentPath.pop_back ();
172 DoEndVisitArrayAttribute ();
176 AttributeIterator::StartVisitArrayItem (
const ObjectPtrContainerValue &vector, uint32_t index, Ptr<Object> item)
178 std::ostringstream oss;
180 m_currentPath.push_back (oss.str ());
181 m_currentPath.push_back (
"$" + item->GetInstanceTypeId ().GetName ());
182 DoStartVisitArrayItem (vector, index, item);
185 AttributeIterator::EndVisitArrayItem (
void)
187 m_currentPath.pop_back ();
188 m_currentPath.pop_back ();
189 DoEndVisitArrayItem ();
194 AttributeIterator::DoIterate (Ptr<Object>
object)
196 if (IsExamined (
object))
201 for (tid = object->GetInstanceTypeId (); tid.HasParent (); tid = tid.GetParent ())
204 for (uint32_t i = 0; i < tid.GetAttributeN (); ++i)
206 struct TypeId::AttributeInformation info = tid.GetAttribute(i);
207 const PointerChecker *ptrChecker =
dynamic_cast<const PointerChecker *
> (PeekPointer (info.checker));
212 object->GetAttribute (info.name, ptr);
213 Ptr<Object> tmp = ptr.Get<Object> ();
216 StartVisitPointerAttribute (
object, info.name,
218 m_examined.push_back (
object);
220 m_examined.pop_back ();
221 EndVisitPointerAttribute ();
226 const ObjectPtrContainerChecker *vectorChecker =
dynamic_cast<const ObjectPtrContainerChecker *
> (PeekPointer (info.checker));
227 if (vectorChecker != 0)
229 NS_LOG_DEBUG (
"ObjectPtrContainer attribute " << info.name);
230 ObjectPtrContainerValue vector;
231 object->GetAttribute (info.name, vector);
232 StartVisitArrayAttribute (
object, info.name, vector);
233 ObjectPtrContainerValue::Iterator it;
234 for (it = vector.Begin (); it != vector.End (); ++it)
236 uint32_t j = (*it).first;
237 NS_LOG_DEBUG (
"ObjectPtrContainer attribute item " << j);
238 Ptr<Object> tmp = (*it).second;
239 StartVisitArrayItem (vector, j, tmp);
240 m_examined.push_back (
object);
242 m_examined.pop_back ();
243 EndVisitArrayItem ();
245 EndVisitArrayAttribute ();
251 VisitAttribute (
object, info.name);
259 Object::AggregateIterator iter =
object->GetAggregateIterator ();
260 bool recursiveAggregate =
false;
261 while (iter.HasNext ())
263 Ptr<const Object> tmp = iter.Next ();
264 if (IsExamined (tmp))
266 recursiveAggregate =
true;
269 if (!recursiveAggregate)
271 iter =
object->GetAggregateIterator ();
272 while (iter.HasNext ())
274 Ptr<Object> tmp =
const_cast<Object *
> (PeekPointer (iter.Next ()));
275 StartVisitObject (tmp);
276 m_examined.push_back (
object);
278 m_examined.pop_back ();
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
Ptr< Object > GetRootNamespaceObject(uint32_t i)
#define NS_LOG_DEBUG(msg)
uint32_t GetRootNamespaceObjectN(void)