iterate over aggregated objects dynamically.
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 09 Apr 2008 17:35:18 -0700
changeset 2937 fc048c358357
parent 2936 d108e5f0bd3e
child 2938 621b23d5be5b
iterate over aggregated objects dynamically.
src/core/object.cc
src/core/object.h
--- 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;