iterate over aggregated objects dynamically.
--- a/src/core/object.cc Wed Apr 09 17:28:19 2008 -0700
+++ b/src/core/object.cc Wed Apr 09 17:35:18 2008 -0700
@@ -37,6 +37,43 @@
NS_OBJECT_ENSURE_REGISTERED (Object);
+Object::AggregateIterator::AggregateIterator ()
+ : m_first (0),
+ m_current (0)
+{}
+
+bool
+Object::AggregateIterator::HasNext (void) const
+{
+ if (m_current == 0 && m_first != 0)
+ {
+ return true;
+ }
+ if (m_current != 0 && m_current->m_next != PeekPointer (m_first))
+ {
+ return true;
+ }
+ return false;
+}
+Ptr<const Object>
+Object::AggregateIterator::Next (void)
+{
+ if (m_current == 0)
+ {
+ m_current = m_first;
+ }
+ else
+ {
+ m_current = m_current->m_next;
+ }
+ return m_current;
+}
+Object::AggregateIterator::AggregateIterator (Ptr<const Object> first)
+ : m_first (first),
+ m_current (0)
+{}
+
+
TypeId
Object::GetInstanceTypeId (void) const
{
@@ -122,6 +159,12 @@
NS_ASSERT (o->CheckLoose ());
}
+Object::AggregateIterator
+Object::GetAggregateIterator (void) const
+{
+ return AggregateIterator (this);
+}
+
void
Object::SetTypeId (TypeId tid)
{
--- a/src/core/object.h Wed Apr 09 17:28:19 2008 -0700
+++ b/src/core/object.h Wed Apr 09 17:35:18 2008 -0700
@@ -47,6 +47,20 @@
public:
static TypeId GetTypeId (void);
+ class AggregateIterator
+ {
+ public:
+ AggregateIterator ();
+
+ bool HasNext (void) const;
+ Ptr<const Object> Next (void);
+ private:
+ friend class Object;
+ AggregateIterator (Ptr<const Object> first);
+ Ptr<const Object> m_first;
+ Ptr<const Object> m_current;
+ };
+
Object ();
virtual ~Object ();
@@ -100,6 +114,8 @@
*/
void AggregateObject (Ptr<Object> other);
+ AggregateIterator GetAggregateIterator (void) const;
+
protected:
/**
* This method is called by Object::Dispose or by the object's
@@ -139,6 +155,7 @@
friend Ptr<T> CopyObject (Ptr<T> object);
friend class ObjectFactory;
+ friend class AggregateIterator;
Ptr<Object> DoGetObject (TypeId tid) const;
bool Check (void) const;