comparison 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
comparison
equal deleted inserted replaced
363:3b0545d4d479 364:a084e2df3776
488 return gen.output; 488 return gen.output;
489 } 489 }
490 490
491 mixin template Q_OBJECT() 491 mixin template Q_OBJECT()
492 { 492 {
493 import std.typetuple; 493 import
494 import qtd.Marshal; 494 std.typetuple,
495 import std.stdio; 495 qtd.meta.Runtime,
496 import qt.core.QString; // for QStringUtil.toNative 496 qtd.Marshal,
497 qt.core.QString,
498 std.stdio;
497 499
498 public: // required to override the outside scope protection. 500 public: // required to override the outside scope protection.
499 501
500 alias typeof(this) This; 502 alias typeof(this) This;
501 503
528 } 530 }
529 531
530 @property 532 @property
531 override QMetaObject metaObject() const { return staticMetaObject(); } 533 override QMetaObject metaObject() const { return staticMetaObject(); }
532 534
533 private static
534 {
535 __gshared QMetaObject staticMetaObject_;
536 __gshared QMetaObjectNative nativeStaticMetaObject_;
537 bool staticMoInited_;
538 }
539
540 @property 535 @property
541 static QMetaObject staticMetaObject() 536 static QMetaObject staticMetaObject()
542 { 537 {
543 // using a thread-local flag to mitigate 538 return meta!This;
544 // the performance hit caused by lazy initialization 539 }
545 if(!staticMoInited_) 540
541 @property static void* qtd_nativeMetaObject()
542 {
543 __gshared static QMetaObjectNative nativeMo;
544 if (!nativeMo.data)
546 { 545 {
547 synchronized(qtdMoLock) 546 alias BaseClassesTuple!(This)[0] Base;
548 { 547 nativeMo = QMetaObjectNative(
549 if (!staticMetaObject_) 548 Base.staticMetaObject.nativeId,
550 { 549 qt_meta_stringdata.ptr,
551 alias BaseClassesTuple!(This)[0] Base; 550 qt_meta_data.ptr, null);
552 551 }
553 nativeStaticMetaObject_ = QMetaObjectNative( 552 return &nativeMo;
554 Base.staticMetaObject.nativeId, 553 }
555 qt_meta_stringdata.ptr, 554 }
556 qt_meta_data.ptr, null); 555
557
558 QMetaObject.create!This(&nativeStaticMetaObject_);
559 }
560 }
561 staticMoInited_ = true;
562 }
563
564 return staticMetaObject_;
565 }
566
567 /*internal*/ static void setStaticMetaObject(QMetaObject m)
568 {
569 staticMetaObject_ = m;
570 }
571 }
572