00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #include "ListParser.ih"
00027
00028
00029 #include <senf/Utils/senfassert.hh>
00030
00031 #define prefix_ inline
00032
00033
00034
00035
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
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
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
00219
00220
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
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
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
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
00389
00390
00391
00392
00393
00394
00395
00396