Fix SCons 1.2.0 build failure
[senf.git] / 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 "../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
227 template <class ListPolicy>
228 prefix_ senf::ListParser_Container<ListPolicy>::~ListParser_Container()
229 {
230     ListPolicy::update(*this);
231 }
232
233 // Accessors
234
235 template <class ListPolicy>
236 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
237 senf::ListParser_Container<ListPolicy>::size()
238     const
239 {
240     ListPolicy::update(*this);
241     return ListPolicy::size(i(),state());
242 }
243
244 template <class ListPolicy>
245 prefix_ bool senf::ListParser_Container<ListPolicy>::empty()
246     const
247 {
248     ListPolicy::update(*this);
249     return begin() == end();
250 }
251
252 template <class ListPolicy>
253 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
254 senf::ListParser_Container<ListPolicy>::begin()
255     const
256 {
257     ListPolicy::update(*this);
258     iterator i (*this);
259     i.i_ = ListPolicy::setBegin(*this, i);
260     return i;
261 }
262
263 template <class ListPolicy>
264 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
265 senf::ListParser_Container<ListPolicy>::end()
266     const
267 {
268     ListPolicy::update(*this);
269     iterator i (*this);
270     i.i_ = ListPolicy::setEnd(*this, i);
271     return i;
272 }
273
274 template <class ListPolicy>
275 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
276 senf::ListParser_Container<ListPolicy>::front()
277     const
278 {
279     SENF_ASSERT( ! empty() );
280     return *begin();
281 }
282
283 // Mutators
284
285 template <class ListPolicy>
286 template <class Value>
287 prefix_ void senf::ListParser_Container<ListPolicy>::insert(iterator pos,
288                                                             Value const & t)
289 {
290     insert(pos,1,t);
291 }
292
293 template <class ListPolicy>
294 prefix_ void senf::ListParser_Container<ListPolicy>::erase(iterator f, iterator l)
295 {
296     erase(f,std::distance(f,l));
297 }
298
299 template <class ListPolicy>
300 template <class Value>
301 prefix_ void senf::ListParser_Container<ListPolicy>::push_back(Value value,
302                                                                size_type n)
303 {
304     insert(end(),n,value);
305 }
306
307 template <class ListPolicy>
308 prefix_ void senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
309 {
310     shift(end(),n);
311 }
312
313 template <class ListPolicy>
314 template <class Value>
315 prefix_ void senf::ListParser_Container<ListPolicy>::push_front(Value value,
316                                                                 size_type n)
317 {
318     insert(begin(),n,value);
319 }
320
321 template <class ListPolicy>
322 prefix_ void senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
323 {
324     shift(begin(),n);
325 }
326
327 // Parser interface
328
329 template <class ListPolicy>
330 prefix_ typename senf::ListParser_Container<ListPolicy>::parser_type
331 senf::ListParser_Container<ListPolicy>::parser()
332     const
333 {
334     ListPolicy::update(*this);
335     return parser_type(i(),state());
336 }
337
338 template <class ListPolicy>
339 prefix_ typename senf::ListParser_Container<ListPolicy>::data_iterator
340 senf::ListParser_Container<ListPolicy>::i()
341     const
342 {
343     return boost::next(data().begin(),i_);
344 }
345
346 template <class ListPolicy>
347 prefix_ typename senf::ListParser_Container<ListPolicy>::state_type
348 senf::ListParser_Container<ListPolicy>::state()
349     const
350 {
351     return state_;
352 }
353
354 template <class ListPolicy>
355 prefix_ senf::PacketData & senf::ListParser_Container<ListPolicy>::data()
356     const
357 {
358     return *state_;
359 }
360
361 template <class ListPolicy>
362 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
363 senf::ListParser_Container<ListPolicy>::bytes()
364     const
365 {
366     ListPolicy::update(*this);
367     return ListPolicy::bytes(i(),state());
368 }
369
370 template <class ListPolicy>
371 prefix_ void senf::ListParser_Container<ListPolicy>::init()
372     const
373 {
374     parser().init();
375 }
376
377 ///////////////////////////////cti.e///////////////////////////////////////
378 #undef prefix_
379
380 \f
381 // Local Variables:
382 // mode: c++
383 // fill-column: 100
384 // comment-column: 40
385 // c-file-style: "senf"
386 // indent-tabs-mode: nil
387 // ispell-local-dictionary: "american"
388 // compile-command: "scons -u test"
389 // End: