comparison include/qtd_core.h @ 357:9784459f0750

An attempt (failed due to optlink) to improve locality of declarations exported from QtD executables Q_CLASSINFO implementation Now Qtd can be built on Windows
author Max Samukha <maxter@spambox.com>
date Wed, 02 Jun 2010 19:38:05 +0300
parents 08c1ca7975ab
children beaf4a2974d7
comparison
equal deleted inserted replaced
356:12cec2d14e1c 357:9784459f0750
1 /** 1 /**
2 * Copyright: Copyright QtD Team, 2008-2010 2 Copyright: Copyright QtD Team, 2008-2010
3 * License: Boost Software License 1.0 3 License: Boost License 1.0
4 */ 4 */
5 5
6 #ifndef QTD_CORE_H 6 #ifndef QTD_CORE_H
7 #define QTD_CORE_H 7 #define QTD_CORE_H
8 8
9 #include <QAbstractItemModel> 9 #include <QAbstractItemModel>
10 10
11 #if defined WIN32 11 #define QTD_EXTERN extern "C"
12 #define DLL_PUBLIC __declspec(dllexport) 12
13 #ifdef WIN32
14
15 #define QTD_DLL_EXPORT __declspec(dllexport)
16 #define QTD_DLL_IMPORT __declspec(dllimport)
17
18 #ifdef CPP_SHARED
19
20 QTD_EXTERN typedef void (*pfunc_abstr)();
21
22 #define QTD_EXPORT_DECL(MODULE, TYPE, NAME, ARGS) \
23 QTD_EXTERN typedef TYPE (*qtd_##NAME##_t)ARGS; \
24 QTD_EXTERN { extern QTD_##MODULE##_DLL_PUBLIC qtd_##NAME##_t qtd_##NAME; }
25
26 #define QTD_EXPORT(MODULE, NAME) \
27 QTD_EXTERN { QTD_##MODULE##_DLL_PUBLIC qtd_##NAME##_t qtd_##NAME; } \
28 QTD_EXTERN QTD_DLL_EXPORT void qtd_set_##NAME(pfunc_abstr func) { qtd_##NAME = (qtd_##NAME##_t)func; }
29
30 #endif
31
13 #else 32 #else
14 #define DLL_PUBLIC 33
34 #define QTD_DLL_EXPORT
35 #define QTD_DLL_IMPORT
36
37 #define QTD_EXPORT_DECL(MODULE, TYPE, NAME, ARGS) \
38 QTD_EXTERN TYPE qtd_##NAME ARGS;
39
40 #define QTD_EXPORT(MODULE, NAME)
41
15 #endif 42 #endif
16 43
17 #ifdef CPP_SHARED 44 #define QTD_DLL_PUBLIC QTD_DLL_EXPORT
18 #define QTD_EXPORT(TYPE, NAME, ARGS) \ 45
19 extern "C" typedef TYPE (*pf_##NAME)ARGS; \ 46 #ifdef QTD_CORE
20 extern "C" pf_##NAME qtd_get_##NAME(); 47 #define QTD_CORE_DLL_PUBLIC QTD_DLL_EXPORT
21 #define QTD_EXPORT_VAR(NAME) \
22 pf_##NAME m_##NAME; \
23 extern "C" DLL_PUBLIC pf_##NAME qtd_get_##NAME() { return m_##NAME; }
24 #define QTD_EXPORT_VAR_SET(NAME, VALUE) \
25 m_##NAME = (pf_##NAME) VALUE
26 #else 48 #else
27 #define QTD_EXPORT(TYPE, NAME, ARGS) \ 49 #define QTD_CORE_DLL_PUBLIC QTD_DLL_IMPORT
28 extern "C" TYPE NAME ARGS;
29 #endif 50 #endif
30 51
31 extern uint userDataId; 52 #ifdef QTD_GUI
53 #define QTD_GUI_DLL_PUBLIC QTD_DLL_EXPORT
54 #else
55 #define QTD_GUI_DLL_PUBLIC QTD_DLL_IMPORT
56 #endif
32 57
58 #ifdef QTD_OPENGL
59 #define QTD_OPENGL_DLL_PUBLIC QTD_DLL_EXPORT
60 #else
61 #define QTD_OPENGL_DLL_PUBLIC QTD_DLL_IMPORT
62 #endif
63
64 #ifdef QTD_NETWORK
65 #define QTD_NETWORK_DLL_PUBLIC QTD_DLL_EXPORT
66 #else
67 #define QTD_NETWORK_DLL_PUBLIC QTD_DLL_IMPORT
68 #endif
69
70 #ifdef QTD_SVG
71 #define QTD_SVG_DLL_PUBLIC QTD_DLL_EXPORT
72 #else
73 #define QTD_SVG_DLL_PUBLIC QTD_DLL_IMPORT
74 #endif
75
76 #ifdef QTD_XML
77 #define QTD_XML_DLL_PUBLIC QTD_DLL_EXPORT
78 #else
79 #define QTD_XML_DLL_PUBLIC QTD_DLL_IMPORT
80 #endif
81
82 #ifdef QTD_WEBKIT
83 #define QTD_WEBKIT_DLL_PUBLIC QTD_DLL_EXPORT
84 #else
85 #define QTD_WEBKIT_DLL_PUBLIC QTD_DLL_IMPORT
86 #endif
87
88 //TODO: ditch
33 struct QModelIndexAccessor { 89 struct QModelIndexAccessor {
34 int row; 90 int row;
35 int col; 91 int col;
36 void *ptr; 92 void *ptr;
37 QAbstractItemModel *model; 93 QAbstractItemModel *model;
48 qNativeOwnership = 0x01, 104 qNativeOwnership = 0x01,
49 qDOwnership = 0x02 105 qDOwnership = 0x02
50 //gcManaged = 0x04 106 //gcManaged = 0x04
51 }; 107 };
52 108
53 class DLL_PUBLIC QtdObjectLink 109 class QTD_CORE_DLL_PUBLIC QtdObjectLink
54 { 110 {
55 public: 111 public:
56 void* dId; // TODO: needs to be atomic 112 void* dId;
57 113
58 QtdObjectLink(void* id) : dId(id) {} 114 QtdObjectLink(void* id) : dId(id) {}
59 115
60 template<typename T> 116 template<typename T>
61 static QtdObjectLink* getLink(const T* object) 117 static QtdObjectLink* getLink(const T* object)
69 QtdObjectLink *link = getLink((T*)object); 125 QtdObjectLink *link = getLink((T*)object);
70 return link ? link->dId : NULL; 126 return link ? link->dId : NULL;
71 } 127 }
72 }; 128 };
73 129
74 class DLL_PUBLIC QObjectLink : public QtdObjectLink, public QObjectUserData 130 class QTD_CORE_DLL_PUBLIC QObjectLink : public QtdObjectLink, public QObjectUserData
75 { 131 {
76 public: 132 public:
77 enum Flags 133 enum Flags
78 { 134 {
79 None, 135 None,
80 CreatedByD = 0x1 136 CreatedByD = 0x1
81 }; 137 };
82 138
83 Flags flags; 139 Flags flags;
140 static uint userDataId;
84 141
85 QObjectLink(QObject* qObject, void* dId); 142 QObjectLink(QObject* qObject, void* dId);
86 bool createdByD(); 143 bool createdByD();
87 virtual ~QObjectLink(); 144 virtual ~QObjectLink();
88 void destroyLink(QObject* qObject = NULL); 145 void destroyLink(QObject* qObject = NULL);
90 static void* getDId(const QObject* qObject); 147 static void* getDId(const QObject* qObject);
91 }; 148 };
92 149
93 #define Array DArray 150 #define Array DArray
94 151
95 #ifdef CPP_SHARED 152 QTD_EXPORT_DECL(CORE, void, toUtf8, (const unsigned short* arr, uint size, void* str))
96 typedef void (*pfunc_abstr)(); 153 QTD_EXPORT_DECL(CORE, void, QtdObject_delete, (void* dId))
97 #endif
98 154
99 QTD_EXPORT(void, qtd_toUtf8, (const unsigned short* arr, uint size, void* str)) 155 QTD_EXTERN QModelIndex qtd_to_QModelIndex(QModelIndexAccessor mia);
100 QTD_EXPORT(void, qtd_QtdObject_delete, (void* dId)) 156 QTD_EXTERN QModelIndexAccessor qtd_from_QModelIndex(const QModelIndex &index);
101 157
102 #ifdef CPP_SHARED 158 QTD_EXTERN typedef void (*EmitCallback)(void*, void**);
103 #define qtd_toUtf8 qtd_get_qtd_toUtf8() 159 QTD_EXTERN typedef int (*QtMetacallCallback)(void *d_entity, QMetaObject::Call _c, int _id, void **_a);
104 #define qtd_QtdObject_delete qtd_get_qtd_QtdObject_delete() 160 QTD_EXTERN typedef const QMetaObject* (*MetaObjectCallback)(void *d_entity);
105 #endif
106
107 extern "C" QModelIndex qtd_to_QModelIndex(QModelIndexAccessor mia);
108 extern "C" QModelIndexAccessor qtd_from_QModelIndex(const QModelIndex &index);
109
110 extern "C" typedef void (*EmitCallback)(void*, void**);
111 extern "C" typedef int (*QtMetacallCallback)(void *d_entity, QMetaObject::Call _c, int _id, void **_a);
112 extern "C" typedef const QMetaObject* (*MetaObjectCallback)(void *d_entity);
113 161
114 template <class T> 162 template <class T>
115 void call_destructor(T *a) 163 void call_destructor(T *a)
116 { 164 {
117 a->~T(); 165 a->~T();