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 <senf/Utils/Exception.hh>
00030
00031 #define prefix_ inline
00032
00033
00034
00035
00036
00037
00038
00039 template <class PacketType>
00040 prefix_ senf::Packet::Packet(ConcretePacket<PacketType> const & packet)
00041 : packet_(packet.ptr())
00042 {}
00043
00044
00045
00046 template <class OtherPacket>
00047 prefix_ OtherPacket senf::Packet::parseNextAs()
00048 const
00049 {
00050 return OtherPacket(ptr()->parseNextAs<typename OtherPacket::type>());
00051 }
00052
00053 template <class OtherPacket>
00054 prefix_ bool senf::Packet::is()
00055 const
00056 {
00057 return valid() && ptr()->is<typename OtherPacket::type>();
00058 }
00059
00060 template <class OtherPacket>
00061 prefix_ OtherPacket senf::Packet::as()
00062 const
00063 {
00064 if (!is<OtherPacket>())
00065 throw WrapException<std::bad_cast>(std::bad_cast())
00066 << ": called packet::as() with wrong PacketType: "
00067 << (valid() ? typeId().prettyName() : "invalid packet")
00068 << " != " << prettyName(typeid(OtherPacket));
00069 return OtherPacket(ptr()->as<typename OtherPacket::type>());
00070 }
00071
00072 template <class OtherPacket>
00073 prefix_ OtherPacket senf::Packet::as(NoThrow_t)
00074 const
00075 {
00076 SENF_ASSERT( is<OtherPacket>(), "Bad cast, called packet::as(nothrow) with wrong PacketType");
00077 return OtherPacket(ptr()->as<typename OtherPacket::type>());
00078 }
00079
00080 template <class OtherPacket>
00081 prefix_ OtherPacket senf::Packet::next()
00082 const
00083 {
00084 return next().as<OtherPacket>();
00085 }
00086
00087 template <class OtherPacket>
00088 prefix_ OtherPacket senf::Packet::next(NoThrow_t)
00089 const
00090 {
00091 Packet p (next(nothrow));
00092 return p && p.is<OtherPacket>() ?
00093 OtherPacket(p.ptr()->as<typename OtherPacket::type>()) : OtherPacket();
00094 }
00095
00096 template <class OtherPacket>
00097 prefix_ OtherPacket senf::Packet::find()
00098 const
00099 {
00100 OtherPacket p (find<OtherPacket>(nothrow));
00101 if (!p) throw InvalidPacketChainException();
00102 return p;
00103 }
00104
00105 template <class OtherPacket>
00106 prefix_ OtherPacket senf::Packet::prev()
00107 const
00108 {
00109 return prev().as<OtherPacket>();
00110 }
00111
00112 template <class OtherPacket>
00113 prefix_ OtherPacket senf::Packet::prev(NoThrow_t)
00114 const
00115 {
00116 Packet p (prev(nothrow));
00117 return p && p.is<OtherPacket>() ?
00118 OtherPacket(p.ptr()->as<typename OtherPacket::type>()) : OtherPacket();
00119 }
00120
00121 template <class OtherPacket>
00122 prefix_ OtherPacket senf::Packet::rfind()
00123 const
00124 {
00125 OtherPacket p (rfind<OtherPacket>(nothrow));
00126 if (!p) throw InvalidPacketChainException();
00127 return p;
00128 }
00129
00130 template <class OtherPacket>
00131 prefix_ OtherPacket senf::Packet::last()
00132 const
00133 {
00134 return last().as<OtherPacket>();
00135 }
00136
00137 template <class OtherPacket>
00138 prefix_ OtherPacket senf::Packet::first()
00139 const
00140 {
00141 return first().as<OtherPacket>();
00142 }
00143
00144 template <class Other>
00145 prefix_ void senf::Packet::finalizeTo()
00146 {
00147 Packet p (find<Other>(nothrow));
00148 ptr()->finalizeTo(p ? p.ptr() : last().ptr());
00149 }
00150
00151 template <class Annotation>
00152 prefix_ Annotation & senf::Packet::annotation()
00153 {
00154 return ptr()->annotation<Annotation>();
00155 }
00156
00157 template <class Annotation>
00158 prefix_ Annotation const & senf::Packet::annotation()
00159 const
00160 {
00161 return ptr()->annotation<Annotation>();
00162 }
00163
00164
00165
00166
00167
00168
00169 template <class PacketType>
00170 prefix_ senf::ConcretePacket<PacketType>::ConcretePacket()
00171 {}
00172
00173 template <class PacketType>
00174 prefix_ typename senf::ConcretePacket<PacketType>::factory_t
00175 senf::ConcretePacket<PacketType>::factory()
00176 {
00177 return interpreter::factory();
00178 }
00179
00180
00181
00182 template <class PacketType>
00183 prefix_ senf::ConcretePacket<PacketType>
00184 senf::ConcretePacket<PacketType>::create()
00185 {
00186 return ConcretePacket(interpreter::create());
00187 }
00188
00189 template <class PacketType>
00190 prefix_ senf::ConcretePacket<PacketType>
00191 senf::ConcretePacket<PacketType>::create(senf::NoInit_t)
00192 {
00193 return ConcretePacket(interpreter::create(senf::noinit));
00194 }
00195
00196 template <class PacketType>
00197 prefix_ senf::ConcretePacket<PacketType>
00198 senf::ConcretePacket<PacketType>::create(size_type size)
00199 {
00200 return ConcretePacket(interpreter::create(size));
00201 }
00202
00203 template <class PacketType>
00204 prefix_ senf::ConcretePacket<PacketType>
00205 senf::ConcretePacket<PacketType>::create(size_type size, senf::NoInit_t)
00206 {
00207 return ConcretePacket(interpreter::create(size,senf::noinit));
00208 }
00209
00210 #ifndef DOXYGEN
00211
00212 template <class PacketType>
00213 template <class ForwardReadableRange>
00214 prefix_ senf::ConcretePacket<PacketType> senf::ConcretePacket<PacketType>::
00215 create(ForwardReadableRange const & range,
00216 typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type *)
00217 {
00218 return ConcretePacket(interpreter::create(range));
00219 }
00220
00221 #endif
00222
00223
00224
00225 template <class PacketType>
00226 prefix_ senf::ConcretePacket<PacketType>
00227 senf::ConcretePacket<PacketType>::createAfter(Packet const & packet)
00228 {
00229 return ConcretePacket(interpreter::createAfter(packet.ptr()));
00230 }
00231
00232 template <class PacketType>
00233 prefix_ senf::ConcretePacket<PacketType>
00234 senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, senf::NoInit_t)
00235 {
00236 return ConcretePacket(interpreter::createAfter(packet.ptr(),senf::noinit));
00237 }
00238
00239 template <class PacketType>
00240 prefix_ senf::ConcretePacket<PacketType>
00241 senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, size_type size)
00242 {
00243 return ConcretePacket(interpreter::createAfter(packet.ptr(), size));
00244 }
00245
00246 template <class PacketType>
00247 prefix_ senf::ConcretePacket<PacketType>
00248 senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, size_type size,
00249 senf::NoInit_t)
00250 {
00251 return ConcretePacket(interpreter::createAfter(packet.ptr(), size, senf::noinit));
00252 }
00253
00254 #ifndef DOXYGEN
00255
00256 template <class PacketType>
00257 template <class ForwardReadableRange>
00258 prefix_ senf::ConcretePacket<PacketType> senf::ConcretePacket<PacketType>::
00259 createAfter(Packet const & packet, ForwardReadableRange const & range,
00260 typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type *)
00261 {
00262 return ConcretePacket(interpreter::createAfter(packet.ptr(), range));
00263 }
00264
00265 #endif
00266
00267
00268
00269 template <class PacketType>
00270 prefix_ senf::ConcretePacket<PacketType>
00271 senf::ConcretePacket<PacketType>::createBefore(Packet const & packet)
00272 {
00273 return ConcretePacket(interpreter::createBefore(packet.ptr()));
00274 }
00275
00276 template <class PacketType>
00277 prefix_ senf::ConcretePacket<PacketType>
00278 senf::ConcretePacket<PacketType>::createBefore(Packet const & packet, senf::NoInit_t)
00279 {
00280 return ConcretePacket(interpreter::createBefore(packet.ptr(), senf::noinit));
00281 }
00282
00283 template <class PacketType>
00284 prefix_ senf::ConcretePacket<PacketType>
00285 senf::ConcretePacket<PacketType>::createInsertBefore(Packet const & packet)
00286 {
00287 return ConcretePacket(interpreter::createInsertBefore(packet.ptr()));
00288 }
00289
00290 template <class PacketType>
00291 prefix_ senf::ConcretePacket<PacketType>
00292 senf::ConcretePacket<PacketType>::createInsertBefore(Packet const & packet, senf::NoInit_t)
00293 {
00294 return ConcretePacket(interpreter::createInsertBefore(packet.ptr(), senf::noinit));
00295 }
00296
00297
00298
00299 template <class PacketType>
00300 prefix_ senf::ConcretePacket<PacketType>
00301 senf::ConcretePacket<PacketType>::clone()
00302 const
00303 {
00304 return ConcretePacket(ptr()->clone());
00305 }
00306
00307
00308
00309 template <class PacketType>
00310 prefix_ typename senf::ConcretePacket<PacketType>::Parser
00311 senf::ConcretePacket<PacketType>::parser()
00312 const
00313 {
00314 return ptr()->fields();
00315 }
00316
00317 template <class PacketType>
00318 prefix_ typename senf::ConcretePacket<PacketType>::ParserProxy
00319 senf::ConcretePacket<PacketType>::operator->()
00320 const
00321 {
00322 return ParserProxy(parser());
00323 }
00324
00325
00326
00327 template <class PacketType>
00328 prefix_ senf::ConcretePacket<PacketType>::ConcretePacket(typename interpreter::ptr const & packet_)
00329 : Packet(packet_)
00330 {}
00331
00332 template <class PacketType>
00333 prefix_ typename senf::ConcretePacket<PacketType>::interpreter * senf::ConcretePacket<PacketType>::ptr()
00334 const
00335 {
00336 return static_cast< PacketInterpreter<PacketType> *>( Packet::ptr().get());
00337 }
00338
00339
00340 #undef prefix_
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351