diff 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
line wrap: on
line diff
--- a/include/qtd_core.h	Tue May 25 20:14:04 2010 +0300
+++ b/include/qtd_core.h	Wed Jun 02 19:38:05 2010 +0300
@@ -1,6 +1,6 @@
 /**
- *  Copyright: Copyright QtD Team, 2008-2010
- *  License: Boost Software License 1.0
+    Copyright: Copyright QtD Team, 2008-2010
+    License: Boost License 1.0
  */
 
 #ifndef QTD_CORE_H
@@ -8,28 +8,84 @@
 
 #include <QAbstractItemModel>
 
-#if defined WIN32
-  #define DLL_PUBLIC __declspec(dllexport)
+#define QTD_EXTERN extern "C"
+
+#ifdef WIN32
+
+    #define QTD_DLL_EXPORT __declspec(dllexport)
+    #define QTD_DLL_IMPORT __declspec(dllimport)
+
+    #ifdef CPP_SHARED
+
+        QTD_EXTERN typedef void (*pfunc_abstr)();
+
+        #define QTD_EXPORT_DECL(MODULE, TYPE, NAME, ARGS) \
+            QTD_EXTERN typedef TYPE (*qtd_##NAME##_t)ARGS; \
+            QTD_EXTERN { extern QTD_##MODULE##_DLL_PUBLIC qtd_##NAME##_t qtd_##NAME; }
+
+        #define QTD_EXPORT(MODULE, NAME) \
+            QTD_EXTERN { QTD_##MODULE##_DLL_PUBLIC qtd_##NAME##_t qtd_##NAME; } \
+            QTD_EXTERN QTD_DLL_EXPORT void qtd_set_##NAME(pfunc_abstr func) { qtd_##NAME = (qtd_##NAME##_t)func; }
+
+    #endif
+
 #else
-  #define DLL_PUBLIC
+
+    #define QTD_DLL_EXPORT
+    #define QTD_DLL_IMPORT
+
+    #define QTD_EXPORT_DECL(MODULE, TYPE, NAME, ARGS) \
+        QTD_EXTERN TYPE qtd_##NAME ARGS;
+
+    #define QTD_EXPORT(MODULE, NAME)
+
 #endif
 
-#ifdef CPP_SHARED
-  #define QTD_EXPORT(TYPE, NAME, ARGS) \
-    extern "C" typedef TYPE (*pf_##NAME)ARGS; \
-    extern "C" pf_##NAME qtd_get_##NAME();
-  #define QTD_EXPORT_VAR(NAME) \
-    pf_##NAME m_##NAME;        \
-    extern "C" DLL_PUBLIC pf_##NAME qtd_get_##NAME() { return m_##NAME; }
-#define QTD_EXPORT_VAR_SET(NAME, VALUE) \
-    m_##NAME = (pf_##NAME) VALUE
+#define QTD_DLL_PUBLIC QTD_DLL_EXPORT
+
+#ifdef QTD_CORE
+    #define QTD_CORE_DLL_PUBLIC QTD_DLL_EXPORT
 #else
-  #define QTD_EXPORT(TYPE, NAME, ARGS) \
-    extern "C" TYPE NAME ARGS;
+    #define QTD_CORE_DLL_PUBLIC QTD_DLL_IMPORT
+#endif
+
+#ifdef QTD_GUI
+    #define QTD_GUI_DLL_PUBLIC QTD_DLL_EXPORT
+#else
+    #define QTD_GUI_DLL_PUBLIC QTD_DLL_IMPORT
+#endif
+
+#ifdef QTD_OPENGL
+    #define QTD_OPENGL_DLL_PUBLIC QTD_DLL_EXPORT
+#else
+    #define QTD_OPENGL_DLL_PUBLIC QTD_DLL_IMPORT
 #endif
 
-extern uint userDataId;
+#ifdef QTD_NETWORK
+    #define QTD_NETWORK_DLL_PUBLIC QTD_DLL_EXPORT
+#else
+    #define QTD_NETWORK_DLL_PUBLIC QTD_DLL_IMPORT
+#endif
+
+#ifdef QTD_SVG
+    #define QTD_SVG_DLL_PUBLIC QTD_DLL_EXPORT
+#else
+    #define QTD_SVG_DLL_PUBLIC QTD_DLL_IMPORT
+#endif
 
+#ifdef QTD_XML
+    #define QTD_XML_DLL_PUBLIC QTD_DLL_EXPORT
+#else
+    #define QTD_XML_DLL_PUBLIC QTD_DLL_IMPORT
+#endif
+
+#ifdef QTD_WEBKIT
+    #define QTD_WEBKIT_DLL_PUBLIC QTD_DLL_EXPORT
+#else
+    #define QTD_WEBKIT_DLL_PUBLIC QTD_DLL_IMPORT
+#endif
+
+//TODO: ditch
 struct QModelIndexAccessor {
 	int row;
 	int col;
@@ -50,10 +106,10 @@
     //gcManaged                 = 0x04
 };
 
-class DLL_PUBLIC QtdObjectLink
+class QTD_CORE_DLL_PUBLIC QtdObjectLink
 {
 public:
-    void* dId; // TODO: needs to be atomic
+    void* dId;
 
     QtdObjectLink(void* id) : dId(id) {}
 
@@ -71,7 +127,7 @@
     }
 };
 
-class DLL_PUBLIC QObjectLink : public QtdObjectLink, public QObjectUserData
+class QTD_CORE_DLL_PUBLIC QObjectLink : public QtdObjectLink, public QObjectUserData
 {
 public:
     enum Flags
@@ -81,6 +137,7 @@
     };
 
     Flags flags;
+    static uint userDataId;
 
     QObjectLink(QObject* qObject, void* dId);
     bool createdByD();
@@ -92,24 +149,15 @@
 
 #define Array DArray
 
-#ifdef CPP_SHARED
-typedef void (*pfunc_abstr)();
-#endif
-
-QTD_EXPORT(void, qtd_toUtf8, (const unsigned short* arr, uint size, void* str))
-QTD_EXPORT(void, qtd_QtdObject_delete, (void* dId))
+QTD_EXPORT_DECL(CORE, void, toUtf8, (const unsigned short* arr, uint size, void* str))
+QTD_EXPORT_DECL(CORE, void, QtdObject_delete, (void* dId))
 
-#ifdef CPP_SHARED
-#define qtd_toUtf8 qtd_get_qtd_toUtf8()
-#define qtd_QtdObject_delete qtd_get_qtd_QtdObject_delete()
-#endif
+QTD_EXTERN QModelIndex qtd_to_QModelIndex(QModelIndexAccessor mia);
+QTD_EXTERN QModelIndexAccessor qtd_from_QModelIndex(const QModelIndex &index);
 
-extern "C" QModelIndex qtd_to_QModelIndex(QModelIndexAccessor mia);
-extern "C" QModelIndexAccessor qtd_from_QModelIndex(const QModelIndex &index);
-
-extern "C" typedef void (*EmitCallback)(void*, void**);
-extern "C" typedef int (*QtMetacallCallback)(void *d_entity, QMetaObject::Call _c, int _id, void **_a);
-extern "C" typedef const QMetaObject* (*MetaObjectCallback)(void *d_entity);
+QTD_EXTERN typedef void (*EmitCallback)(void*, void**);
+QTD_EXTERN typedef int (*QtMetacallCallback)(void *d_entity, QMetaObject::Call _c, int _id, void **_a);
+QTD_EXTERN typedef const QMetaObject* (*MetaObjectCallback)(void *d_entity);
 
 template <class T>
 void call_destructor(T *a)