370ab52 by Jos van den Oever at 2009-09-14 1
#ifndef INTROSPECTION_H
2
#define INTROSPECTION_H
3
127a508 by Jos van den Oever at 2009-11-05 4
// define TREEINTROSPECTION to let objects have a pointer to their parents
5
#define TREEINTROSPECTION
6
370ab52 by Jos van den Oever at 2009-09-14 7
#include <QtCore/QVariant>
56bd8e4 by Jos van den Oever at 2009-11-04 8
#include <QtCore/QVector>
7ab8751 by Jos van den Oever at 2010-01-12 9
#include <stdint.h>
370ab52 by Jos van den Oever at 2009-09-14 10
11
class Introspectable;
12
5c794b7 by Jos van den Oever at 2009-09-18 13
Q_DECLARE_METATYPE(QVector<quint16>);
14
Q_DECLARE_METATYPE(QVector<quint32>);
15
370ab52 by Jos van den Oever at 2009-09-14 16
class Introspection {
17
public:
18
    const QString name;
19
    const int numberOfMembers;
20
    const QString* const names;
21
    int (* const * const numberOfInstances)(const Introspectable*);
22
    QVariant (* const * const value)(const Introspectable*, int position);
23
    const Introspectable* (* const * const introspectable)(const Introspectable*, int position);
24
25
    Introspection(const QString& n,
26
            const int nOM,
27
            const QString* const ns,
28
            int (* const * const mC)(const Introspectable*),
29
            QVariant (* const * const vG)(const Introspectable*, int),
30
            const Introspectable* (* const * const i)(const Introspectable*, int))
31
        :name(n), numberOfMembers(nOM), names(ns),
32
         numberOfInstances(mC), value(vG), introspectable(i) {}
33
34
    // convenience
35
    static int zero(const Introspectable*) { return 0; }
36
    static int one(const Introspectable*) { return 1; }
37
    static const Introspectable* null(const Introspectable*, int) { return NULL; } 
38
    static QVariant nullValue(const Introspectable*, int) { return QVariant(); }
39
};
40
41
class Introspectable {
42
public:
124a9d4 by Jos van den Oever at 2010-01-12 43
    uint32_t streamOffset;
127a508 by Jos van den Oever at 2009-11-05 44
#ifdef TREEINTROSPECTION
45
    Introspectable const * parent; // one more 'const' would be nice ...
46
124a9d4 by Jos van den Oever at 2010-01-12 47
    Introspectable(const Introspectable* p)
48
            :streamOffset(999999), parent(p) {}
127a508 by Jos van den Oever at 2009-11-05 49
#else
124a9d4 by Jos van den Oever at 2010-01-12 50
    Introspectable(const Introspectable* = 0)
51
            :streamOffset(999999) {
52
    }
127a508 by Jos van den Oever at 2009-11-05 53
#endif
54
370ab52 by Jos van den Oever at 2009-09-14 55
    virtual ~Introspectable() {}
56
    virtual const Introspection* getIntrospection() const = 0;
57
};
58
59
60
#endif