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 ListParser inline template implementation */
31 #include "ListParser.ih"
34 #include <senf/Utils/senfassert.hh>
36 #define prefix_ inline
37 //-/////////////////////////////////////////////////////////////////////////////////////////////////
39 //-/////////////////////////////////////////////////////////////////////////////////////////////////
40 // senf::ListParser<ListPolicy>
42 template <class ListPolicy>
43 prefix_ senf::ListParser<ListPolicy>::ListParser(data_iterator i, state_type s)
44 : PacketParserBase(i,s), ListPolicy()
47 template <class ListPolicy>
48 prefix_ senf::ListParser<ListPolicy>::ListParser(ListPolicy policy,
49 data_iterator i, state_type s)
50 : PacketParserBase(i,s), ListPolicy(policy)
53 template <class ListPolicy>
54 prefix_ senf::PacketParserBase::size_type
55 senf::ListParser<ListPolicy>::bytes()
58 return ListPolicy::bytes(i(),state());
61 //-/////////////////////////////////////////////////////////////////////////////////////////////////
62 // Container interface
64 template <class ListPolicy>
65 prefix_ senf::PacketParserBase::size_type
66 senf::ListParser<ListPolicy>::size()
69 return ListPolicy::size(i(),state());
72 template <class ListPolicy>
73 prefix_ bool senf::ListParser<ListPolicy>::empty()
80 template <class ListPolicy>
81 prefix_ typename senf::ListParser<ListPolicy>::value_type
82 senf::ListParser<ListPolicy>::front()
85 SENF_ASSERT( ! empty(), "front() called on empty list" );
90 template <class ListPolicy>
91 template <class Value>
92 prefix_ void senf::ListParser<ListPolicy>::push_back(Value const & value, size_type n)
99 template <class ListPolicy>
100 prefix_ typename senf::ListParser<ListPolicy>::value_type
101 senf::ListParser<ListPolicy>::push_back_space(size_type n)
105 return c.push_back_space(n);
108 template <class ListPolicy>
109 template <class Value>
110 prefix_ void senf::ListParser<ListPolicy>::push_front(Value const & value, size_type n)
114 c.push_front(value,n);
117 template <class ListPolicy>
118 prefix_ typename senf::ListParser<ListPolicy>::value_type
119 senf::ListParser<ListPolicy>::push_front_space(size_type n)
123 return c.push_front_space(n);
126 template <class ListPolicy>
127 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n)
134 template <class ListPolicy>
135 template <class Value>
136 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n, Value value)
143 template <class ListPolicy>
144 prefix_ typename senf::ListParser<ListPolicy> &
145 senf::ListParser<ListPolicy>::get(ListPolicy & p)
147 return static_cast<ListParser &>(p);
150 template <class ListPolicy>
151 prefix_ typename senf::ListParser<ListPolicy> const &
152 senf::ListParser<ListPolicy>::get(ListPolicy const & p)
154 return static_cast<ListParser const &>(p);
157 //-/////////////////////////////////////////////////////////////////////////////////////////////////
158 // senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>
160 template <class Container>
161 prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator()
164 template <class Container>
165 prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator(Container const & c)
169 template <class Container>
170 prefix_ senf::PacketParserBase::data_iterator
171 senf::detail::ListParser_Iterator<Container>::raw()
174 return c_->Container::policy::raw(*c_, *this);
177 template <class Container>
178 prefix_ senf::PacketParserBase::data_iterator
179 senf::detail::ListParser_Iterator<Container>::i()
185 template <class Container>
186 prefix_ typename senf::detail::ListParser_Iterator<Container> &
187 senf::detail::ListParser_Iterator<Container>::get(typename Container::policy::iterator_data & d)
189 return static_cast<ListParser_Iterator &>(d);
192 template <class Container>
193 prefix_ typename senf::detail::ListParser_Iterator<Container> const &
194 senf::detail::ListParser_Iterator<Container>::
195 get(typename Container::policy::iterator_data const & d)
197 return static_cast<ListParser_Iterator const &>(d);
200 template <class Container>
201 prefix_ typename senf::detail::ListParser_Iterator<Container>::value_type
202 senf::detail::ListParser_Iterator<Container>::dereference()
205 return value_type(i_,c_->state());
208 template <class Container>
210 senf::detail::ListParser_Iterator<Container>::equal(ListParser_Iterator const & other)
213 return i_ == other.i_;
216 template <class Container>
217 prefix_ void senf::detail::ListParser_Iterator<Container>::increment()
219 i_ = c_->Container::policy::next(*c_, *this);
222 //-/////////////////////////////////////////////////////////////////////////////////////////////////
223 // senf::ListParser_Container<ListPolicy>
225 // Structors and default members
227 template <class ListPolicy>
228 prefix_ senf::ListParser_Container<ListPolicy>::
229 ListParser_Container(parser_type const & list)
230 : ListPolicy(static_cast<typename parser_type::policy const &>(list)),
231 state_(list.state()), i_(std::distance(data().begin(),list.i()))
233 ListPolicy::construct(*this);
236 template <class ListPolicy>
237 prefix_ senf::ListParser_Container<ListPolicy>::~ListParser_Container()
239 ListPolicy::update(*this);
240 ListPolicy::destruct(*this);
245 template <class ListPolicy>
246 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
247 senf::ListParser_Container<ListPolicy>::size()
250 ListPolicy::update(*this);
251 return ListPolicy::size(i(),state());
254 template <class ListPolicy>
255 prefix_ bool senf::ListParser_Container<ListPolicy>::empty()
258 ListPolicy::update(*this);
259 return begin() == end();
262 template <class ListPolicy>
263 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
264 senf::ListParser_Container<ListPolicy>::begin()
267 ListPolicy::update(*this);
269 i.i_ = ListPolicy::setBegin(*this, i);
273 template <class ListPolicy>
274 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
275 senf::ListParser_Container<ListPolicy>::end()
278 ListPolicy::update(*this);
280 i.i_ = ListPolicy::setEnd(*this, i);
284 template <class ListPolicy>
285 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
286 senf::ListParser_Container<ListPolicy>::front()
289 SENF_ASSERT( ! empty(), "front() called on empty list" );
295 template <class ListPolicy>
296 template <class Value>
297 prefix_ void senf::ListParser_Container<ListPolicy>::insert(iterator pos,
303 template <class ListPolicy>
304 prefix_ void senf::ListParser_Container<ListPolicy>::erase(iterator f, iterator l)
306 erase(f,std::distance(f,l));
309 template <class ListPolicy>
310 template <class Value>
311 prefix_ void senf::ListParser_Container<ListPolicy>::push_back(Value const & value,
314 insert(end(),n,value);
317 template <class ListPolicy>
318 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
319 senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
321 return shift(end(),n);
324 template <class ListPolicy>
325 template <class Value>
326 prefix_ void senf::ListParser_Container<ListPolicy>::push_front(Value const & value,
329 insert(begin(),n,value);
332 template <class ListPolicy>
333 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
334 senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
336 return shift(begin(),n);
341 template <class ListPolicy>
342 prefix_ typename senf::ListParser_Container<ListPolicy>::parser_type
343 senf::ListParser_Container<ListPolicy>::parser()
346 ListPolicy::update(*this);
347 return parser_type(i(),state());
350 template <class ListPolicy>
351 prefix_ typename senf::ListParser_Container<ListPolicy>::data_iterator
352 senf::ListParser_Container<ListPolicy>::i()
355 return boost::next(data().begin(),i_);
358 template <class ListPolicy>
359 prefix_ typename senf::ListParser_Container<ListPolicy>::state_type
360 senf::ListParser_Container<ListPolicy>::state()
366 template <class ListPolicy>
367 prefix_ senf::PacketData & senf::ListParser_Container<ListPolicy>::data()
373 template <class ListPolicy>
374 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
375 senf::ListParser_Container<ListPolicy>::bytes()
378 ListPolicy::update(*this);
379 return ListPolicy::bytes(i(),state());
382 template <class ListPolicy>
383 prefix_ void senf::ListParser_Container<ListPolicy>::init()
389 //-/////////////////////////////////////////////////////////////////////////////////////////////////
396 // comment-column: 40
397 // c-file-style: "senf"
398 // indent-tabs-mode: nil
399 // ispell-local-dictionary: "american"
400 // compile-command: "scons -u test"