4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.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.
24 \brief ListParser inline template implementation */
26 #include "ListParser.ih"
29 #include "../Utils/senfassert.hh"
31 #define prefix_ inline
32 ///////////////////////////////cti.p///////////////////////////////////////
34 ///////////////////////////////////////////////////////////////////////////
35 // senf::ListParser<ListPolicy>
37 template <class ListPolicy>
38 prefix_ senf::ListParser<ListPolicy>::ListParser(data_iterator i, state_type s)
39 : PacketParserBase(i,s), ListPolicy()
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)
48 template <class ListPolicy>
49 prefix_ senf::PacketParserBase::size_type
50 senf::ListParser<ListPolicy>::bytes()
53 return ListPolicy::bytes(i(),state());
56 ///////////////////////////////////////////////////////////////////////////
57 // Container interface
59 template <class ListPolicy>
60 prefix_ senf::PacketParserBase::size_type
61 senf::ListParser<ListPolicy>::size()
64 return ListPolicy::size(i(),state());
67 template <class ListPolicy>
68 prefix_ bool senf::ListParser<ListPolicy>::empty()
75 template <class ListPolicy>
76 prefix_ typename senf::ListParser<ListPolicy>::value_type
77 senf::ListParser<ListPolicy>::front()
80 SENF_ASSERT( ! empty() );
85 template <class ListPolicy>
86 template <class Value>
87 prefix_ void senf::ListParser<ListPolicy>::push_back(Value value, size_type n)
94 template <class ListPolicy>
95 prefix_ void senf::ListParser<ListPolicy>::push_back_space(size_type n)
102 template <class ListPolicy>
103 template <class Value>
104 prefix_ void senf::ListParser<ListPolicy>::push_front(Value value, size_type n)
108 c.push_front(value,n);
111 template <class ListPolicy>
112 prefix_ void senf::ListParser<ListPolicy>::push_front_space(size_type n)
116 c.push_front_space(n);
119 template <class ListPolicy>
120 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n)
127 template <class ListPolicy>
128 template <class Value>
129 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n, Value value)
136 template <class ListPolicy>
137 prefix_ typename senf::ListParser<ListPolicy> &
138 senf::ListParser<ListPolicy>::get(ListPolicy & p)
140 return static_cast<ListParser &>(p);
143 template <class ListPolicy>
144 prefix_ typename senf::ListParser<ListPolicy> const &
145 senf::ListParser<ListPolicy>::get(ListPolicy const & p)
147 return static_cast<ListParser const &>(p);
150 ///////////////////////////////////////////////////////////////////////////
151 // senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>
153 template <class Container>
154 prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator()
157 template <class Container>
158 prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator(Container const & c)
162 template <class Container>
163 prefix_ senf::PacketParserBase::data_iterator
164 senf::detail::ListParser_Iterator<Container>::raw()
167 return c_->Container::policy::raw(*c_, *this);
170 template <class Container>
171 prefix_ senf::PacketParserBase::data_iterator
172 senf::detail::ListParser_Iterator<Container>::i()
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)
182 return static_cast<ListParser_Iterator &>(d);
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)
190 return static_cast<ListParser_Iterator const &>(d);
193 template <class Container>
194 prefix_ typename senf::detail::ListParser_Iterator<Container>::value_type
195 senf::detail::ListParser_Iterator<Container>::dereference()
198 return value_type(i_,c_->state());
201 template <class Container>
203 senf::detail::ListParser_Iterator<Container>::equal(ListParser_Iterator const & other)
206 return i_ == other.i_;
209 template <class Container>
210 prefix_ void senf::detail::ListParser_Iterator<Container>::increment()
212 i_ = c_->Container::policy::next(*c_, *this);
215 ///////////////////////////////////////////////////////////////////////////
216 // senf::ListParser_Container<ListPolicy>
218 // Structors and default members
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()))
227 template <class ListPolicy>
228 prefix_ senf::ListParser_Container<ListPolicy>::~ListParser_Container()
230 ListPolicy::update(*this);
235 template <class ListPolicy>
236 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
237 senf::ListParser_Container<ListPolicy>::size()
240 ListPolicy::update(*this);
241 return ListPolicy::size(i(),state());
244 template <class ListPolicy>
245 prefix_ bool senf::ListParser_Container<ListPolicy>::empty()
248 ListPolicy::update(*this);
249 return begin() == end();
252 template <class ListPolicy>
253 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
254 senf::ListParser_Container<ListPolicy>::begin()
257 ListPolicy::update(*this);
259 i.i_ = ListPolicy::setBegin(*this, i);
263 template <class ListPolicy>
264 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
265 senf::ListParser_Container<ListPolicy>::end()
268 ListPolicy::update(*this);
270 i.i_ = ListPolicy::setEnd(*this, i);
274 template <class ListPolicy>
275 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
276 senf::ListParser_Container<ListPolicy>::front()
279 SENF_ASSERT( ! empty() );
285 template <class ListPolicy>
286 template <class Value>
287 prefix_ void senf::ListParser_Container<ListPolicy>::insert(iterator pos,
293 template <class ListPolicy>
294 prefix_ void senf::ListParser_Container<ListPolicy>::erase(iterator f, iterator l)
296 erase(f,std::distance(f,l));
299 template <class ListPolicy>
300 template <class Value>
301 prefix_ void senf::ListParser_Container<ListPolicy>::push_back(Value value,
304 insert(end(),n,value);
307 template <class ListPolicy>
308 prefix_ void senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
313 template <class ListPolicy>
314 template <class Value>
315 prefix_ void senf::ListParser_Container<ListPolicy>::push_front(Value value,
318 insert(begin(),n,value);
321 template <class ListPolicy>
322 prefix_ void senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
329 template <class ListPolicy>
330 prefix_ typename senf::ListParser_Container<ListPolicy>::parser_type
331 senf::ListParser_Container<ListPolicy>::parser()
334 ListPolicy::update(*this);
335 return parser_type(i(),state());
338 template <class ListPolicy>
339 prefix_ typename senf::ListParser_Container<ListPolicy>::data_iterator
340 senf::ListParser_Container<ListPolicy>::i()
343 return boost::next(data().begin(),i_);
346 template <class ListPolicy>
347 prefix_ typename senf::ListParser_Container<ListPolicy>::state_type
348 senf::ListParser_Container<ListPolicy>::state()
354 template <class ListPolicy>
355 prefix_ senf::PacketData & senf::ListParser_Container<ListPolicy>::data()
361 template <class ListPolicy>
362 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
363 senf::ListParser_Container<ListPolicy>::bytes()
366 ListPolicy::update(*this);
367 return ListPolicy::bytes(i(),state());
370 template <class ListPolicy>
371 prefix_ void senf::ListParser_Container<ListPolicy>::init()
377 ///////////////////////////////cti.e///////////////////////////////////////
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"