src/common/mtag-list.cc
changeset 3040 e11e106c7c19
parent 3035 644bfc099992
equal deleted inserted replaced
3039:722cf749a9e3 3040:e11e106c7c19
     1 #include "mtag-list.h"
     1 #include "mtag-list.h"
     2 
     2 
     3 namespace ns3 {
     3 namespace ns3 {
     4 
     4 
     5 MtagList::Iterator::Item::Item (MtagBuffer buf_)
     5 TagList::Iterator::Item::Item (TagBuffer buf_)
     6     : buf (buf_)
     6     : buf (buf_)
     7 {}
     7 {}
     8 
     8 
     9 bool 
     9 bool 
    10 MtagList::Iterator::HasNext (void) const
    10 TagList::Iterator::HasNext (void) const
    11 {
    11 {
    12   return m_current < m_end;
    12   return m_current < m_end;
    13 }
    13 }
    14 struct MtagList::Iterator::Item 
    14 struct TagList::Iterator::Item 
    15 MtagList::Iterator::Next (void)
    15 TagList::Iterator::Next (void)
    16 {
    16 {
    17   NS_ASSERT (HasNext ());
    17   NS_ASSERT (HasNext ());
    18   struct Item item = Item (MtagBuffer (m_current, m_end));
    18   struct Item item = Item (TagBuffer (m_current, m_end));
    19   item.tid.SetUid (item.buf.ReadU32 ());
    19   item.tid.SetUid (item.buf.ReadU32 ());
    20   item.size = item.buf.ReadU32 ();
    20   item.size = item.buf.ReadU32 ();
    21   item.start = item.buf.ReadU32 ();
    21   item.start = item.buf.ReadU32 ();
    22   item.end = item.buf.ReadU32 ();
    22   item.end = item.buf.ReadU32 ();
    23   item.start = std::max (item.start, m_offsetStart);
    23   item.start = std::max (item.start, m_offsetStart);
    26   item.buf.TrimAtEnd (m_end - m_current);
    26   item.buf.TrimAtEnd (m_end - m_current);
    27   PrepareForNext ();
    27   PrepareForNext ();
    28   return item;
    28   return item;
    29 }
    29 }
    30 void
    30 void
    31 MtagList::Iterator::PrepareForNext (void)
    31 TagList::Iterator::PrepareForNext (void)
    32 {
    32 {
    33   while (m_current < m_end)
    33   while (m_current < m_end)
    34     {
    34     {
    35       struct Item item = Item (MtagBuffer (m_current, m_end));
    35       struct Item item = Item (TagBuffer (m_current, m_end));
    36       item.tid.SetUid (item.buf.ReadU32 ());
    36       item.tid.SetUid (item.buf.ReadU32 ());
    37       item.size = item.buf.ReadU32 ();
    37       item.size = item.buf.ReadU32 ();
    38       item.start = item.buf.ReadU32 ();
    38       item.start = item.buf.ReadU32 ();
    39       item.end = item.buf.ReadU32 ();
    39       item.end = item.buf.ReadU32 ();
    40       if (item.start > m_offsetEnd || item.end < m_offsetStart)
    40       if (item.start > m_offsetEnd || item.end < m_offsetStart)
    45 	{
    45 	{
    46 	  break;
    46 	  break;
    47 	}
    47 	}
    48     }
    48     }
    49 }
    49 }
    50 MtagList::Iterator::Iterator (uint8_t *start, uint8_t *end, uint32_t offsetStart, uint32_t offsetEnd)
    50 TagList::Iterator::Iterator (uint8_t *start, uint8_t *end, uint32_t offsetStart, uint32_t offsetEnd)
    51   : m_current (start),
    51   : m_current (start),
    52     m_end (end),
    52     m_end (end),
    53     m_offsetStart (offsetStart),
    53     m_offsetStart (offsetStart),
    54     m_offsetEnd (offsetEnd)
    54     m_offsetEnd (offsetEnd)
    55 {
    55 {
    56   PrepareForNext ();
    56   PrepareForNext ();
    57 }
    57 }
    58 
    58 
    59 uint32_t 
    59 uint32_t 
    60 MtagList::Iterator::GetOffsetStart (void) const
    60 TagList::Iterator::GetOffsetStart (void) const
    61 {
    61 {
    62   return m_offsetStart;
    62   return m_offsetStart;
    63 }
    63 }
    64 
    64 
    65 
    65 
    66 MtagList::MtagList ()
    66 TagList::TagList ()
    67   : m_buffer (0),
    67   : m_buffer (0),
    68     m_size (0)
    68     m_size (0)
    69 {}
    69 {}
    70 MtagList::MtagList (const MtagList &o)
    70 TagList::TagList (const TagList &o)
    71   : m_size (o.m_size)
    71   : m_size (o.m_size)
    72 {
    72 {
    73   m_buffer = new uint8_t [o.m_size] ();
    73   m_buffer = new uint8_t [o.m_size] ();
    74   memcpy (m_buffer, o.m_buffer, o.m_size);
    74   memcpy (m_buffer, o.m_buffer, o.m_size);
    75 }
    75 }
    76 MtagList &
    76 TagList &
    77 MtagList::operator = (const MtagList &o)
    77 TagList::operator = (const TagList &o)
    78 {
    78 {
    79   delete [] m_buffer;
    79   delete [] m_buffer;
    80   m_buffer = new uint8_t [o.m_size] ();
    80   m_buffer = new uint8_t [o.m_size] ();
    81   memcpy (m_buffer, o.m_buffer, m_size);
    81   memcpy (m_buffer, o.m_buffer, m_size);
    82   m_size = o.m_size;
    82   m_size = o.m_size;
    83   return *this;
    83   return *this;
    84 }
    84 }
    85 MtagList::~MtagList ()
    85 TagList::~TagList ()
    86 {
    86 {
    87   delete [] m_buffer;
    87   delete [] m_buffer;
    88   m_buffer = 0;
    88   m_buffer = 0;
    89   m_size = 0;
    89   m_size = 0;
    90 }
    90 }
    91 
    91 
    92 MtagBuffer
    92 TagBuffer
    93 MtagList::Add (TypeId tid, uint32_t bufferSize, uint32_t start, uint32_t end)
    93 TagList::Add (TypeId tid, uint32_t bufferSize, uint32_t start, uint32_t end)
    94 {
    94 {
    95   uint32_t newSize = m_size + bufferSize + 4 + 4 + 4 + 4;
    95   uint32_t newSize = m_size + bufferSize + 4 + 4 + 4 + 4;
    96   uint8_t *newBuffer = new uint8_t [newSize] ();
    96   uint8_t *newBuffer = new uint8_t [newSize] ();
    97   memcpy (newBuffer, m_buffer, m_size);
    97   memcpy (newBuffer, m_buffer, m_size);
    98   MtagBuffer tag = MtagBuffer (newBuffer + m_size, newBuffer + newSize);
    98   TagBuffer tag = TagBuffer (newBuffer + m_size, newBuffer + newSize);
    99   tag.WriteU32 (tid.GetUid ());
    99   tag.WriteU32 (tid.GetUid ());
   100   tag.WriteU32 (bufferSize);
   100   tag.WriteU32 (bufferSize);
   101   tag.WriteU32 (start);
   101   tag.WriteU32 (start);
   102   tag.WriteU32 (end);
   102   tag.WriteU32 (end);
   103   delete [] m_buffer;
   103   delete [] m_buffer;
   105   m_size = newSize;
   105   m_size = newSize;
   106   return tag;
   106   return tag;
   107 }
   107 }
   108 
   108 
   109 void 
   109 void 
   110 MtagList::Add (const MtagList &o)
   110 TagList::Add (const TagList &o)
   111 {
   111 {
   112   MtagList::Iterator i = o.Begin (0, 0xffffffff);
   112   TagList::Iterator i = o.Begin (0, 0xffffffff);
   113   while (i.HasNext ())
   113   while (i.HasNext ())
   114     {
   114     {
   115       MtagList::Iterator::Item item = i.Next ();
   115       TagList::Iterator::Item item = i.Next ();
   116       MtagBuffer buf = Add (item.tid, item.size, item.start, item.end);
   116       TagBuffer buf = Add (item.tid, item.size, item.start, item.end);
   117       buf.CopyFrom (item.buf);
   117       buf.CopyFrom (item.buf);
   118     }
   118     }
   119 }
   119 }
   120 
   120 
   121 void 
   121 void 
   122 MtagList::Remove (const Iterator &i)
   122 TagList::Remove (const Iterator &i)
   123 {
   123 {
   124   // XXX: more complex to implement.
   124   // XXX: more complex to implement.
   125 }
   125 }
   126 
   126 
   127 void 
   127 void 
   128 MtagList::RemoveAll (void)
   128 TagList::RemoveAll (void)
   129 {
   129 {
   130   delete [] m_buffer;
   130   delete [] m_buffer;
   131   m_buffer = 0;
   131   m_buffer = 0;
   132   m_size = 0;  
   132   m_size = 0;  
   133 }
   133 }
   134 
   134 
   135 MtagList::Iterator 
   135 TagList::Iterator 
   136 MtagList::Begin (uint32_t offsetStart, uint32_t offsetEnd) const
   136 TagList::Begin (uint32_t offsetStart, uint32_t offsetEnd) const
   137 {
   137 {
   138   return Iterator (m_buffer, m_buffer + m_size, offsetStart, offsetEnd);
   138   return Iterator (m_buffer, m_buffer + m_size, offsetStart, offsetEnd);
   139 }
   139 }
   140 
   140 
   141 bool 
   141 bool 
   142 MtagList::IsDirtyAtEnd (uint32_t appendOffset)
   142 TagList::IsDirtyAtEnd (uint32_t appendOffset)
   143 {
   143 {
   144   MtagList::Iterator i = Begin (0, 0xffffffff);
   144   TagList::Iterator i = Begin (0, 0xffffffff);
   145   while (i.HasNext ())
   145   while (i.HasNext ())
   146     {
   146     {
   147       MtagList::Iterator::Item item = i.Next ();
   147       TagList::Iterator::Item item = i.Next ();
   148       if (item.end > appendOffset)
   148       if (item.end > appendOffset)
   149 	{
   149 	{
   150 	  return true;
   150 	  return true;
   151 	}
   151 	}
   152     }
   152     }
   153   return false;
   153   return false;
   154 }
   154 }
   155 
   155 
   156 bool 
   156 bool 
   157 MtagList::IsDirtyAtStart (uint32_t prependOffset)
   157 TagList::IsDirtyAtStart (uint32_t prependOffset)
   158 {
   158 {
   159   MtagList::Iterator i = Begin (0, 0xffffffff);
   159   TagList::Iterator i = Begin (0, 0xffffffff);
   160   while (i.HasNext ())
   160   while (i.HasNext ())
   161     {
   161     {
   162       MtagList::Iterator::Item item = i.Next ();
   162       TagList::Iterator::Item item = i.Next ();
   163       if (item.start < prependOffset)
   163       if (item.start < prependOffset)
   164 	{
   164 	{
   165 	  return true;
   165 	  return true;
   166 	}
   166 	}
   167     }
   167     }
   168   return false;
   168   return false;
   169 }
   169 }
   170 
   170 
   171 void 
   171 void 
   172 MtagList::AddAtEnd (int32_t adjustment, uint32_t appendOffset)
   172 TagList::AddAtEnd (int32_t adjustment, uint32_t appendOffset)
   173 {
   173 {
   174   if (adjustment == 0 && !IsDirtyAtEnd (appendOffset))
   174   if (adjustment == 0 && !IsDirtyAtEnd (appendOffset))
   175     {
   175     {
   176       return;
   176       return;
   177     }
   177     }
   178   MtagList list;
   178   TagList list;
   179   MtagList::Iterator i = Begin (0, 0xffffffff);
   179   TagList::Iterator i = Begin (0, 0xffffffff);
   180   while (i.HasNext ())
   180   while (i.HasNext ())
   181     {
   181     {
   182       MtagList::Iterator::Item item = i.Next ();
   182       TagList::Iterator::Item item = i.Next ();
   183       item.start += adjustment;
   183       item.start += adjustment;
   184       item.end += adjustment;
   184       item.end += adjustment;
   185 
   185 
   186       if (item.start > appendOffset)
   186       if (item.start > appendOffset)
   187 	{
   187 	{
   193 	}
   193 	}
   194       else
   194       else
   195 	{
   195 	{
   196 	  // nothing to do.
   196 	  // nothing to do.
   197 	}
   197 	}
   198       MtagBuffer buf = list.Add (item.tid, item.size, item.start, item.end);
   198       TagBuffer buf = list.Add (item.tid, item.size, item.start, item.end);
   199       buf.CopyFrom (item.buf);
   199       buf.CopyFrom (item.buf);
   200     }
   200     }
   201   *this = list;  
   201   *this = list;  
   202 }
   202 }
   203 
   203 
   204 void 
   204 void 
   205 MtagList::AddAtStart (int32_t adjustment, uint32_t prependOffset)
   205 TagList::AddAtStart (int32_t adjustment, uint32_t prependOffset)
   206 {
   206 {
   207   if (adjustment == 0 && !IsDirtyAtStart (prependOffset))
   207   if (adjustment == 0 && !IsDirtyAtStart (prependOffset))
   208     {
   208     {
   209       return;
   209       return;
   210     }
   210     }
   211   MtagList list;
   211   TagList list;
   212   MtagList::Iterator i = Begin (0, 0xffffffff);
   212   TagList::Iterator i = Begin (0, 0xffffffff);
   213   while (i.HasNext ())
   213   while (i.HasNext ())
   214     {
   214     {
   215       MtagList::Iterator::Item item = i.Next ();
   215       TagList::Iterator::Item item = i.Next ();
   216       item.start += adjustment;
   216       item.start += adjustment;
   217       item.end += adjustment;
   217       item.end += adjustment;
   218 
   218 
   219       if (item.end < prependOffset)
   219       if (item.end < prependOffset)
   220 	{
   220 	{
   226 	}
   226 	}
   227       else
   227       else
   228 	{
   228 	{
   229 	  // nothing to do.
   229 	  // nothing to do.
   230 	}
   230 	}
   231       MtagBuffer buf = list.Add (item.tid, item.size, item.start, item.end);
   231       TagBuffer buf = list.Add (item.tid, item.size, item.start, item.end);
   232       buf.CopyFrom (item.buf);
   232       buf.CopyFrom (item.buf);
   233     }
   233     }
   234   *this = list;    
   234   *this = list;    
   235 }
   235 }
   236 
   236