comparison d2/qt/QGlobal.d @ 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 12cec2d14e1c
children 12f60887ed15
comparison
equal deleted inserted replaced
356:12cec2d14e1c 357:9784459f0750
1 module qt.QGlobal; 1 module qt.QGlobal;
2 2
3 public import qtd.String;
4 public import qt.QDefines; 3 public import qt.QDefines;
5 4
6 version (Tango) 5 import
7 { 6 std.stdio,
8 import tango.io.Stdout; 7 std.c.stdlib,
9 void writeln(string s) 8 core.memory;
10 { 9
11 Stdout(s).newline; 10 public import // TODO: import privately
12 } 11 qtd.String,
13 package import tango.stdc.stdlib, 12 qtd.Core;
14 tango.core.Memory; 13
15 }
16 else
17 {
18 import std.stdio;
19 package import std.c.stdlib,
20 core.memory;
21 }
22
23 T static_cast(T, U)(U obj)
24 {
25 return cast(T)cast(void*)obj;
26 }
27
28 template QT_BEGIN_NAMESPACE() {
29 }
30
31 template QT_END_NAMESPACE() {
32 }
33
34 template QT_BEGIN_HEADER() {
35 }
36
37 template QT_END_HEADER() {
38 }
39
40 mixin QT_BEGIN_HEADER;
41 mixin QT_BEGIN_NAMESPACE;
42
43 // Defined in qtd.QtdObject
44 extern(C) void qtd_QtdObject_delete(void* dPtr);
45
46 version(cpp_shared)
47 {
48 extern (C) void qtd_core_initCallBacks(void* toUtf8, void* del_d_obj);
49 static this() {
50 qtd_core_initCallBacks(&qtd_toUtf8, &qtd_QtdObject_delete);
51 }
52 }
53 14
54 string tr(string arg) { 15 string tr(string arg) {
55 return arg; 16 return arg;
56 } 17 }
57 18
60 */ 21 */
61 bool QT_VERSION_CHECK( ushort major, ushort minor, ushort patch ) 22 bool QT_VERSION_CHECK( ushort major, ushort minor, ushort patch )
62 { 23 {
63 return cast(bool)((major<<16)|(minor<<8)|(patch)); 24 return cast(bool)((major<<16)|(minor<<8)|(patch));
64 } 25 }
65 //TODO(katrina) get this from the C++ side 26
66 const char[] QT_PACKAGEDATE_STR = "2008-09-27"; 27 const char[] QT_PACKAGEDATE_STR = "2008-09-27";
67 //TODO(katrina) get this from the C++ side
68 const char[] QT_PACKAGE_TAG = "gc9953de622c6a0f655322e0d9f5bd6dc2803b470"; 28 const char[] QT_PACKAGE_TAG = "gc9953de622c6a0f655322e0d9f5bd6dc2803b470";
69 29
70 /* 30 /*
71 Size-dependent types (architechture-dependent byte order) 31 Size-dependent types (architechture-dependent byte order)
72 32
91 { 51 {
92 alias quint64 quintptr; 52 alias quint64 quintptr;
93 alias qint64 qptrdiff; 53 alias qint64 qptrdiff;
94 } 54 }
95 55
96 const byte QT_POINTER_SIZE = 8; 56 enum byte QT_POINTER_SIZE = 8;
97 57
98 alias int QNoImplicitBoolCast; 58 alias int QNoImplicitBoolCast;
99 59
100 alias double qreal; 60 alias double qreal;
101 61
464 void qFree(void * ptr); 424 void qFree(void * ptr);
465 void * qRealloc(void * ptr, size_t size); 425 void * qRealloc(void * ptr, size_t size);
466 void * qMemCopy(void * dest, void * src, size_t n); 426 void * qMemCopy(void * dest, void * src, size_t n);
467 void * qMemSet(void * dest, int c, size_t n); 427 void * qMemSet(void * dest, int c, size_t n);
468 428
469 struct QFlags(Enum)
470 {
471 private:
472 alias void **Zero;
473 int i;
474
475 public:
476 alias Enum enum_type;
477
478 public static QFlags!(Enum) opCall(Enum)(QFlags f) {
479 QFlags!(Enum) res;
480 res.i = f.i;
481 return res;
482 }
483
484 public static QFlags opCall(Enum)(Enum f) {
485 QFlags!(Enum) res;
486 res.i = f;
487 return res;
488 }
489
490 public static QFlags opCall(Enum)(int f) {
491 QFlags!(Enum) res;
492 res.i = cast(Enum) f;
493 return res;
494 }
495
496 // this(Zero = 0) : i(0) {}
497 // this(QFlag f) : i(f) {}
498
499 // QFlags!(Enum) opAssign(QFlags f) { i = f.i; return *this; }
500 QFlags!(Enum) opAssign(int f) { i = f; return *this; }
501 QFlags!(Enum) opAndAssign(int mask) { i &= mask; return *this; }
502 QFlags!(Enum) opAndAssign(uint mask) { i &= mask; return *this; }
503 QFlags!(Enum) opOrAssign(QFlags f) { i |= f.i; return *this; }
504 QFlags!(Enum) opOrAssign(Enum f) { i |= f; return *this; }
505 QFlags!(Enum) opXorAssign(QFlags f) { i ^= f.i; return *this; }
506 QFlags!(Enum) opXorAssign(Enum f) { i ^= f; return *this; }
507
508 int toInt() { return i; }
509
510 QFlags!(Enum) opOr(QFlags f) { QFlags g; g.i = i | f.i; return g; }
511 QFlags!(Enum) opOr(Enum f) { QFlags g; g.i = i | f; return g; }
512 QFlags!(Enum) opXor(QFlags f) { QFlags g; g.i = i ^ f.i; return g; }
513 QFlags!(Enum) opXor(Enum f) { QFlags g; g.i = i ^ f; return g; }
514 QFlags!(Enum) opAnd(int mask) { QFlags g; g.i = i & mask; return g; }
515 QFlags!(Enum) opAnd(uint mask) { QFlags g; g.i = i & mask; return g; }
516 QFlags!(Enum) opAnd(Enum f) { QFlags g; g.i = i & f; return g; }
517 QFlags!(Enum) opCom() { QFlags g; g.i = ~i; return g; }
518
519 // bool operator!() { return !i; }
520
521 // bool testFlag(Enum f) { return i & f; }
522 }
523
524 /* TODO typesafety 429 /* TODO typesafety
525 #define Q_DECLARE_FLAGS(Flags, Enum)\ 430 #define Q_DECLARE_FLAGS(Flags, Enum)\
526 typedef QFlags<Enum> Flags; 431 typedef QFlags<Enum> Flags;
527 #define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags) \ 432 #define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags) \
528 QFlags<Flags::enum_type> operator|(Flags::enum_type f1, Flags::enum_type f2) \ 433 QFlags<Flags::enum_type> operator|(Flags::enum_type f1, Flags::enum_type f2) \
551 456
552 /* 457 /*
553 This gives us the possibility to check which modules the user can 458 This gives us the possibility to check which modules the user can
554 use. These are purely compile time checks and will generate no code. 459 use. These are purely compile time checks and will generate no code.
555 */ 460 */
556 461 enum : ushort
557 /* Qt modules */ 462 {
558 463 /* Qt modules */
559 const ushort QT_MODULE_CORE = 0x0001; 464
560 const ushort QT_MODULE_GUI = 0x0002; 465 QT_MODULE_CORE = 0x0001,
561 const ushort QT_MODULE_NETWORK = 0x0004; 466 QT_MODULE_GUI = 0x0002,
562 const ushort QT_MODULE_OPENGL = 0x0008; 467 QT_MODULE_NETWORK = 0x0004,
563 const ushort QT_MODULE_SQL = 0x0010; 468 QT_MODULE_OPENGL = 0x0008,
564 const ushort QT_MODULE_XML = 0x0020; 469 QT_MODULE_SQL = 0x0010,
565 const ushort QT_MODULE_QT3SUPPORTLIGHT = 0x0040; 470 QT_MODULE_XML = 0x0020,
566 const ushort QT_MODULE_QT3SUPPORT = 0x0080; 471 QT_MODULE_QT3SUPPORTLIGHT = 0x0040,
567 const ushort QT_MODULE_SVG = 0x0100; 472 QT_MODULE_QT3SUPPORT = 0x0080,
568 const ushort QT_MODULE_ACTIVEQT = 0x0200; 473 QT_MODULE_SVG = 0x0100,
569 const ushort QT_MODULE_GRAPHICSVIEW = 0x0400; 474 QT_MODULE_ACTIVEQT = 0x0200,
570 const ushort QT_MODULE_SCRIPT = 0x0800; 475 QT_MODULE_GRAPHICSVIEW = 0x0400,
571 const ushort QT_MODULE_XMLPATTERNS = 0x1000; 476 QT_MODULE_SCRIPT = 0x0800,
572 const ushort QT_MODULE_HELP = 0x2000; 477 QT_MODULE_XMLPATTERNS = 0x1000,
573 const ushort QT_MODULE_TEST = 0x4000; 478 QT_MODULE_HELP = 0x2000,
574 const ushort QT_MODULE_DBUS = 0x8000; 479 QT_MODULE_TEST = 0x4000,
480 QT_MODULE_DBUS = 0x8000,
575 481
576 /* Qt editions */ 482 /* Qt editions */
577 483
578 const ushort QT_EDITION_CONSOLE = (QT_MODULE_CORE 484 QT_EDITION_CONSOLE = (QT_MODULE_CORE
579 | QT_MODULE_NETWORK 485 | QT_MODULE_NETWORK
580 | QT_MODULE_SQL 486 | QT_MODULE_SQL
581 | QT_MODULE_SCRIPT 487 | QT_MODULE_SCRIPT
582 | QT_MODULE_XML 488 | QT_MODULE_XML
583 | QT_MODULE_XMLPATTERNS 489 | QT_MODULE_XMLPATTERNS
584 | QT_MODULE_TEST 490 | QT_MODULE_TEST
585 | QT_MODULE_DBUS); 491 | QT_MODULE_DBUS),
586 const ushort QT_EDITION_DESKTOPLIGHT = (QT_MODULE_CORE 492 QT_EDITION_DESKTOPLIGHT = (QT_MODULE_CORE
587 | QT_MODULE_GUI 493 | QT_MODULE_GUI
588 | QT_MODULE_QT3SUPPORTLIGHT 494 | QT_MODULE_QT3SUPPORTLIGHT
589 | QT_MODULE_TEST 495 | QT_MODULE_TEST
590 | QT_MODULE_DBUS); 496 | QT_MODULE_DBUS),
591 const ushort QT_EDITION_OPENSOURCE = (QT_MODULE_CORE 497 QT_EDITION_OPENSOURCE = (QT_MODULE_CORE
592 | QT_MODULE_GUI 498 | QT_MODULE_GUI
593 | QT_MODULE_NETWORK 499 | QT_MODULE_NETWORK
594 | QT_MODULE_OPENGL 500 | QT_MODULE_OPENGL
595 | QT_MODULE_SQL 501 | QT_MODULE_SQL
596 | QT_MODULE_XML 502 | QT_MODULE_XML
600 | QT_MODULE_QT3SUPPORT 506 | QT_MODULE_QT3SUPPORT
601 | QT_MODULE_SVG 507 | QT_MODULE_SVG
602 | QT_MODULE_GRAPHICSVIEW 508 | QT_MODULE_GRAPHICSVIEW
603 | QT_MODULE_HELP 509 | QT_MODULE_HELP
604 | QT_MODULE_TEST 510 | QT_MODULE_TEST
605 | QT_MODULE_DBUS); 511 | QT_MODULE_DBUS),
606 const ushort QT_EDITION_DESKTOP = (QT_EDITION_OPENSOURCE 512 QT_EDITION_DESKTOP = (QT_EDITION_OPENSOURCE
607 | QT_MODULE_ACTIVEQT); 513 | QT_MODULE_ACTIVEQT),
608 const ushort QT_EDITION_UNIVERSAL = QT_EDITION_DESKTOP; 514 QT_EDITION_UNIVERSAL = QT_EDITION_DESKTOP,
609 const ushort QT_EDITION_ACADEMIC = QT_EDITION_DESKTOP; 515 QT_EDITION_ACADEMIC = QT_EDITION_DESKTOP,
610 const ushort QT_EDITION_EDUCATIONAL = QT_EDITION_DESKTOP; 516 QT_EDITION_EDUCATIONAL = QT_EDITION_DESKTOP,
611 const ushort QT_EDITION_EVALUATION = QT_EDITION_DESKTOP; 517 QT_EDITION_EVALUATION = QT_EDITION_DESKTOP
612 518 }
613 mixin QT_END_NAMESPACE; 519
520 /+
614 521
615 private 522 private
616 struct Align 523 struct Align
617 { 524 {
618 ubyte a; 525 ubyte a;
630 else 537 else
631 const AlignPad = ((base+PTR_ALIGN-1)/PTR_ALIGN)*PTR_ALIGN 538 const AlignPad = ((base+PTR_ALIGN-1)/PTR_ALIGN)*PTR_ALIGN
632 + aligned; 539 + aligned;
633 } 540 }
634 541
635 template InstanceSize(T)
636 {
637 static if( is( T == Object ) )
638 const InstanceSize = 2*(void*).sizeof;
639 else
640 const InstanceSize = Max!(
641 AlignPad!(
642 InstanceSize!(Super!(T)),
643 InterfaceCount!(T)*(void*).sizeof),
644
645 AlignPad!(
646 InstanceSizeImpl!(T, 0),
647 + InterfaceCount!(T)*(void*).sizeof));
648 }
649
650 private
651 template Super(T)
652 {
653 static if( is( T S == super ) )
654 alias First!(S) Super;
655 else
656 static assert(false, "Can't get super of "~T.mangleof);
657 }
658
659 private
660 template First(T)
661 {
662 alias T First;
663 }
664
665 private
666 template First(T, Ts...)
667 {
668 alias T First;
669 }
670
671 private
672 template InstanceSizeImpl(T, size_t i)
673 {
674 static if( i < T.tupleof.length )
675 const InstanceSizeImpl = Max!(
676 T.tupleof[i].offsetof + T.tupleof[i].sizeof,
677 InstanceSizeImpl!(T, i+1));
678 else
679 // This is necessary to account for classes without member
680 // variables.
681 const InstanceSizeImpl = 2*(void*).sizeof;
682 }
683
684 private 542 private
685 template Max(size_t a, size_t b) 543 template Max(size_t a, size_t b)
686 { 544 {
687 static if( a > b ) 545 static if( a > b )
688 const Max = a; 546 const Max = a;
689 else 547 else
690 const Max = b; 548 const Max = b;
691 } 549 }
692
693 private
694 template InterfaceCount(T)
695 {
696 static if( is( T == Object ) )
697 const InterfaceCount = 0u;
698 else static if( is( T S == super ) )
699 const InterfaceCount = InterfaceCountImpl!(S);
700 }
701
702 private
703 template InterfaceCountImpl(TBase, TInterfaces...)
704 {
705 const InterfaceCountImpl = TInterfaces.length;
706 }
707
708 /+
709 scope class StackObject(C)
710 {
711 byte[InstanceSize!(C)] data;
712 bool constructed;
713
714 C opCall(A...)(A args)
715 {
716 assert(!constructed);
717
718 auto r = new(&data)C(args);
719 r.__stackAllocated = true;
720 constructed = true;
721
722 return r;
723 }
724
725 ~this()
726 {
727 if (constructed)
728 {
729 auto obj = cast(C)&data;
730 delete obj;
731 }
732 }
733 }
734 +/ 550 +/
735 551
736 alias void DArray; 552 alias void DArray;
737
738 mixin QT_END_HEADER;
739