Fix SCons 1.2.0 build failure
[senf.git] / senf / Packets / VectorParser.cti
1 // $Id$
2 //
3 // Copyright (C) 2006
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Stefan Bund <g0dil@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief VectorParser inline template implementation */
25
26 #include "VectorParser.ih"
27
28 // Custom includes
29
30 #define prefix_ inline
31 ///////////////////////////////cti.p///////////////////////////////////////
32
33 ///////////////////////////////////////////////////////////////////////////
34 // senf::VectorParser<ElementParser,Sizer>
35
36 template <class ElementParser, class AuxPolicy>
37 prefix_ senf::VectorParser<ElementParser,AuxPolicy>::VectorParser(data_iterator i, state_type s)
38     : PacketParserBase(i,s), AuxPolicy()
39 {}
40
41 template <class ElementParser, class AuxPolicy>
42 prefix_ senf::VectorParser<ElementParser,AuxPolicy>::VectorParser(AuxPolicy policy,
43                                                                   data_iterator i, state_type s)
44     : PacketParserBase(i,s), AuxPolicy(policy)
45 {}
46
47 template <class ElementParser, class AuxPolicy>
48 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::size_type
49 senf::VectorParser<ElementParser,AuxPolicy>::bytes()
50     const
51 {
52     return size()*ElementParser::fixed_bytes + AuxPolicy::aux_bytes;
53 }
54
55 // Container interface
56
57 template <class ElementParser, class AuxPolicy>
58 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::size_type
59 senf::VectorParser<ElementParser,AuxPolicy>::size()
60     const
61 {
62     return aux(i(),state());
63 }
64
65 template <class ElementParser, class AuxPolicy>
66 prefix_ bool senf::VectorParser<ElementParser,AuxPolicy>::empty()
67     const
68 {
69     return size()==0;
70 }
71
72 template <class ElementParser, class AuxPolicy>
73 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::iterator
74 senf::VectorParser<ElementParser,AuxPolicy>::begin()
75     const
76 {
77     return iterator(adjust(i(),state()),state());
78 }
79
80 template <class ElementParser, class AuxPolicy>
81 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::iterator
82 senf::VectorParser<ElementParser,AuxPolicy>::end()
83     const
84 {
85     return boost::next(begin(),size());
86 }
87
88 template <class ElementParser, class AuxPolicy>
89 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::value_type
90 senf::VectorParser<ElementParser,AuxPolicy>::operator[](difference_type i)
91     const
92 {
93     return begin()[i];
94 }
95
96 template <class ElementParser, class AuxPolicy>
97 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::value_type
98 senf::VectorParser<ElementParser,AuxPolicy>::front()
99     const
100 {
101     return begin()[0];
102 }
103
104 template <class ElementParser, class AuxPolicy>
105 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::value_type
106 senf::VectorParser<ElementParser,AuxPolicy>::back()
107     const
108 {
109     return begin()[size()-1];
110 }
111
112 // Mutators
113
114 template <class ElementParser, class AuxPolicy>
115 template <class Value>
116 prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::push_back(Value value, size_type n)
117     const
118 {
119     container c (*this);
120     c.push_back(value,n);
121 }
122
123 template <class ElementParser, class AuxPolicy>
124 prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::push_back_space(size_type n)
125     const
126 {
127     container c (*this);
128     c.push_back_space(n);
129 }
130
131 template <class ElementParser, class AuxPolicy>
132 template <class Value>
133 prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::push_front(Value value, size_type n)
134     const
135 {
136     container c (*this);
137     c.push_front(value,n);
138 }
139
140 template <class ElementParser, class AuxPolicy>
141 prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::push_front_space(size_type n)
142     const
143 {
144     container c (*this);
145     c.push_front_space(n);
146 }
147
148 template <class ElementParser, class AuxPolicy>
149 prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::resize(size_type n)
150     const
151 {
152     container c (*this);
153     c.resize(n);
154 }
155
156 template <class ElementParser, class AuxPolicy>
157 template <class Value>
158 prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::resize(size_type n, Value value)
159     const
160 {
161     container c (*this);
162     c.resize(n,value);
163 }
164
165 ///////////////////////////////////////////////////////////////////////////
166 // senf::VectorParser_wrapper<Parser,SizeParser,Container>
167
168 // structors and default members
169
170 // hm ... be careful here ! the data() member is called in an incompletely intitialized
171 // instance. However, data() only depends on state_ which is initialized before the call. YOU MUST
172 // NOT CHANGE THE ORDERING OF THE DATA MEMBERS
173 template <class ElementParser, class AuxPolicy>
174 prefix_ senf::VectorParser_Container<ElementParser,AuxPolicy>::
175 VectorParser_Container(parser_type const & vector)
176     : AuxPolicy::WrapperPolicy(static_cast<AuxPolicy const &>(vector)), state_ (vector.state()), 
177       i_ (std::distance(data().begin(),vector.i()))
178 {}
179
180 // accessors
181
182 template <class ElementParser, class AuxPolicy>
183 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::size_type
184 senf::VectorParser_Container<ElementParser,AuxPolicy>::size()
185     const
186 {
187     return aux(i(),state());
188 }
189
190 template <class ElementParser, class AuxPolicy>
191 prefix_ bool senf::VectorParser_Container<ElementParser,AuxPolicy>::empty()
192     const
193 {
194     return size() == 0;
195 }
196
197 template <class ElementParser, class AuxPolicy>
198 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::iterator
199 senf::VectorParser_Container<ElementParser,AuxPolicy>::begin()
200     const
201 {
202     return iterator(adjust(i(),state()),state());
203 }
204
205 template <class ElementParser, class AuxPolicy>
206 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::iterator
207 senf::VectorParser_Container<ElementParser,AuxPolicy>::end()
208     const
209 {
210     return boost::next(begin(),size());
211 }
212
213 template <class ElementParser, class AuxPolicy>
214 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::value_type
215 senf::VectorParser_Container<ElementParser,AuxPolicy>::operator[](difference_type i)
216     const
217 {
218     return begin()[i];
219 }
220
221 template <class ElementParser, class AuxPolicy>
222 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::value_type
223 senf::VectorParser_Container<ElementParser,AuxPolicy>::front()
224     const
225 {
226     return begin()[0];
227 }
228
229 template <class ElementParser, class AuxPolicy>
230 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::value_type
231 senf::VectorParser_Container<ElementParser,AuxPolicy>::back()
232     const
233 {
234     return begin()[size()-1];
235 }
236
237 // Mutators
238
239 template <class ElementParser, class AuxPolicy>
240 template <class Value>
241 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::insert(iterator pos,
242                                                                        Value const & t)
243 {
244     *shift(pos) << t;
245 }
246
247 template <class ElementParser, class AuxPolicy>
248 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::erase(iterator pos, size_type n)
249 {
250     setSize(size()-n);
251     data().erase(pos.raw(),boost::next(pos.raw(),n*ElementParser::fixed_bytes));
252 }
253
254 template <class ElementParser, class AuxPolicy>
255 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::erase(iterator f, iterator l)
256 {
257     erase(f,std::distance(f,l));
258 }
259
260 template <class ElementParser, class AuxPolicy>
261 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::clear()
262 {
263     erase(begin(),end());
264 }
265
266 template <class ElementParser, class AuxPolicy>
267 template <class Value>
268 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::push_back(Value value,
269                                                                           size_type n)
270 {
271     insert(end(),n,value);
272 }
273
274 template <class ElementParser, class AuxPolicy>
275 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::push_back_space(size_type n)
276 {
277     shift(end(),n);
278 }
279
280 template <class ElementParser, class AuxPolicy>
281 template <class Value>
282 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::push_front(Value value,
283                                                                            size_type n)
284 {
285     insert(begin(),n,value);
286 }
287
288 template <class ElementParser, class AuxPolicy>
289 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::push_front_space(size_type n)
290 {
291     shift(begin(),n);
292 }
293
294 // Parser interface
295
296 template <class ElementParser, class AuxPolicy>
297 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::parser_type
298 senf::VectorParser_Container<ElementParser,AuxPolicy>::parser()
299     const
300 {
301     return parser_type(i(),state());
302 }
303
304 template <class ElementParser, class AuxPolicy>
305 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::data_iterator
306 senf::VectorParser_Container<ElementParser,AuxPolicy>::i()
307     const
308 {
309     return boost::next(data().begin(),i_);
310 }
311
312 template <class ElementParser, class AuxPolicy>
313 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::state_type
314 senf::VectorParser_Container<ElementParser,AuxPolicy>::state()
315     const
316 {
317     return state_;
318 }
319
320 template <class ElementParser, class AuxPolicy>
321 prefix_ senf::PacketData &
322 senf::VectorParser_Container<ElementParser,AuxPolicy>::data()
323     const
324 {
325     return *state_;
326 }
327
328 template <class ElementParser, class AuxPolicy>
329 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::size_type
330 senf::VectorParser_Container<ElementParser,AuxPolicy>::bytes()
331     const
332 {
333     return size()*ElementParser::fixed_bytes + AuxPolicy::aux_bytes;
334 }
335
336 // private members
337
338 template <class ElementParser, class AuxPolicy>
339 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::setSize(size_type value)
340 {
341     aux(value, i(),state());
342 }
343
344 /////////////////////////////cti.e///////////////////////////////////////
345 #undef prefix_
346
347 \f
348 // Local Variables:
349 // mode: c++
350 // fill-column: 100
351 // c-file-style: "senf"
352 // indent-tabs-mode: nil
353 // ispell-local-dictionary: "american"
354 // compile-command: "scons -u test"
355 // comment-column: 40
356 // End: