add iterator to go through available list
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 29 Aug 2007 16:42:55 +0200
changeset 1396 105d16b9bf04
parent 1395 179c8e1600e8
child 1397 fdc239ba72a7
add iterator to go through available list
src/core/trace-context.cc
src/core/trace-context.h
--- a/src/core/trace-context.cc	Wed Aug 29 16:42:18 2007 +0200
+++ b/src/core/trace-context.cc	Wed Aug 29 16:42:55 2007 +0200
@@ -24,6 +24,72 @@
 
 namespace ns3 {
 
+TraceContext::Iterator &
+TraceContext::Iterator::operator ++ (void)
+{
+  ReadOne ();
+  return *this;
+}
+TraceContext::Iterator 
+TraceContext::Iterator::operator ++ (int)
+{
+  Iterator old (*this);
+  ReadOne ();
+  return old;
+}
+const std::string &
+TraceContext::Iterator::operator * (void) const
+{
+  return m_name;
+}
+const std::string *
+TraceContext::Iterator::operator -> (void) const
+{
+  return &m_name;
+}
+TraceContext::Iterator::Iterator (uint8_t *buffer)
+  : m_buffer (buffer),
+    m_current (0)
+{
+  ReadOne ();
+}
+TraceContext::Iterator::Iterator (uint8_t *buffer, uint16_t index)
+  : m_buffer (buffer),
+    m_current (index)
+{}
+void
+TraceContext::Iterator::ReadOne (void)
+{
+  if (m_buffer == 0)
+    {
+      return;
+    }
+  uint8_t uid = m_buffer[m_current];
+  uint8_t size = ElementRegistry::GetSize (uid);
+  m_name = ElementRegistry::GetName (uid);
+  m_current += 1 + size;
+}
+bool 
+TraceContext::Iterator::operator != (const Iterator &o)
+{
+  return ! (*this == o);
+}
+bool 
+TraceContext::Iterator::operator == (const Iterator &o)
+{
+  if (m_buffer == 0 && o.m_buffer == 0)
+    {
+      return true;
+    }
+  if (m_buffer != 0 && o.m_buffer == 0 ||
+      m_buffer == 0 && o.m_buffer != 0)
+    {
+      return false;
+    }
+  return m_current == o.m_current;
+}
+
+
 TraceContext::TraceContext ()
   : m_data (0)
 {}
@@ -230,6 +296,31 @@
       }
   } while (true);
 }
+TraceContext::Iterator 
+TraceContext::AvailableBegin (void) const
+{
+  if (m_data == 0)
+    {
+      return Iterator (0);
+    }
+  return Iterator (m_data->data);
+}
+TraceContext::Iterator 
+TraceContext::AvailableEnd (void) const
+{
+  if (m_data == 0)
+    {
+      return Iterator (0);
+    }
+  uint8_t currentUid;
+  uint16_t i = 0;
+  do {
+    currentUid = m_data->data[i];
+    uint8_t size = ElementRegistry::GetSize (currentUid);
+    i += 1 + size;
+  } while (i < m_data->size && currentUid != 0);
+  return Iterator (m_data->data, i);
+}
 
 void 
 TraceContext::PrintAvailable (std::ostream &os, std::string separator) const
--- a/src/core/trace-context.h	Wed Aug 29 16:42:18 2007 +0200
+++ b/src/core/trace-context.h	Wed Aug 29 16:42:55 2007 +0200
@@ -97,6 +97,26 @@
    * Print the typename of each TraceContextElement stored in this TraceContext.
    */
   void PrintAvailable (std::ostream &os, std::string separator) const;
+  class Iterator 
+  {
+  public:
+    Iterator &operator ++ (void);
+    Iterator operator ++ (int);
+    const std::string &operator * (void) const;
+    const std::string *operator -> (void) const;
+    bool operator == (const Iterator &o);
+    bool operator != (const Iterator &o);
+  private:
+    friend class TraceContext;
+    Iterator (uint8_t *buffer);
+    Iterator (uint8_t *buffer, uint16_t index);
+    void ReadOne (void);
+    uint8_t *m_buffer;
+    uint16_t m_current;
+    std::string m_name;
+  };
+  Iterator AvailableBegin (void) const;
+  Iterator AvailableEnd (void) const;
   /**
    * \param o another trace context
    * \returns true if the input trace context contains exactly the same set of