00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #include "PacketRegistry.ih"
00027
00028
00029
00030 #define prefix_ inline
00031
00032
00033
00034
00035
00036 template <class Tag>
00037 template <class PacketType>
00038 prefix_ senf::PacketRegistry<Tag>::ScopedRegistrationProxy<PacketType>::
00039 ScopedRegistrationProxy(typename Tag::key_t key, int priority)
00040 {
00041 PacketRegistry<Tag>::template registerPacket<PacketType>(key,priority);
00042 }
00043
00044 template <class Tag>
00045 template <class PacketType>
00046 prefix_ senf::PacketRegistry<Tag>::ScopedRegistrationProxy<PacketType>::~ScopedRegistrationProxy()
00047 {
00048 try {
00049 PacketRegistry<Tag>::template unregisterPacket<PacketType>();
00050 }
00051 catch (PacketTypeNotRegisteredException & ex)
00052 {}
00053 }
00054
00055
00056
00057
00058 template <class Tag>
00059 template <class PacketType>
00060 prefix_ void senf::PacketRegistry<Tag>::registerPacket(typename Tag::key_t key, int priority)
00061 {
00062 registry().registerPacket<PacketType>(key, priority);
00063 }
00064
00065 template <class Tag>
00066 template <class PacketType>
00067 prefix_ void senf::PacketRegistry<Tag>::unregisterPacket()
00068 {
00069 if (alive())
00070 registry().unregisterPacket<PacketType>();
00071 }
00072
00073 template <class Tag>
00074 prefix_ void senf::PacketRegistry<Tag>::unregisterPacket(typename Tag::key_t key, int priority)
00075 {
00076 if (alive())
00077 registry().unregisterPacket(key, priority);
00078 }
00079
00080 template <class Tag>
00081 template <class PacketType>
00082 prefix_ typename Tag::key_t senf::PacketRegistry<Tag>::key()
00083 {
00084 return registry().key(senf::typeIdValue<PacketType>());
00085 }
00086
00087 template <class Tag>
00088 template <class PacketType>
00089 prefix_ typename boost::optional<typename Tag::key_t> senf::PacketRegistry<Tag>::key(NoThrow_t)
00090 {
00091 return registry().key(senf::typeIdValue<PacketType>(),true);
00092 }
00093
00094 template <class Tag>
00095 prefix_ typename Tag::key_t senf::PacketRegistry<Tag>::key(Packet const & packet)
00096 {
00097 return registry().key(packet.typeId());
00098 }
00099
00100 template <class Tag>
00101 prefix_ typename boost::optional<typename Tag::key_t>
00102 senf::PacketRegistry<Tag>::key(Packet const & packet, NoThrow_t)
00103 {
00104 return registry().key(packet.typeId(),true);
00105 }
00106
00107 template <class Tag>
00108 prefix_ typename senf::PacketRegistry<Tag>::Entry const &
00109 senf::PacketRegistry<Tag>::lookup(typename Tag::key_t key)
00110 {
00111 return registry().lookup(key);
00112 }
00113
00114 template <class Tag>
00115 prefix_ typename senf::PacketRegistry<Tag>::Entry const *
00116 senf::PacketRegistry<Tag>::lookup(typename Tag::key_t key, NoThrow_t)
00117 {
00118 return registry().lookup(key,true);
00119 }
00120
00121 template <class Tag>
00122 prefix_ typename senf::PacketRegistry<Tag>::iterator senf::PacketRegistry<Tag>::begin()
00123 {
00124 return registry().begin();
00125 }
00126
00127 template <class Tag>
00128 prefix_ typename senf::PacketRegistry<Tag>::iterator senf::PacketRegistry<Tag>::end()
00129 {
00130 return registry().end();
00131 }
00132
00133 template <class Tag>
00134 prefix_ senf::PacketRegistry<Tag>::PacketRegistry()
00135 : registry_ (prettyName(typeid(Tag)))
00136 {}
00137
00138 template <class Tag>
00139 prefix_ typename senf::PacketRegistry<Tag>::Registry &
00140 senf::PacketRegistry<Tag>::registry()
00141 {
00142 return instance().registry_;
00143 }
00144
00145
00146
00147
00148 template <class KeyType>
00149 prefix_ senf::detail::PacketRegistryImpl<KeyType>::PacketRegistryImpl(std::string const & name)
00150 {
00151 registries()[name] = this;
00152 }
00153
00154 template <class KeyType>
00155 prefix_ typename senf::detail::PacketRegistryImpl<KeyType>::iterator
00156 senf::detail::PacketRegistryImpl<KeyType>::begin()
00157 const
00158 {
00159 return registry_.begin();
00160 }
00161
00162 template <class KeyType>
00163 prefix_ typename senf::detail::PacketRegistryImpl<KeyType>::iterator
00164 senf::detail::PacketRegistryImpl<KeyType>::end()
00165 const
00166 {
00167 return registry_.end();
00168 }
00169
00170
00171 #undef prefix_
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182