47 #ifndef _MIRA_POLYMORPHICPOINTERREFLECTOR_H_ 48 #define _MIRA_POLYMORPHICPOINTERREFLECTOR_H_ 60 namespace serialization {
68 template <
typename Derived>
69 struct PolymorphicPointerReflectorBase
71 virtual ~PolymorphicPointerReflectorBase() {}
78 virtual void invoke(Derived& serializer,
void* pointer) = 0;
94 template <
typename T,
typename Derived>
95 struct PolymorphicPointerReflector :
96 public PolymorphicPointerReflectorBase<Derived>
98 virtual void invoke(Derived& reflector,
void* pointer)
101 reflector.invokePointerObject(*serialization::void_downcast<T>(pointer));
117 template <
typename Derived>
118 class PolymorphicPointerReflectorRegistrar :
119 public LazySingleton<PolymorphicPointerReflectorRegistrar<Derived> >
124 typedef PolymorphicPointerReflectorBase<Derived>* ReflectorPtr;
128 ~PolymorphicPointerReflectorRegistrar() {
130 if(mReflectors.size()>0) {
143 foreach(
typename ReflectorMap::value_type& v, mReflectors)
144 delete (
char*)v.second;
155 template<
typename Class>
158 int typeId = Class::CLASS().getTypeId();
159 if(mReflectors.count(
typeId)!=0)
163 mReflectors.insert(std::make_pair(
typeId,
164 new PolymorphicPointerReflector<Class, Derived>) );
171 template<
typename Class>
172 void unregisterClass()
174 int typeId = Class::CLASS().getTypeId();
176 auto it = mReflectors.find(
typeId);
177 if(it==mReflectors.end())
185 mReflectors.erase(it);
189 ReflectorPtr getPolymorphicPointerReflector(
int typeId)
191 typename ReflectorMap::iterator i = mReflectors.find(
typeId);
192 if(mReflectors.find(
typeId)==mReflectors.end())
193 return ReflectorPtr();
200 typedef std::map<int, ReflectorPtr > ReflectorMap;
203 ReflectorMap mReflectors;
TypeId typeId()
Generates unique IDs for different types.
Definition: TypeId.h:94
Macro for iterating over all elements in a container.
Provides safe casts for casting from a pointer to void* and vice versa while taking care of polymorph...
specialize cv::DataType for our ImgPixel and inherit from cv::DataType<Vec>
Definition: IOService.h:67