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 <senf/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 const & 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 const & 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()))
226 ListPolicy::construct(*this);
229 template <class ListPolicy>
230 prefix_ senf::ListParser_Container<ListPolicy>::~ListParser_Container()
232 ListPolicy::update(*this);
233 ListPolicy::destruct(*this);
238 template <class ListPolicy>
239 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
240 senf::ListParser_Container<ListPolicy>::size()
243 ListPolicy::update(*this);
244 return ListPolicy::size(i(),state());
247 template <class ListPolicy>
248 prefix_ bool senf::ListParser_Container<ListPolicy>::empty()
251 ListPolicy::update(*this);
252 return begin() == end();
255 template <class ListPolicy>
256 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
257 senf::ListParser_Container<ListPolicy>::begin()
260 ListPolicy::update(*this);
262 i.i_ = ListPolicy::setBegin(*this, i);
266 template <class ListPolicy>
267 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
268 senf::ListParser_Container<ListPolicy>::end()
271 ListPolicy::update(*this);
273 i.i_ = ListPolicy::setEnd(*this, i);
277 template <class ListPolicy>
278 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
279 senf::ListParser_Container<ListPolicy>::front()
282 SENF_ASSERT( ! empty() );
288 template <class ListPolicy>
289 template <class Value>
290 prefix_ void senf::ListParser_Container<ListPolicy>::insert(iterator pos,
296 template <class ListPolicy>
297 prefix_ void senf::ListParser_Container<ListPolicy>::erase(iterator f, iterator l)
299 erase(f,std::distance(f,l));
302 template <class ListPolicy>
303 template <class Value>
304 prefix_ void senf::ListParser_Container<ListPolicy>::push_back(Value const & value,
307 insert(end(),n,value);
310 template <class ListPolicy>
311 prefix_ void senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
316 template <class ListPolicy>
317 template <class Value>
318 prefix_ void senf::ListParser_Container<ListPolicy>::push_front(Value const & value,
321 insert(begin(),n,value);
324 template <class ListPolicy>
325 prefix_ void senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
332 template <class ListPolicy>
333 prefix_ typename senf::ListParser_Container<ListPolicy>::parser_type
334 senf::ListParser_Container<ListPolicy>::parser()
337 ListPolicy::update(*this);
338 return parser_type(i(),state());
341 template <class ListPolicy>
342 prefix_ typename senf::ListParser_Container<ListPolicy>::data_iterator
343 senf::ListParser_Container<ListPolicy>::i()
346 return boost::next(data().begin(),i_);
349 template <class ListPolicy>
350 prefix_ typename senf::ListParser_Container<ListPolicy>::state_type
351 senf::ListParser_Container<ListPolicy>::state()
357 template <class ListPolicy>
358 prefix_ senf::PacketData & senf::ListParser_Container<ListPolicy>::data()
364 template <class ListPolicy>
365 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
366 senf::ListParser_Container<ListPolicy>::bytes()
369 ListPolicy::update(*this);
370 return ListPolicy::bytes(i(),state());
373 template <class ListPolicy>
374 prefix_ void senf::ListParser_Container<ListPolicy>::init()
380 ///////////////////////////////cti.e///////////////////////////////////////
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"