diff d2/qtd/MOC.d @ 364:a084e2df3776

Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
author Max Samukha <maxter@maxter.com>
date Fri, 11 Jun 2010 12:16:09 +0300
parents a3f5c10414f3
children 958e8b9a89bd
line wrap: on
line diff
--- a/d2/qtd/MOC.d	Thu Jun 10 00:57:32 2010 +0300
+++ b/d2/qtd/MOC.d	Fri Jun 11 12:16:09 2010 +0300
@@ -490,10 +490,12 @@
 
 mixin template Q_OBJECT()
 {
-    import std.typetuple;
-    import qtd.Marshal;
-    import std.stdio;
-    import qt.core.QString; // for QStringUtil.toNative
+    import
+        std.typetuple,
+        qtd.meta.Runtime,
+        qtd.Marshal,
+        qt.core.QString,
+        std.stdio;
 
 public: // required to override the outside scope protection.
 
@@ -530,43 +532,24 @@
     @property
     override QMetaObject metaObject() const { return staticMetaObject(); }
 
-    private static
-    {
-        __gshared QMetaObject staticMetaObject_;
-        __gshared QMetaObjectNative nativeStaticMetaObject_;
-        bool staticMoInited_;
-    }
-
     @property
     static QMetaObject staticMetaObject()
     {
-        // using a thread-local flag to mitigate
-        // the performance hit caused by lazy initialization
-        if(!staticMoInited_)
-        {
-            synchronized(qtdMoLock)
-            {
-                if (!staticMetaObject_)
-                {
-                    alias BaseClassesTuple!(This)[0] Base;
-
-                    nativeStaticMetaObject_ = QMetaObjectNative(
-                        Base.staticMetaObject.nativeId,
-                        qt_meta_stringdata.ptr,
-                        qt_meta_data.ptr, null);
-
-                    QMetaObject.create!This(&nativeStaticMetaObject_);
-                }
-            }
-            staticMoInited_ = true;
-        }
-
-        return staticMetaObject_;
+        return meta!This;
     }
 
-    /*internal*/ static void setStaticMetaObject(QMetaObject m)
+    @property static void* qtd_nativeMetaObject()
     {
-        staticMetaObject_ = m;
+        __gshared static QMetaObjectNative nativeMo;
+        if (!nativeMo.data)
+        {
+            alias BaseClassesTuple!(This)[0] Base;
+            nativeMo = QMetaObjectNative(
+                Base.staticMetaObject.nativeId,
+                qt_meta_stringdata.ptr,
+                qt_meta_data.ptr, null);
+        }
+        return &nativeMo;
     }
 }