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 <boost/utility.hpp>
00030 #include "PacketRegistry.hh"
00031
00032 #define prefix_ inline
00033
00034
00035
00036
00037
00038 template <class PacketType>
00039 prefix_ senf::PacketTypeBase::factory_t senf::PacketTypeBase::factory()
00040 {
00041 return PacketInterpreter<PacketType>::factory();
00042 }
00043
00044
00045
00046
00047 template <class Self, class Registry>
00048 prefix_ senf::PacketInterpreterBase::optional_range
00049 senf::PacketTypeMixin<Self,Registry>::nextPacketRange(ConcretePacket<Self> const & p)
00050 {
00051
00052 return PacketTypeMixin<Self>::nextPacketRange(p);
00053 }
00054
00055 template <class Self, class Registry>
00056 prefix_ senf::PacketInterpreterBase::factory_t
00057 senf::PacketTypeMixin<Self,Registry>::nextPacketType(ConcretePacket<Self> const & p)
00058 {
00059 if (p.data().size() < Self::initSize())
00060 return Self::no_factory();
00061 return lookup( Self::nextPacketKey(p) );
00062 }
00063
00064 template <class Self, class Registry>
00065 prefix_ senf::PacketInterpreterBase::size_type senf::PacketTypeMixin<Self,Registry>::initSize()
00066 {
00067 return senf::init_bytes< typename Self::parser >::value;
00068 }
00069
00070 template <class Self, class Registry>
00071 prefix_ void senf::PacketTypeMixin<Self,Registry>::init(ConcretePacket<Self> const & p)
00072 {
00073 p->init();
00074 }
00075
00076 template <class Self, class Registry>
00077 prefix_ typename senf::PacketTypeMixin<Self,Registry>::optional_key_t
00078 senf::PacketTypeMixin<Self,Registry>::key(Packet const & p)
00079 {
00080 return p ? PacketRegistry<Registry>::key(p, nothrow) : optional_key_t();
00081 }
00082
00083 template <class Self, class Registry>
00084 prefix_ senf::PacketTypeBase::factory_t senf::PacketTypeMixin<Self,Registry>::lookup(key_t key)
00085 {
00086 typename PacketRegistry<Registry>::Entry const * entry (
00087 PacketRegistry<Registry>::lookup( key, senf::nothrow ));
00088 return entry ? entry->factory() : PacketTypeBase::no_factory();
00089 }
00090
00091
00092
00093
00094 template <class Self>
00095 prefix_ senf::PacketInterpreterBase::size_type senf::PacketTypeMixin<Self,void>::initSize()
00096 {
00097 return senf::init_bytes< typename Self::parser >::value;
00098 }
00099
00100 template <class Self>
00101 prefix_ void senf::PacketTypeMixin<Self,void>::init(ConcretePacket<Self> const & p)
00102 {
00103 p->init();
00104 }
00105
00106
00107 #undef prefix_
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118