Mercurial > projects > qtd
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 |