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