Search:

SENF Extensible Network Framework

  • Home
  • Download
  • Wiki
  • BerliOS
  • ChangeLog
  • Browse SVN
  • Bug Tracker
  • Overview
  • Examples
  • HowTos
  • Glossary
  • PPI
  • Packets
  • Scheduler
  • Socket
  • Utils
  • Console
  • Daemon
  • Logger
  • Termlib
  • Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

ListParser.cti

Go to the documentation of this file.
00001 // $Id: ListParser.cti 1742 2010-11-04 14:51:56Z g0dil $
00002 //
00003 // Copyright (C) 2007
00004 // Fraunhofer (FOKUS)
00005 // Competence Center NETwork research (NET), St. Augustin, GERMANY
00006 //     Stefan Bund <g0dil@berlios.de>
00007 //
00008 // This program is free software; you can redistribute it and/or modify
00009 // it under the terms of the GNU General Public License as published by
00010 // the Free Software Foundation; either version 2 of the License, or
00011 // (at your option) any later version.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
00017 //
00018 // You should have received a copy of the GNU General Public License
00019 // along with this program; if not, write to the
00020 // Free Software Foundation, Inc.,
00021 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00022 
00026 #include "ListParser.ih"
00027 
00028 // Custom includes
00029 #include <senf/Utils/senfassert.hh>
00030 
00031 #define prefix_ inline
00032 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00033 
00034 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00035 // senf::ListParser<ListPolicy>
00036 
00037 template <class ListPolicy>
00038 prefix_ senf::ListParser<ListPolicy>::ListParser(data_iterator i, state_type s)
00039     : PacketParserBase(i,s), ListPolicy()
00040 {}
00041 
00042 template <class ListPolicy>
00043 prefix_ senf::ListParser<ListPolicy>::ListParser(ListPolicy policy,
00044                                                                data_iterator i, state_type s)
00045     : PacketParserBase(i,s), ListPolicy(policy)
00046 {}
00047 
00048 template <class ListPolicy>
00049 prefix_ senf::PacketParserBase::size_type
00050 senf::ListParser<ListPolicy>::bytes()
00051     const
00052 {
00053     return ListPolicy::bytes(i(),state());
00054 }
00055 
00056 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00057 // Container interface
00058 
00059 template <class ListPolicy>
00060 prefix_ senf::PacketParserBase::size_type
00061 senf::ListParser<ListPolicy>::size()
00062     const
00063 {
00064     return ListPolicy::size(i(),state());
00065 }
00066 
00067 template <class ListPolicy>
00068 prefix_ bool senf::ListParser<ListPolicy>::empty()
00069     const
00070 {
00071     container c (*this);
00072     return c.empty();
00073 }
00074 
00075 template <class ListPolicy>
00076 prefix_ typename senf::ListParser<ListPolicy>::value_type
00077 senf::ListParser<ListPolicy>::front()
00078     const
00079 {
00080     SENF_ASSERT( ! empty(), "front() called on empty list" );
00081     container c(*this);
00082     return *(c.begin());
00083 }
00084 
00085 template <class ListPolicy>
00086 template <class Value>
00087 prefix_ void senf::ListParser<ListPolicy>::push_back(Value const & value, size_type n)
00088     const
00089 {
00090     container c(*this);
00091     c.push_back(value,n);
00092 }
00093 
00094 template <class ListPolicy>
00095 prefix_ typename senf::ListParser<ListPolicy>::value_type
00096 senf::ListParser<ListPolicy>::push_back_space(size_type n)
00097     const
00098 {
00099     container c(*this);
00100     return c.push_back_space(n);
00101 }
00102 
00103 template <class ListPolicy>
00104 template <class Value>
00105 prefix_ void senf::ListParser<ListPolicy>::push_front(Value const & value, size_type n)
00106     const
00107 {
00108     container c(*this);
00109     c.push_front(value,n);
00110 }
00111 
00112 template <class ListPolicy>
00113 prefix_ typename senf::ListParser<ListPolicy>::value_type
00114 senf::ListParser<ListPolicy>::push_front_space(size_type n)
00115     const
00116 {
00117     container c(*this);
00118     return c.push_front_space(n);
00119 }
00120 
00121 template <class ListPolicy>
00122 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n)
00123     const
00124 {
00125     container c(*this);
00126     c.resize(n);
00127 }
00128 
00129 template <class ListPolicy>
00130 template <class Value>
00131 prefix_ void senf::ListParser<ListPolicy>::resize(size_type n, Value value)
00132     const
00133 {
00134     container c(*this);
00135     c.resize(n,value);
00136 }
00137 
00138 template <class ListPolicy>
00139 prefix_ typename senf::ListParser<ListPolicy> &
00140 senf::ListParser<ListPolicy>::get(ListPolicy & p)
00141 {
00142     return static_cast<ListParser &>(p);
00143 }
00144 
00145 template <class ListPolicy>
00146 prefix_ typename senf::ListParser<ListPolicy> const &
00147 senf::ListParser<ListPolicy>::get(ListPolicy const & p)
00148 {
00149     return static_cast<ListParser const &>(p);
00150 }
00151 
00152 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00153 // senf::detail::ListParser_Iterator<ElementParser,IteratorPolicy>
00154 
00155 template <class Container>
00156 prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator()
00157 {}
00158 
00159 template <class Container>
00160 prefix_ senf::detail::ListParser_Iterator<Container>::ListParser_Iterator(Container const & c)
00161     : c_ (&c)
00162 {}
00163 
00164 template <class Container>
00165 prefix_ senf::PacketParserBase::data_iterator
00166 senf::detail::ListParser_Iterator<Container>::raw()
00167     const
00168 {
00169     return c_->Container::policy::raw(*c_, *this);
00170 }
00171 
00172 template <class Container>
00173 prefix_ senf::PacketParserBase::data_iterator
00174 senf::detail::ListParser_Iterator<Container>::i()
00175     const
00176 {
00177     return i_;
00178 }
00179 
00180 template <class Container>
00181 prefix_ typename senf::detail::ListParser_Iterator<Container> &
00182 senf::detail::ListParser_Iterator<Container>::get(typename Container::policy::iterator_data & d)
00183 {
00184     return static_cast<ListParser_Iterator &>(d);
00185 }
00186 
00187 template <class Container>
00188 prefix_ typename senf::detail::ListParser_Iterator<Container> const &
00189 senf::detail::ListParser_Iterator<Container>::
00190 get(typename Container::policy::iterator_data const & d)
00191 {
00192     return static_cast<ListParser_Iterator const &>(d);
00193 }
00194 
00195 template <class Container>
00196 prefix_ typename senf::detail::ListParser_Iterator<Container>::value_type
00197 senf::detail::ListParser_Iterator<Container>::dereference()
00198     const
00199 {
00200     return value_type(i_,c_->state());
00201 }
00202 
00203 template <class Container>
00204 prefix_ bool
00205 senf::detail::ListParser_Iterator<Container>::equal(ListParser_Iterator const & other)
00206     const
00207 {
00208     return i_ == other.i_;
00209 }
00210 
00211 template <class Container>
00212 prefix_ void senf::detail::ListParser_Iterator<Container>::increment()
00213 {
00214     i_ = c_->Container::policy::next(*c_, *this);
00215 }
00216 
00217 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00218 // senf::ListParser_Container<ListPolicy>
00219 
00220 // Structors and default members
00221 
00222 template <class ListPolicy>
00223 prefix_ senf::ListParser_Container<ListPolicy>::
00224 ListParser_Container(parser_type const & list)
00225     : ListPolicy(static_cast<typename parser_type::policy const &>(list)),
00226       state_(list.state()), i_(std::distance(data().begin(),list.i()))
00227 {
00228     ListPolicy::construct(*this);
00229 }
00230 
00231 template <class ListPolicy>
00232 prefix_ senf::ListParser_Container<ListPolicy>::~ListParser_Container()
00233 {
00234     ListPolicy::update(*this);
00235     ListPolicy::destruct(*this);
00236 }
00237 
00238 // Accessors
00239 
00240 template <class ListPolicy>
00241 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
00242 senf::ListParser_Container<ListPolicy>::size()
00243     const
00244 {
00245     ListPolicy::update(*this);
00246     return ListPolicy::size(i(),state());
00247 }
00248 
00249 template <class ListPolicy>
00250 prefix_ bool senf::ListParser_Container<ListPolicy>::empty()
00251     const
00252 {
00253     ListPolicy::update(*this);
00254     return begin() == end();
00255 }
00256 
00257 template <class ListPolicy>
00258 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
00259 senf::ListParser_Container<ListPolicy>::begin()
00260     const
00261 {
00262     ListPolicy::update(*this);
00263     iterator i (*this);
00264     i.i_ = ListPolicy::setBegin(*this, i);
00265     return i;
00266 }
00267 
00268 template <class ListPolicy>
00269 prefix_ typename senf::ListParser_Container<ListPolicy>::iterator
00270 senf::ListParser_Container<ListPolicy>::end()
00271     const
00272 {
00273     ListPolicy::update(*this);
00274     iterator i (*this);
00275     i.i_ = ListPolicy::setEnd(*this, i);
00276     return i;
00277 }
00278 
00279 template <class ListPolicy>
00280 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
00281 senf::ListParser_Container<ListPolicy>::front()
00282     const
00283 {
00284     SENF_ASSERT( ! empty(), "front() called on empty list" );
00285     return *begin();
00286 }
00287 
00288 // Mutators
00289 
00290 template <class ListPolicy>
00291 template <class Value>
00292 prefix_ void senf::ListParser_Container<ListPolicy>::insert(iterator pos,
00293                                                             Value const & t)
00294 {
00295     insert(pos,1,t);
00296 }
00297 
00298 template <class ListPolicy>
00299 prefix_ void senf::ListParser_Container<ListPolicy>::erase(iterator f, iterator l)
00300 {
00301     erase(f,std::distance(f,l));
00302 }
00303 
00304 template <class ListPolicy>
00305 template <class Value>
00306 prefix_ void senf::ListParser_Container<ListPolicy>::push_back(Value const & value,
00307                                                                size_type n)
00308 {
00309     insert(end(),n,value);
00310 }
00311 
00312 template <class ListPolicy>
00313 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
00314 senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
00315 {
00316     return shift(end(),n);
00317 }
00318 
00319 template <class ListPolicy>
00320 template <class Value>
00321 prefix_ void senf::ListParser_Container<ListPolicy>::push_front(Value const & value,
00322                                                                 size_type n)
00323 {
00324     insert(begin(),n,value);
00325 }
00326 
00327 template <class ListPolicy>
00328 prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
00329 senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
00330 {
00331     return shift(begin(),n);
00332 }
00333 
00334 // Parser interface
00335 
00336 template <class ListPolicy>
00337 prefix_ typename senf::ListParser_Container<ListPolicy>::parser_type
00338 senf::ListParser_Container<ListPolicy>::parser()
00339     const
00340 {
00341     ListPolicy::update(*this);
00342     return parser_type(i(),state());
00343 }
00344 
00345 template <class ListPolicy>
00346 prefix_ typename senf::ListParser_Container<ListPolicy>::data_iterator
00347 senf::ListParser_Container<ListPolicy>::i()
00348     const
00349 {
00350     return boost::next(data().begin(),i_);
00351 }
00352 
00353 template <class ListPolicy>
00354 prefix_ typename senf::ListParser_Container<ListPolicy>::state_type
00355 senf::ListParser_Container<ListPolicy>::state()
00356     const
00357 {
00358     return state_;
00359 }
00360 
00361 template <class ListPolicy>
00362 prefix_ senf::PacketData & senf::ListParser_Container<ListPolicy>::data()
00363     const
00364 {
00365     return *state_;
00366 }
00367 
00368 template <class ListPolicy>
00369 prefix_ typename senf::ListParser_Container<ListPolicy>::size_type
00370 senf::ListParser_Container<ListPolicy>::bytes()
00371     const
00372 {
00373     ListPolicy::update(*this);
00374     return ListPolicy::bytes(i(),state());
00375 }
00376 
00377 template <class ListPolicy>
00378 prefix_ void senf::ListParser_Container<ListPolicy>::init()
00379     const
00380 {
00381     parser().init();
00382 }
00383 
00384 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00385 #undef prefix_
00386 
00387 
00388 // Local Variables:
00389 // mode: c++
00390 // fill-column: 100
00391 // comment-column: 40
00392 // c-file-style: "senf"
00393 // indent-tabs-mode: nil
00394 // ispell-local-dictionary: "american"
00395 // compile-command: "scons -u test"
00396 // End:

Contact: senf-dev@lists.berlios.de | © 2006-2010 Fraunhofer Institute for Open Communication Systems, Network Research