4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 // Stefan Bund <stefan.bund@fokus.fraunhofer.de>
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.
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.
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.
23 // Definition of inline template functions
25 #include "ParseVec.ih"
29 #define prefix_ inline
30 ///////////////////////////////cti.p///////////////////////////////////////
32 ///////////////////////////////////////////////////////////////////////////
33 // senf::Parse_Vector<ElementParser,Sizer>
35 template <class ElementParser, class Sizer>
36 prefix_ senf::Parse_Vector<ElementParser,Sizer>::Parse_Vector(data_iterator i, state_type s)
37 : PacketParserBase(i,s), sizer_()
40 template <class ElementParser, class Sizer>
41 prefix_ senf::Parse_Vector<ElementParser,Sizer>::Parse_Vector(Sizer sizer, data_iterator i,
43 : PacketParserBase(i,s), sizer_(sizer)
46 template <class ElementParser, class Sizer>
47 prefix_ typename senf::Parse_Vector<ElementParser,Sizer>::size_type
48 senf::Parse_Vector<ElementParser,Sizer>::bytes()
51 return size()*ElementParser::fixed_bytes + sizer_.bytes(i(),state());
54 // Container interface
56 template <class ElementParser, class Sizer>
57 prefix_ typename senf::Parse_Vector<ElementParser,Sizer>::size_type
58 senf::Parse_Vector<ElementParser,Sizer>::size()
61 return sizer_.size(i(),state());
64 template <class ElementParser, class Sizer>
65 prefix_ bool senf::Parse_Vector<ElementParser,Sizer>::empty()
71 template <class ElementParser, class Sizer>
72 prefix_ typename senf::Parse_Vector<ElementParser,Sizer>::iterator
73 senf::Parse_Vector<ElementParser,Sizer>::begin()
76 return iterator(sizer_.begin(i(),state()),state());
79 template <class ElementParser, class Sizer>
80 prefix_ typename senf::Parse_Vector<ElementParser,Sizer>::iterator
81 senf::Parse_Vector<ElementParser,Sizer>::end()
84 return boost::next(begin(),size());
87 template <class ElementParser, class Sizer>
88 prefix_ typename senf::Parse_Vector<ElementParser,Sizer>::value_type
89 senf::Parse_Vector<ElementParser,Sizer>::operator[](difference_type i)
95 template <class ElementParser, class Sizer>
96 prefix_ typename senf::Parse_Vector<ElementParser,Sizer>::value_type
97 senf::Parse_Vector<ElementParser,Sizer>::front()
103 template <class ElementParser, class Sizer>
104 prefix_ typename senf::Parse_Vector<ElementParser,Sizer>::value_type
105 senf::Parse_Vector<ElementParser,Sizer>::back()
108 return begin()[size()-1];
113 template <class ElementParser, class Sizer>
114 template <class Value>
115 prefix_ void senf::Parse_Vector<ElementParser,Sizer>::push_back(Value value, size_type n)
119 c.push_back(value,n);
122 template <class ElementParser, class Sizer>
123 prefix_ void senf::Parse_Vector<ElementParser,Sizer>::push_back_space(size_type n)
127 c.push_back_space(n);
130 template <class ElementParser, class Sizer>
131 template <class Value>
132 prefix_ void senf::Parse_Vector<ElementParser,Sizer>::push_front(Value value, size_type n)
136 c.push_front(value,n);
139 template <class ElementParser, class Sizer>
140 prefix_ void senf::Parse_Vector<ElementParser,Sizer>::push_front_space(size_type n)
144 c.push_front_space(n);
147 template <class ElementParser, class Sizer>
148 prefix_ void senf::Parse_Vector<ElementParser,Sizer>::resize(size_type n)
155 template <class ElementParser, class Sizer>
156 template <class Value>
157 prefix_ void senf::Parse_Vector<ElementParser,Sizer>::resize(size_type n, Value value)
164 ///////////////////////////////////////////////////////////////////////////
165 // senf::SimpleSizeParser<SizeParser,offset>
167 template <class SizeParser>
168 prefix_ typename senf::detail::Parse_VectorN_Sizer<SizeParser>::size_type
169 senf::detail::Parse_VectorN_Sizer<SizeParser>::size(iterator i, state_type s)
172 return SizeParser(i,s).value();
175 template <class SizeParser>
176 prefix_ void senf::detail::Parse_VectorN_Sizer<SizeParser>::size(iterator i, state_type s,
180 SizeParser(i,s).value(v);
183 template <class SizeParser>
184 prefix_ typename senf::detail::Parse_VectorN_Sizer<SizeParser>::iterator
185 senf::detail::Parse_VectorN_Sizer<SizeParser>::begin(iterator i, state_type s)
188 return boost::next(i,SizeParser::fixed_bytes);
191 template <class SizeParser>
192 prefix_ typename senf::detail::Parse_VectorN_Sizer<SizeParser>::size_type
193 senf::detail::Parse_VectorN_Sizer<SizeParser>::bytes(iterator i, state_type s)
196 return SizeParser::fixed_bytes;
199 template <class SizeParser>
200 prefix_ void senf::detail::Parse_VectorN_Sizer<SizeParser>::init(iterator i, state_type s)
204 ///////////////////////////////////////////////////////////////////////////
205 // senf::Parse_Vector_wrapper<Parser,SizeParser,Container>
207 // structors and default members
209 // hm ... be careful here ! the data() member is called in an incompletely intitialized
210 // instance. However, data() only depends on state_ which is initialized before the call. YOU MUST
211 // NOT CHANGE THE ORDERING OF THE DATA MEMBERS
212 template <class ElementParser, class Sizer>
213 prefix_ senf::Parse_Vector_Container<ElementParser,Sizer>::
214 Parse_Vector_Container(parser_type const & vector)
215 : sizer_ (vector.sizer_), state_ (vector.state()),
216 i_ (std::distance(data().begin(),vector.i()))
221 template <class ElementParser, class Sizer>
222 prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::size_type
223 senf::Parse_Vector_Container<ElementParser,Sizer>::size()
226 return sizer_.size(i(),state());
229 template <class ElementParser, class Sizer>
230 prefix_ bool senf::Parse_Vector_Container<ElementParser,Sizer>::empty()
236 template <class ElementParser, class Sizer>
237 prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::iterator
238 senf::Parse_Vector_Container<ElementParser,Sizer>::begin()
241 return iterator(sizer_.begin(i(),state()),state());
244 template <class ElementParser, class Sizer>
245 prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::iterator
246 senf::Parse_Vector_Container<ElementParser,Sizer>::end()
249 return boost::next(begin(),size());
252 template <class ElementParser, class Sizer>
253 prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::value_type
254 senf::Parse_Vector_Container<ElementParser,Sizer>::operator[](difference_type i)
260 template <class ElementParser, class Sizer>
261 prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::value_type
262 senf::Parse_Vector_Container<ElementParser,Sizer>::front()
268 template <class ElementParser, class Sizer>
269 prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::value_type
270 senf::Parse_Vector_Container<ElementParser,Sizer>::back()
273 return begin()[size()-1];
278 template <class ElementParser, class Sizer>
279 template <class Value>
280 prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::insert(iterator pos,
286 template <class ElementParser, class Sizer>
287 prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::erase(iterator pos, size_type n)
289 data().erase(pos.raw(),boost::next(pos.raw(),n*ElementParser::fixed_bytes));
293 template <class ElementParser, class Sizer>
294 prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::erase(iterator f, iterator l)
296 erase(f,std::distance(f,l));
299 template <class ElementParser, class Sizer>
300 prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::clear()
302 erase(begin(),end());
305 template <class ElementParser, class Sizer>
306 template <class Value>
307 prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::push_back(Value value,
310 insert(end(),n,value);
313 template <class ElementParser, class Sizer>
314 prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::push_back_space(size_type n)
319 template <class ElementParser, class Sizer>
320 template <class Value>
321 prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::push_front(Value value,
324 insert(begin(),n,value);
327 template <class ElementParser, class Sizer>
328 prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::push_front_space(size_type n)
335 template <class ElementParser, class Sizer>
336 prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::parser_type
337 senf::Parse_Vector_Container<ElementParser,Sizer>::parser()
340 return parser_type(i(),state());
343 template <class ElementParser, class Sizer>
344 prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::data_iterator
345 senf::Parse_Vector_Container<ElementParser,Sizer>::i()
348 return boost::next(data().begin(),i_);
351 template <class ElementParser, class Sizer>
352 prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::state_type
353 senf::Parse_Vector_Container<ElementParser,Sizer>::state()
359 template <class ElementParser, class Sizer>
360 prefix_ senf::PacketData &
361 senf::Parse_Vector_Container<ElementParser,Sizer>::data()
367 template <class ElementParser, class Sizer>
368 prefix_ typename senf::Parse_Vector_Container<ElementParser,Sizer>::size_type
369 senf::Parse_Vector_Container<ElementParser,Sizer>::bytes()
372 return size()*ElementParser::fixed_bytes + sizer_.bytes(i(),state());
377 template <class ElementParser, class Sizer>
378 prefix_ void senf::Parse_Vector_Container<ElementParser,Sizer>::setSize(size_type value)
380 sizer_.size(i(),state(),value);
383 /////////////////////////////cti.e///////////////////////////////////////
390 // c-file-style: "senf"
391 // indent-tabs-mode: nil
392 // ispell-local-dictionary: "american"
393 // compile-command: "scons -u test"