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()
71 return begin() == end();
74 template <class ListPolicy>
75 prefix_ typename senf::ListParser<ListPolicy>::iterator
76 senf::ListParser<ListPolicy>::begin()
79 return iterator(i(),state(),iterator::Begin);
82 template <class ListPolicy>
83 prefix_ typename senf::ListParser<ListPolicy>::iterator
84 senf::ListParser<ListPolicy>::end()
87 return iterator(i(),state(),iterator::End);
90 template <class ListPolicy>
91 prefix_ typename senf::ListParser<ListPolicy>::value_type
92 senf::ListParser<ListPolicy>::front()
95 SENF_ASSERT( ! empty() );
99 template <class ListPolicy>
100 template <class Value>
101 prefix_ void senf::ListParser<ListPolicy>::push_back(Value value, size_type n)
105 c.push_back(value,n);
108 template <class ListPolicy>
109 prefix_ void senf::ListParser<ListPolicy>::push_back_space(size_type n)
113 c.push_back_space(n);
116 template <class ListPolicy>
117 template <class Value>
118 prefix_ void senf::ListParser<ListPolicy>::push_front(Value value, size_type n)
122 c.push_front(value,n);
125 template <class ListPolicy>
126 prefix_ void senf::ListParser<ListPolicy>::push_front_space(size_type n)
130 c.push_front_space(n);
133 template <class ListPolicy>
134 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n)
141 template <class ListPolicy>
142 template <class Value>
143 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n, Value value)
150 ///////////////////////////////////////////////////////////////////////////
151 // senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>
153 template <class ElementParser, class IteratorPolicy>
154 prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::ListParser_Iterator()
157 template <class ElementParser, class IteratorPolicy>
158 prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
159 ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, Begin_t)
160 : IteratorPolicy(), i_(IteratorPolicy::setBegin(i,s)), s_(s)
163 template <class ElementParser, class IteratorPolicy>
164 prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
165 ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, End_t)
166 : IteratorPolicy(), i_(IteratorPolicy::setEnd(i,s)), s_(s)
169 template <class ElementParser, class IteratorPolicy>
170 prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
171 ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s,
172 PacketParserBase::data_iterator p)
173 : IteratorPolicy(), i_(p), s_(s)
175 IteratorPolicy::setFromPosition(i,s,p);
178 template <class ElementParser, class IteratorPolicy>
179 prefix_ senf::PacketParserBase::data_iterator
180 senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::raw()
183 return IteratorPolicy::raw(i_,s_);
186 template <class ElementParser, class IteratorPolicy>
187 prefix_ ElementParser
188 senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::dereference()
191 return ElementParser(i_,s_);
194 template <class ElementParser, class IteratorPolicy>
195 prefix_ bool senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
196 equal(ListParser_Iterator const & other)
199 return i_ == other.i_;
202 template <class ElementParser, class IteratorPolicy>
203 prefix_ void senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::increment()
205 i_ = IteratorPolicy::next(i_,s_);
208 ///////////////////////////////////////////////////////////////////////////
209 // senf::ListParser_Container<ListPolicy>
211 // Structors and default members
213 template <class ListPolicy>
214 prefix_ senf::ListParser_Container<ListPolicy>::
215 ListParser_Container(parser_type const & list)
216 : ListPolicy(list), state_(list.state()), i_(std::distance(data().begin(),list.i()))
219 template <class ListPolicy>
220 prefix_ senf::ListParser_Container<ListPolicy>::~ListParser_Container()
222 ListPolicy::update(i(),state());
227 template <class ListPolicy>
228 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
229 senf::ListParser_Container<ListPolicy>::size()
232 ListPolicy::update(i(),state());
233 return ListPolicy::size(i(),state());
236 template <class ListPolicy>
237 prefix_ bool senf::ListParser_Container<ListPolicy>::empty()
240 ListPolicy::update(i(),state());
241 return begin() == end();
244 template <class ListPolicy>
245 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
246 senf::ListParser_Container<ListPolicy>::begin()
249 ListPolicy::update(i(),state());
250 return iterator(i(),state(),iterator::Begin);
253 template <class ListPolicy>
254 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
255 senf::ListParser_Container<ListPolicy>::end()
258 ListPolicy::update(i(),state());
259 return iterator(i(),state(),iterator::End);
262 template <class ListPolicy>
263 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
264 senf::ListParser_Container<ListPolicy>::front()
267 SENF_ASSERT( ! empty() );
273 template <class ListPolicy>
274 template <class Value>
275 prefix_ void senf::ListParser_Container<ListPolicy>::insert(iterator pos,
281 template <class ListPolicy>
282 prefix_ void senf::ListParser_Container<ListPolicy>::erase(iterator f, iterator l)
284 erase(f,std::distance(f,l));
287 template <class ListPolicy>
288 template <class Value>
289 prefix_ void senf::ListParser_Container<ListPolicy>::push_back(Value value,
292 insert(end(),n,value);
295 template <class ListPolicy>
296 prefix_ void senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
301 template <class ListPolicy>
302 template <class Value>
303 prefix_ void senf::ListParser_Container<ListPolicy>::push_front(Value value,
306 insert(begin(),n,value);
309 template <class ListPolicy>
310 prefix_ void senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
317 template <class ListPolicy>
318 prefix_ typename senf::ListParser_Container<ListPolicy>::parser_type
319 senf::ListParser_Container<ListPolicy>::parser()
322 ListPolicy::update(i(),state());
323 return parser_type(i(),state());
326 template <class ListPolicy>
327 prefix_ typename senf::ListParser_Container<ListPolicy>::data_iterator
328 senf::ListParser_Container<ListPolicy>::i()
331 return boost::next(data().begin(),i_);
334 template <class ListPolicy>
335 prefix_ typename senf::ListParser_Container<ListPolicy>::state_type
336 senf::ListParser_Container<ListPolicy>::state()
342 template <class ListPolicy>
343 prefix_ senf::PacketData & senf::ListParser_Container<ListPolicy>::data()
349 template <class ListPolicy>
350 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
351 senf::ListParser_Container<ListPolicy>::bytes()
354 ListPolicy::update(i(),state());
355 return ListPolicy::bytes(i(),state());
358 template <class ListPolicy>
359 prefix_ void senf::ListParser_Container<ListPolicy>::init()
365 ///////////////////////////////cti.e///////////////////////////////////////
372 // comment-column: 40
373 // c-file-style: "senf"
374 // indent-tabs-mode: nil
375 // ispell-local-dictionary: "american"
376 // compile-command: "scons -u test"