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