00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026
00027
00028
00029 #include "Packet.hh"
00030
00031 #define prefix_
00032
00033
00034
00035
00036
00037
00038
00039 template <class Type>
00040 prefix_ typename senf::PacketInterpreter<Type>::ptr
00041 senf::PacketInterpreterBase::parseNextAs()
00042 {
00043 optional_range r (nextPacketRange());
00044 if (!r)
00045 throw InvalidPacketChainException();
00046
00047 if (next())
00048 impl().truncateInterpreters(next().get());
00049
00050 typename PacketInterpreter<Type>::ptr pi
00051 (PacketInterpreter<Type>::create(&impl(),r->begin(),r->end(),Append));
00052 return pi;
00053 }
00054
00055
00056
00057
00058
00059
00060 template <class PacketType>
00061 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
00062 senf::PacketInterpreter<PacketType>::create(size_type size)
00063 {
00064 if (size < initSize())
00065 throw TruncatedPacketException();
00066 ptr pi (create(size,senf::noinit));
00067 pi->init();
00068 return pi;
00069 }
00070
00071 template <class PacketType>
00072 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
00073 senf::PacketInterpreter<PacketType>::create(size_type size, senf::NoInit_t)
00074 {
00075 detail::PacketImpl::Guard p (new detail::PacketImpl(size,0));
00076 ptr pi (create(p.p,p.p->begin(),p.p->end(),Append));
00077 return pi;
00078 }
00079
00080
00081
00082 template <class PacketType>
00083 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
00084 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
00085 size_type size)
00086 {
00087 if (size < initSize())
00088 throw TruncatedPacketException();
00089 ptr pi (createAfter(packet,size,senf::noinit));
00090 std::fill(pi->data().begin(), pi->data().end(),0);
00091 pi->init();
00092 return pi;
00093 }
00094
00095 template <class PacketType>
00096 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
00097 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
00098 size_type size, senf::NoInit_t)
00099 {
00100 optional_range r (packet->nextPacketRange());
00101 if (!r)
00102 throw InvalidPacketChainException();
00103
00104 if (packet->next())
00105 packet->impl().truncateInterpreters(packet->next().get());
00106
00107 ptr pi (create(&packet->impl(),r->begin(),r->end(),Append));
00108 pi->data().resize(size);
00109 return pi;
00110 }
00111
00112 template <class PacketType>
00113 template <class ForwardReadableRange>
00114 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
00115 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
00116 ForwardReadableRange const & range)
00117 {
00118 optional_range r (packet->nextPacketRange());
00119 if (!r)
00120 throw InvalidPacketChainException();
00121
00122 if (packet->next())
00123 packet->impl().truncateInterpreters(packet->next().get());
00124
00125 ptr pi (create(&packet->impl(),r->begin(),r->end(),Append));
00126 pi->data().resize(boost::size(range));
00127 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
00128 return pi;
00129 }
00130
00131
00132
00133 template <class PacketType>
00134 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
00135 senf::PacketInterpreter<PacketType>::createBefore(PacketInterpreterBase::ptr packet)
00136 {
00137 ptr pi (createBefore(packet, senf::noinit));
00138 pi->data().insert(pi->data().begin(),initHeadSize(),byte(0x00u));
00139 pi->data().insert(pi->data().end(),initSize()-initHeadSize(),byte(0x00u));
00140 pi->init();
00141 return pi;
00142 }
00143
00144 template <class PacketType>
00145 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
00146 senf::PacketInterpreter<PacketType>::createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t)
00147 {
00148 if (packet->prev())
00149 packet->impl().truncateInterpretersBackwards(packet->prev().get());
00150
00151 return create(&packet->impl(),packet->data().begin(),packet->data().end(),Prepend);
00152 }
00153
00154 template <class PacketType>
00155 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
00156 senf::PacketInterpreter<PacketType>::createInsertBefore(PacketInterpreterBase::ptr packet)
00157 {
00158 ptr pi (createInsertBefore(packet, senf::noinit));
00159 pi->data().insert(pi->data().begin(),initHeadSize(),byte(0x00u));
00160 pi->data().insert(pi->data().end(),initSize()-initHeadSize(),byte(0x00u));
00161 pi->init();
00162 return pi;
00163 }
00164
00165 template <class PacketType>
00166 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
00167 senf::PacketInterpreter<PacketType>::createInsertBefore(PacketInterpreterBase::ptr packet,
00168 senf::NoInit_t)
00169 {
00170 return create(&packet->impl(),packet->data().begin(),packet->data().end(),packet);
00171 }
00172
00173
00174
00175
00176
00177
00178 template <class PacketType>
00179 prefix_ typename senf::PacketInterpreter<PacketType>::optional_range
00180 senf::PacketInterpreter<PacketType>::v_nextPacketRange()
00181 {
00182 return type::nextPacketRange(ConcretePacket<PacketType>(ptr(this)));
00183 }
00184
00185 template <class PacketType>
00186 prefix_ senf::PacketInterpreterBase::ptr
00187 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, iterator base,
00188 iterator new_base)
00189 {
00190 return create(impl,
00191 boost::next(new_base,std::distance(base,begin())),
00192 boost::next(new_base,std::distance(base,end())),
00193 Append);
00194 }
00195
00196 template <class PacketType>
00197 prefix_ senf::PacketInterpreterBase::ptr
00198 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, range r)
00199 {
00200 return create(impl, r.begin(), r.end(), Append);
00201 }
00202
00203 template <class PacketType>
00204 prefix_ void senf::PacketInterpreter<PacketType>::v_finalize()
00205 {
00206 type::finalize(ConcretePacket<PacketType>(ptr(this)));
00207 }
00208
00209 template <class PacketType>
00210 prefix_ void senf::PacketInterpreter<PacketType>::v_dump(std::ostream & os)
00211 {
00212 type::dump(ConcretePacket<PacketType>(ptr(this)),os);
00213 }
00214
00215 template <class PacketType>
00216 prefix_ senf::TypeIdValue senf::PacketInterpreter<PacketType>::v_type()
00217 {
00218 return typeIdValue< ConcretePacket<PacketType> >();
00219 }
00220
00221 template <class PacketType>
00222 prefix_ typename senf::PacketInterpreter<PacketType>::factory_t
00223 senf::PacketInterpreter<PacketType>::v_factory()
00224 {
00225 return factory();
00226 }
00227
00228 template <class PacketType>
00229 prefix_ typename senf::PacketInterpreter<PacketType>::factory_t
00230 senf::PacketInterpreter<PacketType>::v_nextPacketType()
00231 {
00232 return type::nextPacketType(ConcretePacket<PacketType>(ptr(this)));
00233 }
00234
00235
00236
00237
00238
00239 template <class ForwardReadableRange>
00240 prefix_ senf::PacketInterpreterBase::ptr
00241 senf::PacketInterpreterBase::Factory::create(ForwardReadableRange const & range)
00242 const
00243 {
00244 ptr pi (create(boost::size(range),senf::noinit));
00245 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
00246 return pi;
00247 }
00248
00249 template <class ForwardReadableRange>
00250 prefix_ senf::PacketInterpreterBase::ptr
00251 senf::PacketInterpreterBase::Factory::createAfter(PacketInterpreterBase::ptr packet,
00252 ForwardReadableRange const & range)
00253 const
00254 {
00255 ptr pi (createAfter(packet,boost::size(range),senf::noinit));
00256 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
00257 return pi;
00258 }
00259
00260
00261
00262
00263
00264
00265 template <class PacketType>
00266 prefix_ typename senf::PacketInterpreterBase::ptr
00267 senf::PacketInterpreter<PacketType>::FactoryImpl::create()
00268 const
00269 {
00270 return senf::PacketInterpreter<PacketType>::create();
00271 }
00272
00273 template <class PacketType>
00274 prefix_ typename senf::PacketInterpreterBase::ptr
00275 senf::PacketInterpreter<PacketType>::FactoryImpl::create(senf::NoInit_t)
00276 const
00277 {
00278 return senf::PacketInterpreter<PacketType>::create(senf::noinit);
00279 }
00280
00281 template <class PacketType>
00282 prefix_ typename senf::PacketInterpreterBase::ptr
00283 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size)
00284 const
00285 {
00286 return senf::PacketInterpreter<PacketType>::create(size);
00287 }
00288
00289 template <class PacketType>
00290 prefix_ typename senf::PacketInterpreterBase::ptr
00291 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size, senf::NoInit_t)
00292 const
00293 {
00294 return senf::PacketInterpreter<PacketType>::create(size, senf::noinit);
00295 }
00296
00297
00298
00299 template <class PacketType>
00300 prefix_ typename senf::PacketInterpreterBase::ptr
00301 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet)
00302 const
00303 {
00304 return senf::PacketInterpreter<PacketType>::createAfter(packet);
00305 }
00306
00307 template <class PacketType>
00308 prefix_ typename senf::PacketInterpreterBase::ptr
00309 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
00310 senf::NoInit_t)
00311 const
00312 {
00313 return senf::PacketInterpreter<PacketType>::createAfter(packet,senf::noinit);
00314 }
00315
00316 template <class PacketType>
00317 prefix_ typename senf::PacketInterpreterBase::ptr
00318 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
00319 size_type size)
00320 const
00321 {
00322 return senf::PacketInterpreter<PacketType>::createAfter(packet,size);
00323 }
00324
00325 template <class PacketType>
00326 prefix_ typename senf::PacketInterpreterBase::ptr
00327 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
00328 size_type size, senf::NoInit_t)
00329 const
00330 {
00331 return senf::PacketInterpreter<PacketType>::createAfter(packet,size,senf::noinit);
00332 }
00333
00334
00335
00336 template <class PacketType>
00337 prefix_ typename senf::PacketInterpreterBase::ptr
00338 senf::PacketInterpreter<PacketType>::FactoryImpl::
00339 createBefore(PacketInterpreterBase::ptr packet)
00340 const
00341 {
00342 return senf::PacketInterpreter<PacketType>::createBefore(packet);
00343 }
00344
00345 template <class PacketType>
00346 prefix_ senf::PacketInterpreterBase::ptr
00347 senf::PacketInterpreter<PacketType>::FactoryImpl::
00348 createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t)
00349 const
00350 {
00351 return senf::PacketInterpreter<PacketType>::createBefore(packet,senf::noinit);
00352 }
00353
00354 template <class PacketType>
00355 prefix_ senf::PacketInterpreterBase::ptr
00356 senf::PacketInterpreter<PacketType>::FactoryImpl::
00357 createInsertBefore(PacketInterpreterBase::ptr packet)
00358 const
00359 {
00360 return senf::PacketInterpreter<PacketType>::createInsertBefore(packet);
00361 }
00362
00363 template <class PacketType>
00364 prefix_ senf::PacketInterpreterBase::ptr
00365 senf::PacketInterpreter<PacketType>::FactoryImpl::
00366 createInsertBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t)
00367 const
00368 {
00369 return senf::PacketInterpreter<PacketType>::createInsertBefore(packet,senf::noinit);
00370 }
00371
00372
00373
00374 template <class PacketType>
00375 prefix_ typename senf::PacketInterpreterBase::ptr
00376 senf::PacketInterpreter<PacketType>::FactoryImpl::parseNext(PacketInterpreterBase::ptr packet)
00377 const
00378 {
00379 optional_range r (packet->nextPacketRange());
00380 if (!r)
00381 throw InvalidPacketChainException();
00382
00383 if (packet->next())
00384 packet->impl().truncateInterpreters(packet->next().get());
00385
00386 return senf::PacketInterpreter<PacketType>::create(&packet->impl(),r->begin(),r->end(),Append);
00387 }
00388
00389 template <class PacketType>
00390 const typename senf::PacketInterpreter<PacketType>::FactoryImpl
00391 senf::PacketInterpreter<PacketType>::factory_;
00392
00393
00394 #undef prefix_
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405