|
109 |
{ |
109 |
{ |
110 |
} |
110 |
} |
111 |
void |
111 |
void |
112 |
AttributeIterator::DoStartVisitArrayAttribute (Ptr<Object> object, std::string name, const ObjectPtrContainerValue &vector) |
112 |
AttributeIterator::DoStartVisitArrayAttribute (Ptr<Object> object, |
|
|
113 |
std::string name, const ObjectPtrVectorValue &vector) |
113 |
{ |
114 |
{ |
114 |
} |
115 |
} |
115 |
void |
116 |
void |
|
117 |
{ |
118 |
{ |
118 |
} |
119 |
} |
119 |
void |
120 |
void |
120 |
AttributeIterator::DoStartVisitArrayItem (const ObjectPtrContainerValue &vector, uint32_t index, Ptr<Object> item) |
121 |
AttributeIterator::DoStartVisitArrayItem (const ObjectPtrVectorValue &vector, |
|
|
122 |
uint32_t index, Ptr<Object> item) |
121 |
{ |
123 |
{ |
122 |
} |
124 |
} |
123 |
void |
125 |
void |
|
126 |
} |
128 |
} |
127 |
|
129 |
|
128 |
void |
130 |
void |
|
|
131 |
AttributeIterator::DoStartVisitMapAttribute (Ptr<Object> object, |
132 |
std::string name, const ObjectPtrMapValue &map) |
133 |
{ |
134 |
|
135 |
} |
136 |
void |
137 |
AttributeIterator::DoEndVisitMapAttribute (void) |
138 |
{ |
139 |
|
140 |
} |
141 |
|
142 |
void |
143 |
AttributeIterator::DoStartVisitMapItem (const ObjectPtrMapValue &vector, |
144 |
uint32_t index, Ptr<Object> item) |
145 |
{ |
146 |
|
147 |
} |
148 |
|
149 |
void |
150 |
AttributeIterator::DoEndVisitMapItem (void) |
151 |
{ |
152 |
|
153 |
} |
154 |
|
155 |
void |
129 |
AttributeIterator::VisitAttribute (Ptr<Object> object, std::string name) |
156 |
AttributeIterator::VisitAttribute (Ptr<Object> object, std::string name) |
130 |
{ |
157 |
{ |
131 |
m_currentPath.push_back (name); |
158 |
m_currentPath.push_back (name); |
|
160 |
DoEndVisitPointerAttribute (); |
187 |
DoEndVisitPointerAttribute (); |
161 |
} |
188 |
} |
162 |
void |
189 |
void |
163 |
AttributeIterator::StartVisitArrayAttribute (Ptr<Object> object, std::string name, const ObjectPtrContainerValue &vector) |
190 |
AttributeIterator::StartVisitArrayAttribute (Ptr<Object> object, |
|
|
191 |
std::string name, const ObjectPtrVectorValue &vector) |
164 |
{ |
192 |
{ |
165 |
m_currentPath.push_back (name); |
193 |
m_currentPath.push_back (name); |
166 |
DoStartVisitArrayAttribute (object, name, vector); |
194 |
DoStartVisitArrayAttribute (object, name, vector); |
|
173 |
} |
201 |
} |
174 |
|
202 |
|
175 |
void |
203 |
void |
176 |
AttributeIterator::StartVisitArrayItem (const ObjectPtrContainerValue &vector, uint32_t index, Ptr<Object> item) |
204 |
AttributeIterator::StartVisitArrayItem (const ObjectPtrVectorValue &vector, |
|
|
205 |
uint32_t index, Ptr<Object> item) |
177 |
{ |
206 |
{ |
178 |
std::ostringstream oss; |
207 |
std::ostringstream oss; |
179 |
oss << index; |
208 |
oss << index; |
|
189 |
DoEndVisitArrayItem (); |
218 |
DoEndVisitArrayItem (); |
190 |
} |
219 |
} |
191 |
|
220 |
|
|
|
221 |
void |
222 |
AttributeIterator::StartVisitMapAttribute (Ptr<Object> object, |
223 |
std::string name, const ObjectPtrMapValue &map) |
224 |
{ |
225 |
m_currentPath.push_back (name); |
226 |
DoStartVisitMapAttribute (object, name, map); |
227 |
NS_LOG_INFO (this << GetCurrentPath ()); |
228 |
} |
192 |
|
229 |
|
193 |
void |
230 |
void |
|
|
231 |
AttributeIterator::EndVisitMapAttribute (void) |
232 |
{ |
233 |
m_currentPath.pop_back (); |
234 |
DoEndVisitMapAttribute (); |
235 |
} |
236 |
|
237 |
void |
238 |
AttributeIterator::StartVisitMapItem (const ObjectPtrMapValue &map, |
239 |
uint32_t index, Ptr<Object> item) |
240 |
{ |
241 |
std::ostringstream oss; |
242 |
oss << index; |
243 |
m_currentPath.push_back (oss.str ()); |
244 |
m_currentPath.push_back ("$" + item->GetInstanceTypeId ().GetName ()); |
245 |
DoStartVisitMapItem (map, index, item); |
246 |
NS_LOG_INFO (this << GetCurrentPath ()); |
247 |
} |
248 |
|
249 |
void |
250 |
AttributeIterator::EndVisitMapItem (void) |
251 |
{ |
252 |
m_currentPath.pop_back (); |
253 |
m_currentPath.pop_back (); |
254 |
DoEndVisitMapItem (); |
255 |
} |
256 |
|
257 |
void |
194 |
AttributeIterator::DoIterate (Ptr<Object> object) |
258 |
AttributeIterator::DoIterate (Ptr<Object> object) |
195 |
{ |
259 |
{ |
196 |
if (IsExamined (object)) |
260 |
if (IsExamined (object)) |
|
198 |
return; |
262 |
return; |
199 |
} |
263 |
} |
200 |
TypeId tid; |
264 |
TypeId tid; |
201 |
for (tid = object->GetInstanceTypeId (); tid.HasParent (); tid = tid.GetParent ()) |
265 |
for (tid = object->GetInstanceTypeId (); tid.HasParent (); tid |
|
|
266 |
= tid.GetParent ()) |
202 |
{ |
267 |
{ |
203 |
NS_LOG_DEBUG ("store " << tid.GetName ()); |
268 |
NS_LOG_DEBUG ("store " << tid.GetName ()); |
204 |
for (uint32_t i = 0; i < tid.GetAttributeN (); ++i) |
269 |
for (uint32_t i = 0; i < tid.GetAttributeN (); ++i) |
205 |
{ |
270 |
{ |
206 |
struct TypeId::AttributeInformation info = tid.GetAttribute(i); |
271 |
struct TypeId::AttributeInformation info = tid.GetAttribute (i); |
207 |
const PointerChecker *ptrChecker = dynamic_cast<const PointerChecker *> (PeekPointer (info.checker)); |
272 |
const PointerChecker *ptrChecker = |
|
|
273 |
dynamic_cast<const PointerChecker *> (PeekPointer (info.checker)); |
208 |
if (ptrChecker != 0) |
274 |
if (ptrChecker != 0) |
209 |
{ |
275 |
{ |
210 |
NS_LOG_DEBUG ("pointer attribute " << info.name); |
276 |
NS_LOG_DEBUG ("pointer attribute " << info.name); |
|
213 |
Ptr<Object> tmp = ptr.Get<Object> (); |
279 |
Ptr<Object> tmp = ptr.Get<Object> (); |
214 |
if (tmp != 0) |
280 |
if (tmp != 0) |
215 |
{ |
281 |
{ |
216 |
StartVisitPointerAttribute (object, info.name, |
282 |
StartVisitPointerAttribute (object, info.name, tmp); |
217 |
tmp); |
|
|
218 |
m_examined.push_back (object); |
283 |
m_examined.push_back (object); |
219 |
DoIterate (tmp); |
284 |
DoIterate (tmp); |
220 |
m_examined.pop_back (); |
285 |
m_examined.pop_back (); |
|
223 |
continue; |
288 |
continue; |
224 |
} |
289 |
} |
225 |
// attempt to cast to an object vector. |
290 |
// attempt to cast to an object vector. |
226 |
const ObjectPtrContainerChecker *vectorChecker = dynamic_cast<const ObjectPtrContainerChecker *> (PeekPointer (info.checker)); |
291 |
const ObjectPtrVectorChecker *vectorChecker =dynamic_cast<const ObjectPtrVectorChecker *> (PeekPointer ( |
|
|
292 |
info.checker)); |
227 |
if (vectorChecker != 0) |
293 |
if (vectorChecker != 0) |
228 |
{ |
294 |
{ |
229 |
NS_LOG_DEBUG ("vector attribute " << info.name); |
295 |
NS_LOG_DEBUG ("vector attribute " << info.name); |
230 |
ObjectPtrContainerValue vector; |
296 |
ObjectPtrVectorValue vector; |
231 |
object->GetAttribute (info.name, vector); |
297 |
object->GetAttribute (info.name, vector); |
232 |
StartVisitArrayAttribute (object, info.name, vector); |
298 |
StartVisitArrayAttribute (object, info.name, vector); |
233 |
for (uint32_t j = 0; j < vector.GetN (); ++j) |
299 |
for (uint32_t j = 0; j < vector.GetN (); ++j) |
|
243 |
EndVisitArrayAttribute (); |
309 |
EndVisitArrayAttribute (); |
244 |
continue; |
310 |
continue; |
245 |
} |
311 |
} |
246 |
if ((info.flags & TypeId::ATTR_GET) && info.accessor->HasGetter () && |
312 |
// attempt to cast to an object map. |
247 |
(info.flags & TypeId::ATTR_SET) && info.accessor->HasSetter ()) |
313 |
const ObjectPtrMapChecker *mapChecker = dynamic_cast<const ObjectPtrMapChecker *> (PeekPointer (info.checker)); |
|
|
314 |
if (mapChecker != 0) |
315 |
{ |
316 |
ObjectPtrMapValue map; |
317 |
object->GetAttribute (info.name, map); |
318 |
StartVisitMapAttribute (object, info.name, map); |
319 |
for (ObjectPtrMapValue::Iterator it = map.Begin (); it != map.End (); it++) |
320 |
{ |
321 |
NS_LOG_DEBUG ("map attribute index " << (*it).first << " item " << (*it).second); |
322 |
StartVisitMapItem (map, (*it).first, (*it).second); |
323 |
m_examined.push_back (object); |
324 |
DoIterate ((*it).second); |
325 |
m_examined.pop_back (); |
326 |
EndVisitMapItem (); |
327 |
} |
328 |
EndVisitMapAttribute (); |
329 |
continue; |
330 |
} |
331 |
if ((info.flags & TypeId::ATTR_GET) && info.accessor->HasGetter () |
332 |
&& (info.flags & TypeId::ATTR_SET) && info.accessor->HasSetter ()) |
248 |
{ |
333 |
{ |
249 |
VisitAttribute (object, info.name); |
334 |
VisitAttribute (object, info.name); |
250 |
} |
335 |
} |
|
253 |
NS_LOG_DEBUG ("could not store " << info.name); |
338 |
NS_LOG_DEBUG ("could not store " << info.name); |
254 |
} |
339 |
} |
255 |
} |
340 |
} |
256 |
} |
341 |
Object::AggregateIterator iter = object->GetAggregateIterator (); |
257 |
Object::AggregateIterator iter = object->GetAggregateIterator (); |
342 |
bool recursiveAggregate = false; |
258 |
bool recursiveAggregate = false; |
|
|
259 |
while (iter.HasNext ()) |
260 |
{ |
261 |
Ptr<const Object> tmp = iter.Next (); |
262 |
if (IsExamined (tmp)) |
263 |
{ |
264 |
recursiveAggregate = true; |
265 |
} |
266 |
} |
267 |
if (!recursiveAggregate) |
268 |
{ |
269 |
iter = object->GetAggregateIterator (); |
270 |
while (iter.HasNext ()) |
343 |
while (iter.HasNext ()) |
271 |
{ |
344 |
{ |
272 |
Ptr<Object> tmp = const_cast<Object *> (PeekPointer (iter.Next ())); |
345 |
Ptr<const Object> tmp = iter.Next (); |
273 |
StartVisitObject (tmp); |
346 |
if (IsExamined (tmp)) |
274 |
m_examined.push_back (object); |
347 |
{ |
275 |
DoIterate (tmp); |
348 |
recursiveAggregate = true; |
276 |
m_examined.pop_back (); |
349 |
} |
277 |
EndVisitObject (); |
350 |
} |
|
|
351 |
if (!recursiveAggregate) |
352 |
{ |
353 |
iter = object->GetAggregateIterator (); |
354 |
while (iter.HasNext ()) |
355 |
{ |
356 |
Ptr<Object> tmp = const_cast<Object *> (PeekPointer (iter.Next ())); |
357 |
StartVisitObject (tmp); |
358 |
m_examined.push_back (object); |
359 |
DoIterate (tmp); |
360 |
m_examined.pop_back (); |
361 |
EndVisitObject (); |
362 |
} |
278 |
} |
363 |
} |
279 |
} |
364 |
} |
280 |
} |
365 |
} |
281 |
|
366 |
|
282 |
|
|
|
283 |
} // namespace ns3 |
367 |
} // namespace ns3 |