34#ifndef DATAQUAY_OBJECT_BUILDER_H
35#define DATAQUAY_OBJECT_BUILDER_H
86 m_builders[T::staticMetaObject.className()] =
new Builder0<T>();
104 template <
typename T,
typename Parent>
106 m_builders[T::staticMetaObject.className()] =
new Builder1<T, Parent>();
126 template <
typename T>
128 QString className = T::staticMetaObject.className();
129 m_cpmap[className] = pointerName;
130 m_pcmap[pointerName] = className;
131 m_builders[className] =
new Builder0<T>();
132 registerExtractor<T>(pointerName);
154 template <
typename T,
typename Parent>
156 QString className = T::staticMetaObject.className();
157 m_cpmap[className] = pointerName;
158 m_pcmap[pointerName] = className;
159 m_builders[className] =
new Builder1<T, Parent>();
160 registerExtractor<T>(pointerName);
178 template <
typename T>
180 QString className = T::staticMetaObject.className();
181 m_cpmap[className] = pointerName;
182 m_pcmap[pointerName] = className;
183 registerExtractor<T>(pointerName);
191 return m_builders.contains(className);
199 QObject *
build(QString className, QObject *parent) {
200 if (!
knows(className))
return 0;
201 return m_builders[className]->build(parent);
209 if (!
knows(className))
return 0;
210 return m_builders[className]->build(0);
220 return m_extractors.contains(pointerName);
230 return m_extractors.contains(pointerName);
239 QObject *
extract(QString pointerName, QVariant &v) {
241 return m_extractors[pointerName]->extract(v);
250 QVariant
inject(QString pointerName, QObject *p) {
251 if (!
canInject(pointerName))
return QVariant();
252 return m_extractors[pointerName]->inject(p);
261 if (m_pcmap.contains(pointerName))
return m_pcmap[pointerName];
272 if (m_cpmap.contains(className))
return m_cpmap[className];
281 for (BuilderMap::iterator i = m_builders.begin();
282 i != m_builders.end(); ++i) {
285 for (ExtractorMap::iterator i = m_extractors.begin();
286 i != m_extractors.end(); ++i) {
291 template <
typename T>
293 registerExtractor(QString pointerName) {
294 m_extractors[pointerName] =
new Extractor<T *>();
297 template <
typename T>
299 registerExtractor(QString pointerName, QString ) {
300 m_extractors[pointerName] =
new Extractor<T *>();
304 virtual ~BuilderBase() { }
305 virtual QObject *build(QObject *) = 0;
308 template <
typename T>
struct Builder0 :
public BuilderBase {
309 virtual QObject *build(QObject *) {
314 template <
typename T,
typename Parent>
struct Builder1 :
public BuilderBase {
315 virtual QObject *build(QObject *p) {
316 return new T(qobject_cast<Parent *>(p));
320 typedef QHash<QString, BuilderBase *> BuilderMap;
321 BuilderMap m_builders;
323 struct ExtractorBase {
324 virtual ~ExtractorBase() { }
325 virtual QObject *extract(
const QVariant &v) = 0;
326 virtual QVariant inject(QObject *) = 0;
329 template <
typename Po
inter>
struct Extractor :
public ExtractorBase {
330 virtual QObject *extract(
const QVariant &v) {
331 return v.value<Pointer>();
333 virtual QVariant inject(QObject *o) {
334 Pointer p = qobject_cast<Pointer>(o);
335 if (p)
return QVariant::fromValue<Pointer>(p);
336 else return QVariant();
340 typedef QHash<QString, ExtractorBase *> ExtractorMap;
341 ExtractorMap m_extractors;
343 QHash<QString, QString> m_cpmap;
344 QHash<QString, QString> m_pcmap;
ObjectBuilder is a singleton object factory capable of constructing new objects of classes that are s...
void registerClass()
Register type T, a subclass of QObject, as a class that can be constructed by calling a zero-argument...
void registerClass(QString pointerName)
Register type T, a subclass of QObject, as a class that can be constructed by calling a single-argume...
void registerInterface(QString pointerName)
Register type T, a subclass of QObject, as an interface (a pure virtual class) and pointerName to be ...
bool canInject(QString pointerName)
Return true if the class whose pointer has meta-type name pointerName has been registered with that p...
QString getPointerNameForClassName(QString className) const
If the class whose class name (according to its meta object) is className has been registered using o...
QObject * build(QString className, QObject *parent)
Return a new object whose class name (according to its meta object) is className, with the given pare...
bool canExtract(QString pointerName)
Return true if the class whose pointer has meta-type name pointerName has been registered with that p...
static ObjectBuilder * getInstance()
Retrieve the single global instance of ObjectBuilder.
QString getClassNameForPointerName(QString pointerName) const
Provided the given pointerName has been registered using one of the registerClass(pointerName) method...
void registerClass(QString pointerName)
Register type T, a subclass of QObject, as a class that can be constructed by calling a zero-argument...
bool knows(QString className)
Return true if the class whose class name (according to its meta object) is className has been regist...
QObject * extract(QString pointerName, QVariant &v)
Provided the given pointerName has been registered using one of the registerClass(pointerName) method...
void registerClass()
Register type T, a subclass of QObject, as a class that can be constructed by calling a single-argume...
QVariant inject(QString pointerName, QObject *p)
Provided the given pointerName has been registered using one of the registerClass(pointerName) method...
QObject * build(QString className)
Return a new object whose class name (according to its meta object) is className, constructed with no...