21 #ifndef INCLUDE_SF_REGISTRY_HPP 22 #define INCLUDE_SF_REGISTRY_HPP 30 #include <RCF/Export.hpp> 31 #include <RCF/ThreadLibrary.hpp> 33 #include <RCF/Tools.hpp> 37 typedef RCF::ReadWriteMutex ReadWriteMutex;
38 typedef RCF::ReadLock ReadLock;
39 typedef RCF::WriteLock WriteLock;
41 class I_SerializerPolymorphic;
42 class I_SerializerAny;
44 class RCF_EXPORT Registry : Noncopyable
49 typedef std::string Rtti;
50 typedef std::map<std::string, Rtti> TypenameToRtti;
51 typedef std::map<Rtti, std::string> RttiToTypename;
54 std::pair<Rtti, Rtti>,
55 std::shared_ptr<I_SerializerPolymorphic> >
56 RttiToSerializerPolymorphic;
60 std::shared_ptr<I_SerializerAny> >
63 TypenameToRtti mTypenameToRtti;
64 RttiToTypename mRttiToTypename;
65 RttiToSerializerPolymorphic mRttiToSerializerPolymorphic;
66 RttiToSerializerAny mRttiToSerializerAny;
67 ReadWriteMutex mReadWriteMutex;
71 friend void initRegistrySingleton();
73 static Registry &getSingleton();
75 static Registry *getSingletonPtr();
77 template<
typename Type>
78 void registerAny(Type *);
80 template<
typename Type>
81 void registerType(Type *,
const std::string &typeName);
83 template<
typename Base,
typename Derived>
84 void registerBaseAndDerived(Base *, Derived *);
86 template<
typename Base>
87 I_SerializerPolymorphic &getSerializerPolymorphic(
89 const std::string &derivedTypeName);
92 std::string getTypeName()
94 return getTypeName( (T *) 0);
97 template<
typename Type>
100 registerAny( (Type *) 0);
103 template<
typename Type>
104 void registerType(
const std::string &typeName)
106 registerType( (Type *) 0);
109 template<
typename Base,
typename Derived>
110 void registerBaseAndDerived()
112 registerBaseAndDerived( (Base *) 0, (Derived *) 0);
115 template<
typename Base>
116 I_SerializerPolymorphic &getSerializerPolymorphic(
117 const std::string &derivedTypeName)
119 return getSerializerPolymorphic( (Base *) 0, derivedTypeName);
122 I_SerializerAny * getAnySerializer(
const std::string &which);
124 bool isTypeRegistered(
const std::string &typeName);
126 bool isTypeRegistered(
const std::type_info &ti);
129 std::string getTypeName(T *)
131 return getTypeName(
typeid(T));
134 std::string getTypeName(
const std::type_info &ti);
140 template<
typename Type>
141 inline void registerAny(Type *)
143 Registry::getSingleton().registerAny( (Type *) 0);
146 template<
typename Type>
147 inline void registerType(Type *,
const std::string &typeName)
149 Registry::getSingleton().registerType( (Type *) 0, typeName);
152 template<
typename Base,
typename Derived>
153 inline void registerBaseAndDerived( Base *, Derived *)
155 Registry::getSingleton().registerBaseAndDerived(
162 #include <SF/SerializePolymorphic.hpp> 172 void registerType(
const std::string &typeName)
174 Registry::getSingleton().registerType( (T *) 0, typeName);
180 template<
typename Base,
typename Derived>
181 void registerBaseAndDerived()
183 Registry::getSingleton().registerBaseAndDerived(
191 template<
typename Type>
192 void Registry::registerAny(Type *)
194 WriteLock lock(mReadWriteMutex);
195 RCF_UNUSED_VARIABLE(lock);
196 Rtti typeRtti =
typeid(Type).name();
198 if ( mRttiToTypename.find(typeRtti) == mRttiToTypename.end() )
204 mRttiToSerializerAny[typeRtti].reset(
new SerializerAny<Type>());
207 template<
typename Type>
208 void Registry::registerType(Type *,
const std::string &typeName)
210 WriteLock lock(mReadWriteMutex);
211 RCF_UNUSED_VARIABLE(lock);
212 Rtti typeRtti =
typeid(Type).name();
213 mRttiToTypename[typeRtti] = typeName;
214 mTypenameToRtti[typeName] = typeRtti;
225 template<
typename Base,
typename Derived>
226 void Registry::registerBaseAndDerived(Base *, Derived *)
228 WriteLock lock(mReadWriteMutex);
229 RCF_UNUSED_VARIABLE(lock);
230 Rtti baseRtti =
typeid(Base).name();
231 Rtti derivedRtti =
typeid(Derived).name();
232 std::pair<Rtti, Rtti> baseDerivedRtti(baseRtti, derivedRtti);
234 mRttiToSerializerPolymorphic[baseDerivedRtti].reset(
235 new SerializerPolymorphic<Base,Derived>);
238 template<
typename Base>
239 I_SerializerPolymorphic &Registry::getSerializerPolymorphic(
241 const std::string &derivedTypeName)
243 ReadLock lock(mReadWriteMutex);
244 RCF_UNUSED_VARIABLE(lock);
245 Rtti baseRtti =
typeid(Base).name();
246 Rtti derivedRtti = mTypenameToRtti[derivedTypeName];
247 std::pair<Rtti, Rtti> baseDerivedRtti(baseRtti, derivedRtti);
249 mRttiToSerializerPolymorphic.find(baseDerivedRtti)
250 == mRttiToSerializerPolymorphic.end())
258 return *mRttiToSerializerPolymorphic[ baseDerivedRtti ];
263 #endif // ! INCLUDE_SF_REGISTRY_HPP
Base class for all RCF exceptions.
Definition: Exception.hpp:64
Definition: ByteBuffer.hpp:189