20 #include "byte-tag-list.h"
27 #define USE_FREE_LIST 1
28 #define FREE_LIST_SIZE 1000
29 #define OFFSET_MAX (2147483647)
46 static uint32_t g_maxSize = 0;
48 ByteTagListDataFreeList::~ByteTagListDataFreeList ()
51 for (ByteTagListDataFreeList::iterator i = begin ();
54 uint8_t *buffer = (uint8_t *)(*i);
60 ByteTagList::Iterator::Item::Item (TagBuffer buf_)
67 ByteTagList::Iterator::HasNext (
void)
const
70 return m_current < m_end;
72 struct ByteTagList::Iterator::Item
73 ByteTagList::Iterator::Next (void)
76 struct Item item = Item (TagBuffer (m_current+16, m_end));
77 item.tid.SetUid (m_nextTid);
78 item.size = m_nextSize;
79 item.start = std::max (m_nextStart, m_offsetStart);
80 item.end = std::min (m_nextEnd, m_offsetEnd);
81 m_current += 4 + 4 + 4 + 4 + item.size;
82 item.buf.TrimAtEnd (m_end - m_current);
87 ByteTagList::Iterator::PrepareForNext (
void)
90 while (m_current < m_end)
92 TagBuffer buf = TagBuffer (m_current, m_end);
93 m_nextTid = buf.ReadU32 ();
94 m_nextSize = buf.ReadU32 ();
95 m_nextStart = buf.ReadU32 ();
96 m_nextEnd = buf.ReadU32 ();
97 if (m_nextStart >= m_offsetEnd || m_nextEnd <= m_offsetStart)
99 m_current += 4 + 4 + 4 + 4 + m_nextSize;
107 ByteTagList::Iterator::Iterator (uint8_t *start, uint8_t *end, int32_t offsetStart, int32_t offsetEnd)
110 m_offsetStart (offsetStart),
111 m_offsetEnd (offsetEnd)
118 ByteTagList::Iterator::GetOffsetStart (
void)
const
121 return m_offsetStart;
125 ByteTagList::ByteTagList ()
131 ByteTagList::ByteTagList (
const ByteTagList &o)
142 ByteTagList::operator = (
const ByteTagList &o)
158 ByteTagList::~ByteTagList ()
170 uint32_t spaceNeeded = m_used + bufferSize + 4 + 4 + 4 + 4;
174 m_data = Allocate (spaceNeeded);
177 else if (m_data->size < spaceNeeded ||
178 (m_data->count != 1 && m_data->dirty != m_used))
181 std::memcpy (&newData->data, &m_data->data, m_used);
186 &m_data->data[spaceNeeded]);
191 m_used = spaceNeeded;
192 m_data->dirty = m_used;
204 TagBuffer buf =
Add (item.tid, item.size, item.start, item.end);
205 buf.CopyFrom (item.buf);
210 ByteTagList::RemoveAll (
void)
218 ByteTagList::Iterator
219 ByteTagList::BeginAll (
void)
const
224 return Begin (0, OFFSET_MAX);
227 ByteTagList::Iterator
233 return Iterator (0, 0, offsetStart, offsetEnd);
237 return Iterator (m_data->data, &m_data->data[m_used], offsetStart, offsetEnd);
242 ByteTagList::IsDirtyAtEnd (int32_t appendOffset)
249 if (item.end > appendOffset)
258 ByteTagList::IsDirtyAtStart (int32_t prependOffset)
261 ByteTagList::Iterator i = BeginAll ();
264 ByteTagList::Iterator::Item item = i.Next ();
265 if (item.start < prependOffset)
277 if (adjustment == 0 && !IsDirtyAtEnd (appendOffset))
286 item.start += adjustment;
287 item.end += adjustment;
289 if (item.start >= appendOffset)
293 else if (item.start < appendOffset && item.end > appendOffset)
295 item.end = appendOffset;
301 TagBuffer buf = list.
Add (item.tid, item.size, item.start, item.end);
302 buf.CopyFrom (item.buf);
311 if (adjustment == 0 && !IsDirtyAtStart (prependOffset))
320 item.start += adjustment;
321 item.end += adjustment;
323 if (item.end <= prependOffset)
327 else if (item.end > prependOffset && item.start < prependOffset)
329 item.start = prependOffset;
335 TagBuffer buf = list.
Add (item.tid, item.size, item.start, item.end);
336 buf.CopyFrom (item.buf);
344 ByteTagList::Allocate (uint32_t size)
347 while (!g_freeList.empty ())
350 g_freeList.pop_back ();
352 if (data->size >= size)
358 uint8_t *buffer = (uint8_t *)data;
361 uint8_t *buffer =
new uint8_t [std::max (size, g_maxSize) +
sizeof (
struct ByteTagListData) - 4];
362 struct ByteTagListData *data = (
struct ByteTagListData *)buffer;
370 ByteTagList::Deallocate (
struct ByteTagListData *data)
377 g_maxSize = std::max (g_maxSize, data->size);
379 if (data->count == 0)
381 if (g_freeList.size () > FREE_LIST_SIZE ||
382 data->size < g_maxSize)
384 uint8_t *buffer = (uint8_t *)data;
389 g_freeList.push_back (data);
396 struct ByteTagListData *
397 ByteTagList::Allocate (uint32_t size)
400 uint8_t *buffer =
new uint8_t [size +
sizeof (
struct ByteTagListData) - 4];
401 struct ByteTagListData *data = (
struct ByteTagListData *)buffer;
409 ByteTagList::Deallocate (
struct ByteTagListData *data)
417 if (data->count == 0)
419 uint8_t *buffer = (uint8_t *)data;
#define NS_LOG_FUNCTION(parameters)
keep track of the tags stored in a packet.
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
TagBuffer Add(TypeId tid, uint32_t bufferSize, int32_t start, int32_t end)
TAG_BUFFER_INLINE void WriteU32(uint32_t v)
void AddAtEnd(int32_t adjustment, int32_t appendOffset)
uint16_t GetUid(void) const
ByteTagList::Iterator Begin(int32_t offsetStart, int32_t offsetEnd) const
a unique identifier for an interface.
void AddAtStart(int32_t adjustment, int32_t prependOffset)