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