24 #include "parametersettable.h"
26 #include <QStringList>
36 class ParameterSettableCreator;
100 template <
class NewClass>
101 void registerClass(QString className, QString parentClassName);
120 QStringList getAllSubclasses(QString className,
int levelToStop = -1,
bool noAbstractClasses =
false);
129 bool isAbstract(QString className);
138 void cleanupMapsForReRegistration(QString className);
146 template <
class T,
class U>
155 static Type1 Test(U);
156 static Type2 Test(...);
159 enum { exists =
sizeof(Test(MakeT())) ==
sizeof(Type1) };
168 template<
bool canBeCreated,
class H>
169 class RegisterClassHelper {
171 RegisterClassHelper(
Factory* factory, QString className, QString parentClassName);
200 QMap<QString, ParameterSettableCreator*> m_classMap;
205 QMap<QString, QString> m_parentsMap;
210 QMap<QString, QStringList> m_childrenMap;
222 #include "configurationparameters.h"
223 #include "realfactory.h"
228 namespace __Factory_internal {
240 static char check_sig(U (*)[1]);
242 static short check_sig(...);
243 static const bool isAbstract = (
sizeof(check_sig<T>(0))!=
sizeof(char));
245 static const bool canBeCreated = (
sizeof(check_sig<T>(0))==
sizeof(char));
250 class Factory::RegisterClassHelper<true, H> {
252 RegisterClassHelper(
Factory* factory, QString className, QString parentClassName) {
253 factory->cleanupMapsForReRegistration(className);
255 factory->m_parentsMap[className] = parentClassName;
256 factory->m_childrenMap[parentClassName].append( className );
257 H::describe( className );
262 class Factory::RegisterClassHelper<false, H> {
264 RegisterClassHelper(
Factory* factory, QString className, QString parentClassName) {
265 factory->cleanupMapsForReRegistration(className);
266 factory->m_parentsMap[className] = parentClassName;
267 factory->m_childrenMap[parentClassName].append( className );
271 template <
class NewClass>
274 RegisterClassHelper<__Factory_internal::checkClass<NewClass>::canBeCreated, NewClass> registerHelper(
this, className, parentClassName );