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_ typename senf::ListParser<ListPolicy>::value_type
96 senf::ListParser<ListPolicy>::push_back_space(size_type n)
100 return c.push_back_space(n);
103 template <class ListPolicy>
104 template <class Value>
105 prefix_ void senf::ListParser<ListPolicy>::push_front(Value const & value, size_type n)
109 c.push_front(value,n);
112 template <class ListPolicy>
113 prefix_ typename senf::ListParser<ListPolicy>::value_type
114 senf::ListParser<ListPolicy>::push_front_space(size_type n)
118 return c.push_front_space(n);
121 template <class ListPolicy>
122 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n)
129 template <class ListPolicy>
130 template <class Value>
131 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n, Value value)
138 template <class ListPolicy>
139 prefix_ typename senf::ListParser<ListPolicy> &
140 senf::ListParser<ListPolicy>::get(ListPolicy & p)
142 return static_cast<ListParser &>(p);
145 template <class ListPolicy>
146 prefix_ typename senf::ListParser<ListPolicy> const &
147 senf::ListParser<ListPolicy>::get(ListPolicy const & p)
149 return static_cast<ListParser const &>(p);
152 ///////////////////////////////////////////////////////////////////////////
153 // senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>
155 template <class Container>
156 prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator()
159 template <class Container>
160 prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator(Container const & c)
164 template <class Container>
165 prefix_ senf::PacketParserBase::data_iterator
166 senf::detail::ListParser_Iterator<Container>::raw()
169 return c_->Container::policy::raw(*c_, *this);
172 template <class Container>
173 prefix_ senf::PacketParserBase::data_iterator
174 senf::detail::ListParser_Iterator<Container>::i()
180 template <class Container>
181 prefix_ typename senf::detail::ListParser_Iterator<Container> &
182 senf::detail::ListParser_Iterator<Container>::get(typename Container::policy::iterator_data & d)
184 return static_cast<ListParser_Iterator &>(d);
187 template <class Container>
188 prefix_ typename senf::detail::ListParser_Iterator<Container> const &
189 senf::detail::ListParser_Iterator<Container>::
190 get(typename Container::policy::iterator_data const & d)
192 return static_cast<ListParser_Iterator const &>(d);
195 template <class Container>
196 prefix_ typename senf::detail::ListParser_Iterator<Container>::value_type
197 senf::detail::ListParser_Iterator<Container>::dereference()
200 return value_type(i_,c_->state());
203 template <class Container>
205 senf::detail::ListParser_Iterator<Container>::equal(ListParser_Iterator const & other)
208 return i_ == other.i_;
211 template <class Container>
212 prefix_ void senf::detail::ListParser_Iterator<Container>::increment()
214 i_ = c_->Container::policy::next(*c_, *this);
217 ///////////////////////////////////////////////////////////////////////////
218 // senf::ListParser_Container<ListPolicy>
220 // Structors and default members
222 template <class ListPolicy>
223 prefix_ senf::ListParser_Container<ListPolicy>::
224 ListParser_Container(parser_type const & list)
225 : ListPolicy(static_cast<typename parser_type::policy const &>(list)),
226 state_(list.state()), i_(std::distance(data().begin(),list.i()))
228 ListPolicy::construct(*this);
231 template <class ListPolicy>
232 prefix_ senf::ListParser_Container<ListPolicy>::~ListParser_Container()
234 ListPolicy::update(*this);
235 ListPolicy::destruct(*this);
240 template <class ListPolicy>
241 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
242 senf::ListParser_Container<ListPolicy>::size()
245 ListPolicy::update(*this);
246 return ListPolicy::size(i(),state());
249 template <class ListPolicy>
250 prefix_ bool senf::ListParser_Container<ListPolicy>::empty()
253 ListPolicy::update(*this);
254 return begin() == end();
257 template <class ListPolicy>
258 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
259 senf::ListParser_Container<ListPolicy>::begin()
262 ListPolicy::update(*this);
264 i.i_ = ListPolicy::setBegin(*this, i);
268 template <class ListPolicy>
269 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
270 senf::ListParser_Container<ListPolicy>::end()
273 ListPolicy::update(*this);
275 i.i_ = ListPolicy::setEnd(*this, i);
279 template <class ListPolicy>
280 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
281 senf::ListParser_Container<ListPolicy>::front()
284 SENF_ASSERT( ! empty() );
290 template <class ListPolicy>
291 template <class Value>
292 prefix_ void senf::ListParser_Container<ListPolicy>::insert(iterator pos,
298 template <class ListPolicy>
299 prefix_ void senf::ListParser_Container<ListPolicy>::erase(iterator f, iterator l)
301 erase(f,std::distance(f,l));
304 template <class ListPolicy>
305 template <class Value>
306 prefix_ void senf::ListParser_Container<ListPolicy>::push_back(Value const & value,
309 insert(end(),n,value);
312 template <class ListPolicy>
313 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
314 senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
316 return shift(end(),n);
319 template <class ListPolicy>
320 template <class Value>
321 prefix_ void senf::ListParser_Container<ListPolicy>::push_front(Value const & value,
324 insert(begin(),n,value);
327 template <class ListPolicy>
328 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
329 senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
331 return shift(begin(),n);
336 template <class ListPolicy>
337 prefix_ typename senf::ListParser_Container<ListPolicy>::parser_type
338 senf::ListParser_Container<ListPolicy>::parser()
341 ListPolicy::update(*this);
342 return parser_type(i(),state());
345 template <class ListPolicy>
346 prefix_ typename senf::ListParser_Container<ListPolicy>::data_iterator
347 senf::ListParser_Container<ListPolicy>::i()
350 return boost::next(data().begin(),i_);
353 template <class ListPolicy>
354 prefix_ typename senf::ListParser_Container<ListPolicy>::state_type
355 senf::ListParser_Container<ListPolicy>::state()
361 template <class ListPolicy>
362 prefix_ senf::PacketData & senf::ListParser_Container<ListPolicy>::data()
368 template <class ListPolicy>
369 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
370 senf::ListParser_Container<ListPolicy>::bytes()
373 ListPolicy::update(*this);
374 return ListPolicy::bytes(i(),state());
377 template <class ListPolicy>
378 prefix_ void senf::ListParser_Container<ListPolicy>::init()
384 ///////////////////////////////cti.e///////////////////////////////////////
391 // comment-column: 40
392 // c-file-style: "senf"
393 // indent-tabs-mode: nil
394 // ispell-local-dictionary: "american"
395 // compile-command: "scons -u test"