4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at
9 // http://senf.berlios.de/license.html
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on,
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
15 // Software distributed under the License is distributed on an "AS IS" basis,
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
17 // for the specific language governing rights and limitations under the License.
19 // The Original Code is Fraunhofer FOKUS code.
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief VectorParser inline template implementation */
31 #include "VectorParser.ih"
35 #define prefix_ inline
36 //-/////////////////////////////////////////////////////////////////////////////////////////////////
38 //-/////////////////////////////////////////////////////////////////////////////////////////////////
39 // senf::VectorParser<ElementParser,Sizer>
41 template <class ElementParser, class AuxPolicy>
42 prefix_ senf::VectorParser<ElementParser,AuxPolicy>::VectorParser(data_iterator i, state_type s)
43 : PacketParserBase(i,s), AuxPolicy()
46 template <class ElementParser, class AuxPolicy>
47 prefix_ senf::VectorParser<ElementParser,AuxPolicy>::VectorParser(AuxPolicy policy,
48 data_iterator i, state_type s)
49 : PacketParserBase(i,s), AuxPolicy(policy)
52 template <class ElementParser, class AuxPolicy>
53 prefix_ senf::PacketInterpreterBase::size_type
54 senf::VectorParser<ElementParser,AuxPolicy>::bytes()
57 return size()*ElementParser::fixed_bytes + AuxPolicy::aux_bytes;
60 // Container interface
62 template <class ElementParser, class AuxPolicy>
63 prefix_ senf::PacketInterpreterBase::size_type
64 senf::VectorParser<ElementParser,AuxPolicy>::size()
67 return AuxPolicy::aux(i(),state());
70 template <class ElementParser, class AuxPolicy>
71 prefix_ bool senf::VectorParser<ElementParser,AuxPolicy>::empty()
77 template <class ElementParser, class AuxPolicy>
78 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::iterator
79 senf::VectorParser<ElementParser,AuxPolicy>::begin()
82 return iterator(AuxPolicy::adjust(i(),state()),state());
85 template <class ElementParser, class AuxPolicy>
86 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::iterator
87 senf::VectorParser<ElementParser,AuxPolicy>::end()
90 return boost::next(begin(),size());
93 template <class ElementParser, class AuxPolicy>
94 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::value_type
95 senf::VectorParser<ElementParser,AuxPolicy>::operator[](difference_type i)
101 template <class ElementParser, class AuxPolicy>
102 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::value_type
103 senf::VectorParser<ElementParser,AuxPolicy>::front()
109 template <class ElementParser, class AuxPolicy>
110 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::value_type
111 senf::VectorParser<ElementParser,AuxPolicy>::back()
114 return begin()[size()-1];
119 template <class ElementParser, class AuxPolicy>
120 template <class Value>
121 prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::push_back(Value const & value, size_type n)
125 c.push_back(value,n);
128 template <class ElementParser, class AuxPolicy>
129 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::value_type
130 senf::VectorParser<ElementParser,AuxPolicy>::push_back_space(size_type n)
134 return c.push_back_space(n);
137 template <class ElementParser, class AuxPolicy>
138 template <class Value>
139 prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::push_front(Value const & value, size_type n)
143 c.push_front(value,n);
146 template <class ElementParser, class AuxPolicy>
147 prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::value_type
148 senf::VectorParser<ElementParser,AuxPolicy>::push_front_space(size_type n)
152 return c.push_front_space(n);
155 template <class ElementParser, class AuxPolicy>
156 prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::resize(size_type n)
163 template <class ElementParser, class AuxPolicy>
164 template <class Value>
165 prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::resize(size_type n, Value value)
172 //-/////////////////////////////////////////////////////////////////////////////////////////////////
173 // senf::VectorParser_wrapper<Parser,SizeParser,Container>
175 // structors and default members
177 // hm ... be careful here ! the data() member is called in an incompletely intitialized
178 // instance. However, data() only depends on state_ which is initialized before the call. YOU MUST
179 // NOT CHANGE THE ORDERING OF THE DATA MEMBERS
180 template <class ElementParser, class AuxPolicy>
181 prefix_ senf::VectorParser_Container<ElementParser,AuxPolicy>::
182 VectorParser_Container(parser_type const & vector)
183 : AuxPolicy::WrapperPolicy(static_cast<AuxPolicy const &>(vector)), state_ (vector.state()),
184 i_ (std::distance(data().begin(),vector.i()))
189 template <class ElementParser, class AuxPolicy>
190 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::size_type
191 senf::VectorParser_Container<ElementParser,AuxPolicy>::size()
194 return AuxPolicy::WrapperPolicy::aux(i(),state());
197 template <class ElementParser, class AuxPolicy>
198 prefix_ bool senf::VectorParser_Container<ElementParser,AuxPolicy>::empty()
204 template <class ElementParser, class AuxPolicy>
205 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::iterator
206 senf::VectorParser_Container<ElementParser,AuxPolicy>::begin()
209 return iterator( AuxPolicy::WrapperPolicy::adjust(i(),state()),state());
212 template <class ElementParser, class AuxPolicy>
213 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::iterator
214 senf::VectorParser_Container<ElementParser,AuxPolicy>::end()
217 return boost::next(begin(),size());
220 template <class ElementParser, class AuxPolicy>
221 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::value_type
222 senf::VectorParser_Container<ElementParser,AuxPolicy>::operator[](difference_type i)
228 template <class ElementParser, class AuxPolicy>
229 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::value_type
230 senf::VectorParser_Container<ElementParser,AuxPolicy>::front()
236 template <class ElementParser, class AuxPolicy>
237 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::value_type
238 senf::VectorParser_Container<ElementParser,AuxPolicy>::back()
241 return begin()[size()-1];
246 template <class ElementParser, class AuxPolicy>
247 template <class Value>
248 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::insert(iterator pos,
254 template <class ElementParser, class AuxPolicy>
255 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::erase(iterator pos, size_type n)
258 data().erase(pos.raw(),boost::next(pos.raw(),n*ElementParser::fixed_bytes));
261 template <class ElementParser, class AuxPolicy>
262 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::erase(iterator f, iterator l)
264 erase(f,std::distance(f,l));
267 template <class ElementParser, class AuxPolicy>
268 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::clear()
270 erase(begin(),end());
273 template <class ElementParser, class AuxPolicy>
274 template <class Value>
275 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::push_back(Value const & value,
278 insert(end(),n,value);
281 template <class ElementParser, class AuxPolicy>
282 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::value_type
283 senf::VectorParser_Container<ElementParser,AuxPolicy>::push_back_space(size_type n)
285 return *shift(end(),n);
288 template <class ElementParser, class AuxPolicy>
289 template <class Value>
290 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::push_front(Value const & value,
293 insert(begin(),n,value);
296 template <class ElementParser, class AuxPolicy>
297 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::value_type
298 senf::VectorParser_Container<ElementParser,AuxPolicy>::push_front_space(size_type n)
300 return *shift(begin(),n);
305 template <class ElementParser, class AuxPolicy>
306 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::parser_type
307 senf::VectorParser_Container<ElementParser,AuxPolicy>::parser()
310 return parser_type(i(),state());
313 template <class ElementParser, class AuxPolicy>
314 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::data_iterator
315 senf::VectorParser_Container<ElementParser,AuxPolicy>::i()
318 return boost::next(data().begin(),i_);
321 template <class ElementParser, class AuxPolicy>
322 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::state_type
323 senf::VectorParser_Container<ElementParser,AuxPolicy>::state()
329 template <class ElementParser, class AuxPolicy>
330 prefix_ senf::PacketData &
331 senf::VectorParser_Container<ElementParser,AuxPolicy>::data()
337 template <class ElementParser, class AuxPolicy>
338 prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::size_type
339 senf::VectorParser_Container<ElementParser,AuxPolicy>::bytes()
342 return size()*ElementParser::fixed_bytes + AuxPolicy::aux_bytes;
347 template <class ElementParser, class AuxPolicy>
348 prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::setSize(size_type value)
350 AuxPolicy::WrapperPolicy::aux(value, i(),state());
353 //-/////////////////////////////////////////////////////////////////////////////////////////////////
360 // c-file-style: "senf"
361 // indent-tabs-mode: nil
362 // ispell-local-dictionary: "american"
363 // compile-command: "scons -u test"
364 // comment-column: 40