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"
30 #define prefix_ inline
31 ///////////////////////////////cti.p///////////////////////////////////////
33 ///////////////////////////////////////////////////////////////////////////
34 // senf::ListParser<ListPolicy>
36 template <class ListPolicy>
37 prefix_ senf::ListParser<ListPolicy>::ListParser(data_iterator i, state_type s)
38 : PacketParserBase(i,s), ListPolicy()
41 template <class ListPolicy>
42 prefix_ senf::ListParser<ListPolicy>::ListParser(ListPolicy policy,
43 data_iterator i, state_type s)
44 : PacketParserBase(i,s), ListPolicy(policy)
47 template <class ListPolicy>
48 prefix_ senf::PacketParserBase::size_type
49 senf::ListParser<ListPolicy>::bytes()
52 return ListPolicy::bytes(i(),state());
55 ///////////////////////////////////////////////////////////////////////////
56 // Container interface
58 template <class ListPolicy>
59 prefix_ senf::PacketParserBase::size_type
60 senf::ListParser<ListPolicy>::size()
63 return ListPolicy::size(i(),state());
66 template <class ListPolicy>
67 prefix_ bool senf::ListParser<ListPolicy>::empty()
70 return begin() == end();
73 template <class ListPolicy>
74 prefix_ typename senf::ListParser<ListPolicy>::iterator
75 senf::ListParser<ListPolicy>::begin()
78 return iterator(i(),state(),iterator::Begin);
81 template <class ListPolicy>
82 prefix_ typename senf::ListParser<ListPolicy>::iterator
83 senf::ListParser<ListPolicy>::end()
86 return iterator(i(),state(),iterator::End);
89 template <class ListPolicy>
90 prefix_ typename senf::ListParser<ListPolicy>::value_type
91 senf::ListParser<ListPolicy>::front()
94 BOOST_ASSERT( ! empty() );
98 template <class ListPolicy>
99 template <class Value>
100 prefix_ void senf::ListParser<ListPolicy>::push_back(Value value, size_type n)
104 c.push_back(value,n);
107 template <class ListPolicy>
108 prefix_ void senf::ListParser<ListPolicy>::push_back_space(size_type n)
112 c.push_back_space(n);
115 template <class ListPolicy>
116 template <class Value>
117 prefix_ void senf::ListParser<ListPolicy>::push_front(Value value, size_type n)
121 c.push_front(value,n);
124 template <class ListPolicy>
125 prefix_ void senf::ListParser<ListPolicy>::push_front_space(size_type n)
129 c.push_front_space(n);
132 template <class ListPolicy>
133 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n)
140 template <class ListPolicy>
141 template <class Value>
142 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n, Value value)
149 ///////////////////////////////////////////////////////////////////////////
150 // senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>
152 template <class ElementParser, class IteratorPolicy>
153 prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::ListParser_Iterator()
156 template <class ElementParser, class IteratorPolicy>
157 prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
158 ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, Begin_t)
159 : IteratorPolicy(), i_(IteratorPolicy::setBegin(i,s)), s_(s)
162 template <class ElementParser, class IteratorPolicy>
163 prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
164 ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s, End_t)
165 : IteratorPolicy(), i_(IteratorPolicy::setEnd(i,s)), s_(s)
168 template <class ElementParser, class IteratorPolicy>
169 prefix_ senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
170 ListParser_Iterator(PacketParserBase::data_iterator i, PacketParserBase::state_type s,
171 PacketParserBase::data_iterator p)
172 : IteratorPolicy(), i_(p), s_(s)
174 IteratorPolicy::setFromPosition(i,s,p);
177 template <class ElementParser, class IteratorPolicy>
178 prefix_ senf::PacketParserBase::data_iterator
179 senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::raw()
182 return IteratorPolicy::raw(i_,s_);
185 template <class ElementParser, class IteratorPolicy>
186 prefix_ ElementParser
187 senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::dereference()
190 return ElementParser(i_,s_);
193 template <class ElementParser, class IteratorPolicy>
194 prefix_ bool senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::
195 equal(ListParser_Iterator const & other)
198 return i_ == other.i_;
201 template <class ElementParser, class IteratorPolicy>
202 prefix_ void senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>::increment()
204 i_ = IteratorPolicy::next(i_,s_);
207 ///////////////////////////////////////////////////////////////////////////
208 // senf::ListParser_Container<ListPolicy>
210 // Structors and default members
212 template <class ListPolicy>
213 prefix_ senf::ListParser_Container<ListPolicy>::
214 ListParser_Container(parser_type const & list)
215 : ListPolicy(list), state_(list.state()), i_(std::distance(data().begin(),list.i()))
218 template <class ListPolicy>
219 prefix_ senf::ListParser_Container<ListPolicy>::~ListParser_Container()
221 ListPolicy::update(i(),state());
226 template <class ListPolicy>
227 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
228 senf::ListParser_Container<ListPolicy>::size()
231 ListPolicy::update(i(),state());
232 return ListPolicy::size(i(),state());
235 template <class ListPolicy>
236 prefix_ bool senf::ListParser_Container<ListPolicy>::empty()
239 ListPolicy::update(i(),state());
240 return begin() == end();
243 template <class ListPolicy>
244 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
245 senf::ListParser_Container<ListPolicy>::begin()
248 ListPolicy::update(i(),state());
249 return iterator(i(),state(),iterator::Begin);
252 template <class ListPolicy>
253 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
254 senf::ListParser_Container<ListPolicy>::end()
257 ListPolicy::update(i(),state());
258 return iterator(i(),state(),iterator::End);
261 template <class ListPolicy>
262 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
263 senf::ListParser_Container<ListPolicy>::front()
266 BOOST_ASSERT( ! empty() );
272 template <class ListPolicy>
273 template <class Value>
274 prefix_ void senf::ListParser_Container<ListPolicy>::insert(iterator pos,
280 template <class ListPolicy>
281 prefix_ void senf::ListParser_Container<ListPolicy>::erase(iterator f, iterator l)
283 erase(f,std::distance(f,l));
286 template <class ListPolicy>
287 template <class Value>
288 prefix_ void senf::ListParser_Container<ListPolicy>::push_back(Value value,
291 insert(end(),n,value);
294 template <class ListPolicy>
295 prefix_ void senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
300 template <class ListPolicy>
301 template <class Value>
302 prefix_ void senf::ListParser_Container<ListPolicy>::push_front(Value value,
305 insert(begin(),n,value);
308 template <class ListPolicy>
309 prefix_ void senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
316 template <class ListPolicy>
317 prefix_ typename senf::ListParser_Container<ListPolicy>::parser_type
318 senf::ListParser_Container<ListPolicy>::parser()
321 ListPolicy::update(i(),state());
322 return parser_type(i(),state());
325 template <class ListPolicy>
326 prefix_ typename senf::ListParser_Container<ListPolicy>::data_iterator
327 senf::ListParser_Container<ListPolicy>::i()
330 return boost::next(data().begin(),i_);
333 template <class ListPolicy>
334 prefix_ typename senf::ListParser_Container<ListPolicy>::state_type
335 senf::ListParser_Container<ListPolicy>::state()
341 template <class ListPolicy>
342 prefix_ senf::PacketData & senf::ListParser_Container<ListPolicy>::data()
348 template <class ListPolicy>
349 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
350 senf::ListParser_Container<ListPolicy>::bytes()
353 ListPolicy::update(i(),state());
354 return ListPolicy::bytes(i(),state());
357 template <class ListPolicy>
358 prefix_ void senf::ListParser_Container<ListPolicy>::init()
364 ///////////////////////////////cti.e///////////////////////////////////////
371 // comment-column: 40
372 // c-file-style: "senf"
373 // indent-tabs-mode: nil
374 // ispell-local-dictionary: "american"
375 // compile-command: "scons -u test"