286c3251570671303ab8de1f9b178ed7692b0edc
[senf.git] / senf / Packets / ListParser.cti
1 // $Id$
2 //
3 // Copyright (C) 2007
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 ListParser inline template implementation */
25
26 #include "ListParser.ih"
27
28 // Custom includes
29 #include <senf/Utils/senfassert.hh>
30
31 #define prefix_ inline
32 ///////////////////////////////cti.p///////////////////////////////////////
33
34 ///////////////////////////////////////////////////////////////////////////
35 // senf::ListParser<ListPolicy>
36
37 template <class ListPolicy>
38 prefix_ senf::ListParser<ListPolicy>::ListParser(data_iterator i, state_type s)
39     : PacketParserBase(i,s), ListPolicy()
40 {}
41
42 template <class ListPolicy>
43 prefix_ senf::ListParser<ListPolicy>::ListParser(ListPolicy policy,
44                                                                data_iterator i, state_type s)
45     : PacketParserBase(i,s), ListPolicy(policy)
46 {}
47
48 template <class ListPolicy>
49 prefix_ senf::PacketParserBase::size_type
50 senf::ListParser<ListPolicy>::bytes()
51     const
52 {
53     return ListPolicy::bytes(i(),state());
54 }
55
56 ///////////////////////////////////////////////////////////////////////////
57 // Container interface
58
59 template <class ListPolicy>
60 prefix_ senf::PacketParserBase::size_type
61 senf::ListParser<ListPolicy>::size()
62     const
63 {
64     return ListPolicy::size(i(),state());
65 }
66
67 template <class ListPolicy>
68 prefix_ bool senf::ListParser<ListPolicy>::empty()
69     const
70 {
71     container c (*this);
72     return c.empty();
73 }
74
75 template <class ListPolicy>
76 prefix_ typename senf::ListParser<ListPolicy>::value_type
77 senf::ListParser<ListPolicy>::front()
78     const
79 {
80     SENF_ASSERT( ! empty() );
81     container c(*this);
82     return *(c.begin());
83 }
84
85 template <class ListPolicy>
86 template <class Value>
87 prefix_ void senf::ListParser<ListPolicy>::push_back(Value value, size_type n)
88     const
89 {
90     container c(*this);
91     c.push_back(value,n);
92 }
93
94 template <class ListPolicy>
95 prefix_ void senf::ListParser<ListPolicy>::push_back_space(size_type n)
96     const
97 {
98     container c(*this);
99     c.push_back_space(n);
100 }
101
102 template <class ListPolicy>
103 template <class Value>
104 prefix_ void senf::ListParser<ListPolicy>::push_front(Value value, size_type n)
105     const
106 {
107     container c(*this);
108     c.push_front(value,n);
109 }
110
111 template <class ListPolicy>
112 prefix_ void senf::ListParser<ListPolicy>::push_front_space(size_type n)
113     const
114 {
115     container c(*this);
116     c.push_front_space(n);
117 }
118
119 template <class ListPolicy>
120 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n)
121     const
122 {
123     container c(*this);
124     c.resize(n);
125 }
126
127 template <class ListPolicy>
128 template <class Value>
129 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n, Value value)
130     const
131 {
132     container c(*this);
133     c.resize(n,value);
134 }
135
136 template <class ListPolicy>
137 prefix_ typename senf::ListParser<ListPolicy> &
138 senf::ListParser<ListPolicy>::get(ListPolicy & p)
139 {
140     return static_cast<ListParser &>(p);
141 }
142
143 template <class ListPolicy>
144 prefix_ typename senf::ListParser<ListPolicy> const &
145 senf::ListParser<ListPolicy>::get(ListPolicy const & p)
146 {
147     return static_cast<ListParser const &>(p);
148 }
149
150 ///////////////////////////////////////////////////////////////////////////
151 // senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>
152
153 template <class Container>
154 prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator()
155 {}
156
157 template <class Container>
158 prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator(Container const & c)
159     : c_ (&c)
160 {}
161
162 template <class Container>
163 prefix_ senf::PacketParserBase::data_iterator
164 senf::detail::ListParser_Iterator<Container>::raw()
165     const
166 {
167     return c_->Container::policy::raw(*c_, *this);
168 }
169
170 template <class Container>
171 prefix_ senf::PacketParserBase::data_iterator
172 senf::detail::ListParser_Iterator<Container>::i()
173     const
174 {
175     return i_;
176 }
177
178 template <class Container>
179 prefix_ typename senf::detail::ListParser_Iterator<Container> &
180 senf::detail::ListParser_Iterator<Container>::get(typename Container::policy::iterator_data & d)
181 {
182     return static_cast<ListParser_Iterator &>(d);
183 }
184
185 template <class Container>
186 prefix_ typename senf::detail::ListParser_Iterator<Container> const &
187 senf::detail::ListParser_Iterator<Container>::
188 get(typename Container::policy::iterator_data const & d)
189 {
190     return static_cast<ListParser_Iterator const &>(d);
191 }
192
193 template <class Container>
194 prefix_ typename senf::detail::ListParser_Iterator<Container>::value_type
195 senf::detail::ListParser_Iterator<Container>::dereference()
196     const
197 {
198     return value_type(i_,c_->state());
199 }
200
201 template <class Container>
202 prefix_ bool
203 senf::detail::ListParser_Iterator<Container>::equal(ListParser_Iterator const & other)
204     const
205 {
206     return i_ == other.i_;
207 }
208
209 template <class Container>
210 prefix_ void senf::detail::ListParser_Iterator<Container>::increment()
211 {
212     i_ = c_->Container::policy::next(*c_, *this);
213 }
214
215 ///////////////////////////////////////////////////////////////////////////
216 // senf::ListParser_Container<ListPolicy>
217
218 // Structors and default members
219
220 template <class ListPolicy>
221 prefix_ senf::ListParser_Container<ListPolicy>::
222 ListParser_Container(parser_type const & list)
223     : ListPolicy(static_cast<typename parser_type::policy const &>(list)),
224       state_(list.state()), i_(std::distance(data().begin(),list.i()))
225 {
226     ListPolicy::construct(*this);
227 }
228
229 template <class ListPolicy>
230 prefix_ senf::ListParser_Container<ListPolicy>::~ListParser_Container()
231 {
232     ListPolicy::update(*this);
233     ListPolicy::destruct(*this);
234 }
235
236 // Accessors
237
238 template <class ListPolicy>
239 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
240 senf::ListParser_Container<ListPolicy>::size()
241     const
242 {
243     ListPolicy::update(*this);
244     return ListPolicy::size(i(),state());
245 }
246
247 template <class ListPolicy>
248 prefix_ bool senf::ListParser_Container<ListPolicy>::empty()
249     const
250 {
251     ListPolicy::update(*this);
252     return begin() == end();
253 }
254
255 template <class ListPolicy>
256 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
257 senf::ListParser_Container<ListPolicy>::begin()
258     const
259 {
260     ListPolicy::update(*this);
261     iterator i (*this);
262     i.i_ = ListPolicy::setBegin(*this, i);
263     return i;
264 }
265
266 template <class ListPolicy>
267 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
268 senf::ListParser_Container<ListPolicy>::end()
269     const
270 {
271     ListPolicy::update(*this);
272     iterator i (*this);
273     i.i_ = ListPolicy::setEnd(*this, i);
274     return i;
275 }
276
277 template <class ListPolicy>
278 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
279 senf::ListParser_Container<ListPolicy>::front()
280     const
281 {
282     SENF_ASSERT( ! empty() );
283     return *begin();
284 }
285
286 // Mutators
287
288 template <class ListPolicy>
289 template <class Value>
290 prefix_ void senf::ListParser_Container<ListPolicy>::insert(iterator pos,
291                                                             Value const & t)
292 {
293     insert(pos,1,t);
294 }
295
296 template <class ListPolicy>
297 prefix_ void senf::ListParser_Container<ListPolicy>::erase(iterator f, iterator l)
298 {
299     erase(f,std::distance(f,l));
300 }
301
302 template <class ListPolicy>
303 template <class Value>
304 prefix_ void senf::ListParser_Container<ListPolicy>::push_back(Value value,
305                                                                size_type n)
306 {
307     insert(end(),n,value);
308 }
309
310 template <class ListPolicy>
311 prefix_ void senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
312 {
313     shift(end(),n);
314 }
315
316 template <class ListPolicy>
317 template <class Value>
318 prefix_ void senf::ListParser_Container<ListPolicy>::push_front(Value value,
319                                                                 size_type n)
320 {
321     insert(begin(),n,value);
322 }
323
324 template <class ListPolicy>
325 prefix_ void senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
326 {
327     shift(begin(),n);
328 }
329
330 // Parser interface
331
332 template <class ListPolicy>
333 prefix_ typename senf::ListParser_Container<ListPolicy>::parser_type
334 senf::ListParser_Container<ListPolicy>::parser()
335     const
336 {
337     ListPolicy::update(*this);
338     return parser_type(i(),state());
339 }
340
341 template <class ListPolicy>
342 prefix_ typename senf::ListParser_Container<ListPolicy>::data_iterator
343 senf::ListParser_Container<ListPolicy>::i()
344     const
345 {
346     return boost::next(data().begin(),i_);
347 }
348
349 template <class ListPolicy>
350 prefix_ typename senf::ListParser_Container<ListPolicy>::state_type
351 senf::ListParser_Container<ListPolicy>::state()
352     const
353 {
354     return state_;
355 }
356
357 template <class ListPolicy>
358 prefix_ senf::PacketData & senf::ListParser_Container<ListPolicy>::data()
359     const
360 {
361     return *state_;
362 }
363
364 template <class ListPolicy>
365 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
366 senf::ListParser_Container<ListPolicy>::bytes()
367     const
368 {
369     ListPolicy::update(*this);
370     return ListPolicy::bytes(i(),state());
371 }
372
373 template <class ListPolicy>
374 prefix_ void senf::ListParser_Container<ListPolicy>::init()
375     const
376 {
377     parser().init();
378 }
379
380 ///////////////////////////////cti.e///////////////////////////////////////
381 #undef prefix_
382
383 \f
384 // Local Variables:
385 // mode: c++
386 // fill-column: 100
387 // comment-column: 40
388 // c-file-style: "senf"
389 // indent-tabs-mode: nil
390 // ispell-local-dictionary: "american"
391 // compile-command: "scons -u test"
392 // End: