Remove the use of a template qUnused function for ICC
[qt:qt.git] / src / corelib / global / qglobal.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtCore module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QGLOBAL_H
43 #define QGLOBAL_H
44
45 #include <stddef.h>
46
47 #define QT_VERSION_STR   "4.8.6"
48 /*
49    QT_VERSION is (major << 16) + (minor << 8) + patch.
50 */
51 #define QT_VERSION 0x040806
52 /*
53    can be used like #if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0))
54 */
55 #define QT_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
56
57 #define QT_PACKAGEDATE_STR "YYYY-MM-DD"
58
59 #define QT_PACKAGE_TAG ""
60
61 #if !defined(QT_BUILD_MOC)
62 #include <QtCore/qconfig.h>
63 #endif
64
65 #ifdef __cplusplus
66
67 #ifndef QT_NO_STL
68 #include <algorithm>
69 #endif
70
71 #ifndef QT_NAMESPACE /* user namespace */
72
73 # define QT_PREPEND_NAMESPACE(name) ::name
74 # define QT_USE_NAMESPACE
75 # define QT_BEGIN_NAMESPACE
76 # define QT_END_NAMESPACE
77 # define QT_BEGIN_INCLUDE_NAMESPACE
78 # define QT_END_INCLUDE_NAMESPACE
79 # define QT_BEGIN_MOC_NAMESPACE
80 # define QT_END_MOC_NAMESPACE
81 # define QT_FORWARD_DECLARE_CLASS(name) class name;
82 # define QT_FORWARD_DECLARE_STRUCT(name) struct name;
83 # define QT_MANGLE_NAMESPACE(name) name
84
85 #else /* user namespace */
86
87 # define QT_PREPEND_NAMESPACE(name) ::QT_NAMESPACE::name
88 # define QT_USE_NAMESPACE using namespace ::QT_NAMESPACE;
89 # define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {
90 # define QT_END_NAMESPACE }
91 # define QT_BEGIN_INCLUDE_NAMESPACE }
92 # define QT_END_INCLUDE_NAMESPACE namespace QT_NAMESPACE {
93 # define QT_BEGIN_MOC_NAMESPACE QT_USE_NAMESPACE
94 # define QT_END_MOC_NAMESPACE
95 # define QT_FORWARD_DECLARE_CLASS(name) \
96     QT_BEGIN_NAMESPACE class name; QT_END_NAMESPACE \
97     using QT_PREPEND_NAMESPACE(name);
98
99 # define QT_FORWARD_DECLARE_STRUCT(name) \
100     QT_BEGIN_NAMESPACE struct name; QT_END_NAMESPACE \
101     using QT_PREPEND_NAMESPACE(name);
102
103 # define QT_MANGLE_NAMESPACE0(x) x
104 # define QT_MANGLE_NAMESPACE1(a, b) a##_##b
105 # define QT_MANGLE_NAMESPACE2(a, b) QT_MANGLE_NAMESPACE1(a,b)
106 # define QT_MANGLE_NAMESPACE(name) QT_MANGLE_NAMESPACE2( \
107         QT_MANGLE_NAMESPACE0(name), QT_MANGLE_NAMESPACE0(QT_NAMESPACE))
108
109 namespace QT_NAMESPACE {}
110
111 # ifndef QT_BOOTSTRAPPED
112 # ifndef QT_NO_USING_NAMESPACE
113    /*
114     This expands to a "using QT_NAMESPACE" also in _header files_.
115     It is the only way the feature can be used without too much
116     pain, but if people _really_ do not want it they can add
117     DEFINES += QT_NO_USING_NAMESPACE to their .pro files.
118     */
119    QT_USE_NAMESPACE
120 # endif
121 # endif
122
123 #endif /* user namespace */
124
125 #else /* __cplusplus */
126
127 # define QT_BEGIN_NAMESPACE
128 # define QT_END_NAMESPACE
129 # define QT_USE_NAMESPACE
130 # define QT_BEGIN_INCLUDE_NAMESPACE
131 # define QT_END_INCLUDE_NAMESPACE
132
133 #endif /* __cplusplus */
134
135 #if defined(Q_OS_MAC) && !defined(Q_CC_INTEL)
136 #define QT_BEGIN_HEADER extern "C++" {
137 #define QT_END_HEADER }
138 #define QT_BEGIN_INCLUDE_HEADER }
139 #define QT_END_INCLUDE_HEADER extern "C++" {
140 #else
141 #define QT_BEGIN_HEADER
142 #define QT_END_HEADER
143 #define QT_BEGIN_INCLUDE_HEADER
144 #define QT_END_INCLUDE_HEADER extern "C++"
145 #endif
146
147 /*
148    The operating system, must be one of: (Q_OS_x)
149
150      DARWIN   - Darwin OS (synonym for Q_OS_MAC)
151      SYMBIAN  - Symbian
152      MSDOS    - MS-DOS and Windows
153      OS2      - OS/2
154      OS2EMX   - XFree86 on OS/2 (not PM)
155      WIN32    - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
156      WINCE    - WinCE (Windows CE 5.0)
157      CYGWIN   - Cygwin
158      SOLARIS  - Sun Solaris
159      HPUX     - HP-UX
160      ULTRIX   - DEC Ultrix
161      LINUX    - Linux
162      FREEBSD  - FreeBSD
163      NETBSD   - NetBSD
164      OPENBSD  - OpenBSD
165      BSDI     - BSD/OS
166      IRIX     - SGI Irix
167      OSF      - HP Tru64 UNIX
168      SCO      - SCO OpenServer 5
169      UNIXWARE - UnixWare 7, Open UNIX 8
170      AIX      - AIX
171      HURD     - GNU Hurd
172      DGUX     - DG/UX
173      RELIANT  - Reliant UNIX
174      DYNIX    - DYNIX/ptx
175      QNX      - QNX
176      LYNX     - LynxOS
177      BSD4     - Any BSD 4.4 system
178      UNIX     - Any UNIX BSD/SYSV system
179 */
180
181 #if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
182 #  define Q_OS_DARWIN
183 #  define Q_OS_BSD4
184 #  ifdef __LP64__
185 #    define Q_OS_DARWIN64
186 #  else
187 #    define Q_OS_DARWIN32
188 #  endif
189 #elif defined(__SYMBIAN32__) || defined(SYMBIAN)
190 #  define Q_OS_SYMBIAN
191 #  define Q_NO_POSIX_SIGNALS
192 #  define QT_NO_GETIFADDRS
193 #elif defined(__CYGWIN__)
194 #  define Q_OS_CYGWIN
195 #elif defined(MSDOS) || defined(_MSDOS)
196 #  define Q_OS_MSDOS
197 #elif defined(__OS2__)
198 #  if defined(__EMX__)
199 #    define Q_OS_OS2EMX
200 #  else
201 #    define Q_OS_OS2
202 #  endif
203 #elif !defined(SAG_COM) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
204 #  define Q_OS_WIN32
205 #  define Q_OS_WIN64
206 #elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
207 #  if defined(WINCE) || defined(_WIN32_WCE)
208 #    define Q_OS_WINCE
209 #  else
210 #    define Q_OS_WIN32
211 #  endif
212 #elif defined(__MWERKS__) && defined(__INTEL__)
213 #  define Q_OS_WIN32
214 #elif defined(__sun) || defined(sun)
215 #  define Q_OS_SOLARIS
216 #elif defined(hpux) || defined(__hpux)
217 #  define Q_OS_HPUX
218 #elif defined(__ultrix) || defined(ultrix)
219 #  define Q_OS_ULTRIX
220 #elif defined(sinix)
221 #  define Q_OS_RELIANT
222 #elif defined(__native_client__)
223 #  define Q_OS_NACL
224 #elif defined(__linux__) || defined(__linux)
225 #  define Q_OS_LINUX
226 #elif defined(__FreeBSD__) || defined(__DragonFly__)
227 #  define Q_OS_FREEBSD
228 #  define Q_OS_BSD4
229 #elif defined(__NetBSD__)
230 #  define Q_OS_NETBSD
231 #  define Q_OS_BSD4
232 #elif defined(__OpenBSD__)
233 #  define Q_OS_OPENBSD
234 #  define Q_OS_BSD4
235 #elif defined(__bsdi__)
236 #  define Q_OS_BSDI
237 #  define Q_OS_BSD4
238 #elif defined(__sgi)
239 #  define Q_OS_IRIX
240 #elif defined(__osf__)
241 #  define Q_OS_OSF
242 #elif defined(_AIX)
243 #  define Q_OS_AIX
244 #elif defined(__Lynx__)
245 #  define Q_OS_LYNX
246 #elif defined(__GNU__)
247 #  define Q_OS_HURD
248 #elif defined(__DGUX__)
249 #  define Q_OS_DGUX
250 #elif defined(__QNXNTO__)
251 #  define Q_OS_QNX
252 #elif defined(_SEQUENT_)
253 #  define Q_OS_DYNIX
254 #elif defined(_SCO_DS) /* SCO OpenServer 5 + GCC */
255 #  define Q_OS_SCO
256 #elif defined(__USLC__) /* all SCO platforms + UDK or OUDK */
257 #  define Q_OS_UNIXWARE
258 #elif defined(__svr4__) && defined(i386) /* Open UNIX 8 + GCC */
259 #  define Q_OS_UNIXWARE
260 #elif defined(__INTEGRITY)
261 #  define Q_OS_INTEGRITY
262 #elif defined(VXWORKS) /* there is no "real" VxWorks define - this has to be set in the mkspec! */
263 #  define Q_OS_VXWORKS
264 #elif defined(__MAKEDEPEND__)
265 #else
266 #  error "Qt has not been ported to this OS - talk to qt-bugs@trolltech.com"
267 #endif
268
269 #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) || defined(Q_OS_WINCE)
270 #  define Q_OS_WIN
271 #endif
272
273 #if defined(Q_OS_DARWIN)
274 #  define Q_OS_MAC /* Q_OS_MAC is mostly for compatibility, but also more clear */
275 #  define Q_OS_MACX /* Q_OS_MACX is only for compatibility.*/
276 #  if defined(Q_OS_DARWIN64)
277 #     define Q_OS_MAC64
278 #  elif defined(Q_OS_DARWIN32)
279 #     define Q_OS_MAC32
280 #  endif
281 #endif
282
283 #ifdef QT_AUTODETECT_COCOA
284 #  ifdef Q_OS_MAC64
285 #    define QT_MAC_USE_COCOA 1
286 #    define QT_BUILD_KEY QT_BUILD_KEY_COCOA
287 #  else
288 #    define QT_BUILD_KEY QT_BUILD_KEY_CARBON
289 #  endif
290 #endif
291
292 #if defined(Q_WS_MAC64) && !defined(QT_MAC_USE_COCOA) && !defined(QT_BUILD_QMAKE) && !defined(QT_BOOTSTRAPPED)
293 #error "You are building a 64-bit application, but using a 32-bit version of Qt. Check your build configuration."
294 #endif
295
296 #if defined(Q_OS_MSDOS) || defined(Q_OS_OS2) || defined(Q_OS_WIN)
297 #  undef Q_OS_UNIX
298 #elif !defined(Q_OS_UNIX)
299 #  define Q_OS_UNIX
300 #endif
301
302 #if defined(Q_OS_DARWIN) && !defined(QT_LARGEFILE_SUPPORT)
303 #  define QT_LARGEFILE_SUPPORT 64
304 #endif
305
306 #ifdef Q_OS_DARWIN
307 #  include <AvailabilityMacros.h>
308 #
309 #  // Availability.h was introduced with the OS X 10.6 SDK
310 #  if (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1060) || \
311       (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)
312 #    include <Availability.h>
313 #  endif
314 #
315 #  ifdef Q_OS_MACX
316 #    if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED < 1040
317 #       undef __MAC_OS_X_VERSION_MIN_REQUIRED
318 #       define __MAC_OS_X_VERSION_MIN_REQUIRED 1040
319 #    endif
320 #    if !defined(MAC_OS_X_VERSION_MIN_REQUIRED) || MAC_OS_X_VERSION_MIN_REQUIRED < 1040
321 #       undef MAC_OS_X_VERSION_MIN_REQUIRED
322 #       define MAC_OS_X_VERSION_MIN_REQUIRED 1040
323 #    endif
324 #  endif
325 #
326 #  // Numerical checks are preferred to named checks, but to be safe
327 #  // we define the missing version names in case Qt uses them.
328 #
329 #  if !defined(__MAC_10_4)
330 #       define __MAC_10_4 1040
331 #  endif
332 #  if !defined(__MAC_10_5)
333 #       define __MAC_10_5 1050
334 #  endif
335 #  if !defined(__MAC_10_6)
336 #       define __MAC_10_6 1060
337 #  endif
338 #  if !defined(__MAC_10_7)
339 #       define __MAC_10_7 1070
340 #  endif
341 #  if !defined(__MAC_10_8)
342 #       define __MAC_10_8 1080
343 #  endif
344 #  if !defined(__MAC_10_9)
345 #       define __MAC_10_9 1090
346 #  endif
347 #  if !defined(__MAC_10_10)
348 #       define __MAC_10_10 101000
349 #  endif
350 #  if !defined(MAC_OS_X_VERSION_10_4)
351 #       define MAC_OS_X_VERSION_10_4 1040
352 #  endif
353 #  if !defined(MAC_OS_X_VERSION_10_5)
354 #       define MAC_OS_X_VERSION_10_5 1050
355 #  endif
356 #  if !defined(MAC_OS_X_VERSION_10_6)
357 #       define MAC_OS_X_VERSION_10_6 1060
358 #  endif
359 #  if !defined(MAC_OS_X_VERSION_10_7)
360 #       define MAC_OS_X_VERSION_10_7 1070
361 #  endif
362 #  if !defined(MAC_OS_X_VERSION_10_8)
363 #       define MAC_OS_X_VERSION_10_8 1080
364 #  endif
365 #  if !defined(MAC_OS_X_VERSION_10_9)
366 #       define MAC_OS_X_VERSION_10_9 1090
367 #  endif
368 #  if !defined(MAC_OS_X_VERSION_10_10)
369 #       define MAC_OS_X_VERSION_10_10 101000
370 #  endif
371 #endif
372
373 #ifdef __LSB_VERSION__
374 #  if __LSB_VERSION__ < 40
375 #    error "This version of the Linux Standard Base is unsupported"
376 #  endif
377 #ifndef QT_LINUXBASE
378 #  define QT_LINUXBASE
379 #endif
380 #endif
381
382 /*
383    The compiler, must be one of: (Q_CC_x)
384
385      SYM      - Digital Mars C/C++ (used to be Symantec C++)
386      MWERKS   - Metrowerks CodeWarrior
387      MSVC     - Microsoft Visual C/C++, Intel C++ for Windows
388      BOR      - Borland/Turbo C++
389      WAT      - Watcom C++
390      GNU      - GNU C++
391      COMEAU   - Comeau C++
392      EDG      - Edison Design Group C++
393      OC       - CenterLine C++
394      SUN      - Forte Developer, or Sun Studio C++
395      MIPS     - MIPSpro C++
396      DEC      - DEC C++
397      HPACC    - HP aC++
398      USLC     - SCO OUDK and UDK
399      CDS      - Reliant C++
400      KAI      - KAI C++
401      INTEL    - Intel C++ for Linux, Intel C++ for Windows
402      HIGHC    - MetaWare High C/C++
403      PGI      - Portland Group C++
404      GHS      - Green Hills Optimizing C++ Compilers
405      GCCE     - GCCE (Symbian GCCE builds)
406      RVCT     - ARM Realview Compiler Suite
407      NOKIAX86 - Nokia x86 (Symbian WINSCW builds)
408      CLANG    - C++ front-end for the LLVM compiler
409
410
411    Should be sorted most to least authoritative.
412 */
413
414 #if defined(__ghs)
415 # define Q_OUTOFLINE_TEMPLATE inline
416
417 /* the following are necessary because the GHS C++ name mangling relies on __*/
418 # define Q_CONSTRUCTOR_FUNCTION0(AFUNC) \
419    static const int AFUNC ## _init_variable_ = AFUNC();
420 # define Q_CONSTRUCTOR_FUNCTION(AFUNC) Q_CONSTRUCTOR_FUNCTION0(AFUNC)
421 # define Q_DESTRUCTOR_FUNCTION0(AFUNC) \
422     class AFUNC ## _dest_class_ { \
423     public: \
424        inline AFUNC ## _dest_class_() { } \
425        inline ~ AFUNC ## _dest_class_() { AFUNC(); } \
426     } AFUNC ## _dest_instance_;
427 # define Q_DESTRUCTOR_FUNCTION(AFUNC) Q_DESTRUCTOR_FUNCTION0(AFUNC)
428
429 #endif
430
431 /* Symantec C++ is now Digital Mars */
432 #if defined(__DMC__) || defined(__SC__)
433 #  define Q_CC_SYM
434 /* "explicit" semantics implemented in 8.1e but keyword recognized since 7.5 */
435 #  if defined(__SC__) && __SC__ < 0x750
436 #    define Q_NO_EXPLICIT_KEYWORD
437 #  endif
438 #  define Q_NO_USING_KEYWORD
439
440 #elif defined(__MWERKS__)
441 #  define Q_CC_MWERKS
442 #  if defined(__EMU_SYMBIAN_OS__)
443 #    define Q_CC_NOKIAX86
444 #  endif
445 /* "explicit" recognized since 4.0d1 */
446
447 #elif defined(_MSC_VER)
448 #  define Q_CC_MSVC
449 #  define Q_CC_MSVC_NET
450 #  define Q_CANNOT_DELETE_CONSTANT
451 #  define Q_OUTOFLINE_TEMPLATE inline
452 #  define Q_NO_TEMPLATE_FRIENDS
453 #  define Q_ALIGNOF(type) __alignof(type)
454 #  define Q_DECL_ALIGN(n) __declspec(align(n))
455 /* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */
456 #  if defined(__INTEL_COMPILER)
457 #    define Q_CC_INTEL
458 #  endif
459 /* MSVC does not support SSE/MMX on x64 */
460 #  if (defined(Q_CC_MSVC) && defined(_M_X64))
461 #    undef QT_HAVE_SSE
462 #    undef QT_HAVE_MMX
463 #    undef QT_HAVE_3DNOW
464 #  endif
465
466 #elif defined(__BORLANDC__) || defined(__TURBOC__)
467 #  define Q_CC_BOR
468 #  define Q_INLINE_TEMPLATE
469 #  if __BORLANDC__ < 0x502
470 #    define Q_NO_BOOL_TYPE
471 #    define Q_NO_EXPLICIT_KEYWORD
472 #  endif
473 #  define Q_NO_USING_KEYWORD
474
475 #elif defined(__WATCOMC__)
476 #  define Q_CC_WAT
477
478 /* Symbian GCCE */
479 #elif defined(__GCCE__)
480 #  define Q_CC_GCCE
481 #  define QT_VISIBILITY_AVAILABLE
482 #  if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__)
483 #    define QT_HAVE_ARMV6
484 #  endif
485
486 /* ARM Realview Compiler Suite
487    RVCT compiler also defines __EDG__ and __GNUC__ (if --gnu flag is given),
488    so check for it before that */
489 #elif defined(__ARMCC__) || defined(__CC_ARM)
490 #  define Q_CC_RVCT
491 #  if __TARGET_ARCH_ARM >= 6
492 #    define QT_HAVE_ARMV6
493 #  endif
494 /* work-around for missing compiler intrinsics */
495 #  define __is_empty(X) false
496 #  define __is_pod(X) false
497
498 #elif defined(__GNUC__)
499 #  define Q_CC_GNU
500 #  define Q_C_CALLBACKS
501 #  if defined(__MINGW32__)
502 #    define Q_CC_MINGW
503 #  endif
504 #  if defined(__INTEL_COMPILER)
505 /* Intel C++ also masquerades as GCC 3.2.0 */
506 #    define Q_CC_INTEL
507 #  endif
508 #  if defined(__clang__)
509 /* Clang also masquerades as GCC 4.2.1 */
510 #    define Q_CC_CLANG
511 #    if !defined(__has_extension)
512 #      /* Compatibility with older Clang versions */
513 #      define __has_extension __has_feature
514 #    endif
515 #  endif
516 #  ifdef __APPLE__
517 #    define Q_NO_DEPRECATED_CONSTRUCTORS
518 #  endif
519 #  if __GNUC__ == 2 && __GNUC_MINOR__ <= 7
520 #    define Q_FULL_TEMPLATE_INSTANTIATION
521 #  endif
522 /* GCC 2.95 knows "using" but does not support it correctly */
523 #  if __GNUC__ == 2 && __GNUC_MINOR__ <= 95
524 #    define Q_NO_USING_KEYWORD
525 #    define QT_NO_STL_WCHAR
526 #  endif
527 #  if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
528 #    define Q_ALIGNOF(type)   __alignof__(type)
529 #    define Q_TYPEOF(expr)    __typeof__(expr)
530 #    define Q_DECL_ALIGN(n)   __attribute__((__aligned__(n)))
531 #  endif
532 #  if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
533 #    define Q_LIKELY(expr)    __builtin_expect(!!(expr), true)
534 #    define Q_UNLIKELY(expr)  __builtin_expect(!!(expr), false)
535 #  endif
536 /* GCC 3.1 and GCC 3.2 wrongly define _SB_CTYPE_MACROS on HP-UX */
537 #  if defined(Q_OS_HPUX) && __GNUC__ == 3 && __GNUC_MINOR__ >= 1
538 #    define Q_WRONG_SB_CTYPE_MACROS
539 #  endif
540 /* GCC <= 3.3 cannot handle template friends */
541 #  if __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ <= 3)
542 #    define Q_NO_TEMPLATE_FRIENDS
543 #  endif
544 /* Apple's GCC 3.1 chokes on our streaming qDebug() */
545 #  if defined(Q_OS_DARWIN) && __GNUC__ == 3 && (__GNUC_MINOR__ >= 1 && __GNUC_MINOR__ < 3)
546 #    define Q_BROKEN_DEBUG_STREAM
547 #  endif
548 #  if (defined(Q_CC_GNU) || defined(Q_CC_INTEL)) && !defined(QT_MOC_CPP)
549 #    define Q_PACKED __attribute__ ((__packed__))
550 #    define Q_NO_PACKED_REFERENCE
551 #    ifndef __ARM_EABI__
552 #      define QT_NO_ARM_EABI
553 #    endif
554 #  endif
555
556 /* IBM compiler versions are a bit messy. There are actually two products:
557    the C product, and the C++ product. The C++ compiler is always packaged
558    with the latest version of the C compiler. Version numbers do not always
559    match. This little table (I'm not sure it's accurate) should be helpful:
560
561    C++ product                C product
562
563    C Set 3.1                  C Compiler 3.0
564    ...                        ...
565    C++ Compiler 3.6.6         C Compiler 4.3
566    ...                        ...
567    Visual Age C++ 4.0         ...
568    ...                        ...
569    Visual Age C++ 5.0         C Compiler 5.0
570    ...                        ...
571    Visual Age C++ 6.0         C Compiler 6.0
572
573    Now:
574    __xlC__    is the version of the C compiler in hexadecimal notation
575               is only an approximation of the C++ compiler version
576    __IBMCPP__ is the version of the C++ compiler in decimal notation
577               but it is not defined on older compilers like C Set 3.1 */
578 #elif defined(__xlC__)
579 #  define Q_CC_XLC
580 #  define Q_FULL_TEMPLATE_INSTANTIATION
581 #  if __xlC__ < 0x400
582 #    define Q_NO_BOOL_TYPE
583 #    define Q_NO_EXPLICIT_KEYWORD
584 #    define Q_NO_USING_KEYWORD
585 #    define Q_TYPENAME
586 #    define Q_OUTOFLINE_TEMPLATE inline
587 #    define Q_BROKEN_TEMPLATE_SPECIALIZATION
588 #    define Q_CANNOT_DELETE_CONSTANT
589 #  elif __xlC__ >= 0x0600
590 #    define Q_ALIGNOF(type)     __alignof__(type)
591 #    define Q_TYPEOF(expr)      __typeof__(expr)
592 #    define Q_DECL_ALIGN(n)     __attribute__((__aligned__(n)))
593 #    define Q_PACKED            __attribute__((__packed__))
594 #  endif
595
596 /* Older versions of DEC C++ do not define __EDG__ or __EDG - observed
597    on DEC C++ V5.5-004. New versions do define  __EDG__ - observed on
598    Compaq C++ V6.3-002.
599    This compiler is different enough from other EDG compilers to handle
600    it separately anyway. */
601 #elif defined(__DECCXX) || defined(__DECC)
602 #  define Q_CC_DEC
603 /* Compaq C++ V6 compilers are EDG-based but I'm not sure about older
604    DEC C++ V5 compilers. */
605 #  if defined(__EDG__)
606 #    define Q_CC_EDG
607 #  endif
608 /* Compaq have disabled EDG's _BOOL macro and use _BOOL_EXISTS instead
609    - observed on Compaq C++ V6.3-002.
610    In any case versions prior to Compaq C++ V6.0-005 do not have bool. */
611 #  if !defined(_BOOL_EXISTS)
612 #    define Q_NO_BOOL_TYPE
613 #  endif
614 /* Spurious (?) error messages observed on Compaq C++ V6.5-014. */
615 #  define Q_NO_USING_KEYWORD
616 /* Apply to all versions prior to Compaq C++ V6.0-000 - observed on
617    DEC C++ V5.5-004. */
618 #  if __DECCXX_VER < 60060000
619 #    define Q_TYPENAME
620 #    define Q_BROKEN_TEMPLATE_SPECIALIZATION
621 #    define Q_CANNOT_DELETE_CONSTANT
622 #  endif
623 /* avoid undefined symbol problems with out-of-line template members */
624 #  define Q_OUTOFLINE_TEMPLATE inline
625
626 /* The Portland Group C++ compiler is based on EDG and does define __EDG__
627    but the C compiler does not */
628 #elif defined(__PGI)
629 #  define Q_CC_PGI
630 #  if defined(__EDG__)
631 #    define Q_CC_EDG
632 #  endif
633
634 /* Compilers with EDG front end are similar. To detect them we test:
635    __EDG documented by SGI, observed on MIPSpro 7.3.1.1 and KAI C++ 4.0b
636    __EDG__ documented in EDG online docs, observed on Compaq C++ V6.3-002
637    and PGI C++ 5.2-4 */
638 #elif !defined(Q_OS_HPUX) && (defined(__EDG) || defined(__EDG__))
639 #  define Q_CC_EDG
640 /* From the EDG documentation (does not seem to apply to Compaq C++):
641    _BOOL
642         Defined in C++ mode when bool is a keyword. The name of this
643         predefined macro is specified by a configuration flag. _BOOL
644         is the default.
645    __BOOL_DEFINED
646         Defined in Microsoft C++ mode when bool is a keyword. */
647 #  if !defined(_BOOL) && !defined(__BOOL_DEFINED)
648 #    define Q_NO_BOOL_TYPE
649 #  endif
650
651 /* The Comeau compiler is based on EDG and does define __EDG__ */
652 #  if defined(__COMO__)
653 #    define Q_CC_COMEAU
654 #    define Q_C_CALLBACKS
655
656 /* The `using' keyword was introduced to avoid KAI C++ warnings
657    but it's now causing KAI C++ errors instead. The standard is
658    unclear about the use of this keyword, and in practice every
659    compiler is using its own set of rules. Forget it. */
660 #  elif defined(__KCC)
661 #    define Q_CC_KAI
662 #    define Q_NO_USING_KEYWORD
663
664 /* Using the `using' keyword avoids Intel C++ for Linux warnings */
665 #  elif defined(__INTEL_COMPILER)
666 #    define Q_CC_INTEL
667
668 /* Uses CFront, make sure to read the manual how to tweak templates. */
669 #  elif defined(__ghs)
670 #    define Q_CC_GHS
671
672 #  elif defined(__DCC__)
673 #    define Q_CC_DIAB
674 #    undef Q_NO_BOOL_TYPE
675 #    if !defined(__bool)
676 #      define Q_NO_BOOL_TYPE
677 #    endif
678
679 /* The UnixWare 7 UDK compiler is based on EDG and does define __EDG__ */
680 #  elif defined(__USLC__) && defined(__SCO_VERSION__)
681 #    define Q_CC_USLC
682 /* The latest UDK 7.1.1b does not need this, but previous versions do */
683 #    if !defined(__SCO_VERSION__) || (__SCO_VERSION__ < 302200010)
684 #      define Q_OUTOFLINE_TEMPLATE inline
685 #    endif
686 #    define Q_NO_USING_KEYWORD /* ### check "using" status */
687
688 /* Never tested! */
689 #  elif defined(CENTERLINE_CLPP) || defined(OBJECTCENTER)
690 #    define Q_CC_OC
691 #    define Q_NO_USING_KEYWORD
692
693 /* CDS++ defines __EDG__ although this is not documented in the Reliant
694    documentation. It also follows conventions like _BOOL and this documented */
695 #  elif defined(sinix)
696 #    define Q_CC_CDS
697 #    define Q_NO_USING_KEYWORD
698
699 /* The MIPSpro compiler defines __EDG */
700 #  elif defined(__sgi)
701 #    define Q_CC_MIPS
702 #    define Q_NO_USING_KEYWORD /* ### check "using" status */
703 #    define Q_NO_TEMPLATE_FRIENDS
704 #    if defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 740)
705 #      define Q_OUTOFLINE_TEMPLATE inline
706 #      pragma set woff 3624,3625,3649 /* turn off some harmless warnings */
707 #    endif
708 #  endif
709
710 /* VxWorks' DIAB toolchain has an additional EDG type C++ compiler
711    (see __DCC__ above). This one is for C mode files (__EDG is not defined) */
712 #elif defined(_DIAB_TOOL)
713 #  define Q_CC_DIAB
714
715 /* Never tested! */
716 #elif defined(__HIGHC__)
717 #  define Q_CC_HIGHC
718
719 #elif defined(__SUNPRO_CC) || defined(__SUNPRO_C)
720 #  define Q_CC_SUN
721 /* 5.0 compiler or better
722     'bool' is enabled by default but can be disabled using -features=nobool
723     in which case _BOOL is not defined
724         this is the default in 4.2 compatibility mode triggered by -compat=4 */
725 #  if __SUNPRO_CC >= 0x500
726 #    if __SUNPRO_CC < 0x590
727 #      define QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
728        /* see http://www.oracle.com/technetwork/systems/cccompare-137792.html */
729 #    endif
730 #    if __SUNPRO_CC >= 0x590
731 #      define Q_ALIGNOF(type)   __alignof__(type)
732 #      define Q_TYPEOF(expr)    __typeof__(expr)
733 #      define Q_DECL_ALIGN(n)   __attribute__((__aligned__(n)))
734 #    endif
735 #    if __SUNPRO_CC >= 0x550
736 #      define Q_DECL_EXPORT     __global
737 #    endif
738 #    if __SUNPRO_CC < 0x5a0
739 #      define Q_NO_TEMPLATE_FRIENDS
740 #    endif
741 #    if !defined(_BOOL)
742 #      define Q_NO_BOOL_TYPE
743 #    endif
744 #    if defined(__SUNPRO_CC_COMPAT) && (__SUNPRO_CC_COMPAT <= 4)
745 #      define Q_NO_USING_KEYWORD
746 #    endif
747 #    define Q_C_CALLBACKS
748 /* 4.2 compiler or older */
749 #  else
750 #    define Q_NO_BOOL_TYPE
751 #    define Q_NO_EXPLICIT_KEYWORD
752 #    define Q_NO_USING_KEYWORD
753 #  endif
754
755 /* CDS++ does not seem to define __EDG__ or __EDG according to Reliant
756    documentation but nevertheless uses EDG conventions like _BOOL */
757 #elif defined(sinix)
758 #  define Q_CC_EDG
759 #  define Q_CC_CDS
760 #  if !defined(_BOOL)
761 #    define Q_NO_BOOL_TYPE
762 #  endif
763 #  define Q_BROKEN_TEMPLATE_SPECIALIZATION
764
765 #elif defined(Q_OS_HPUX)
766 /* __HP_aCC was not defined in first aCC releases */
767 #  if defined(__HP_aCC) || __cplusplus >= 199707L
768 #    define Q_NO_TEMPLATE_FRIENDS
769 #    define Q_CC_HPACC
770 #    if __HP_aCC-0 < 060000
771 #      define QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
772 #      define Q_DECL_EXPORT     __declspec(dllexport)
773 #      define Q_DECL_IMPORT     __declspec(dllimport)
774 #    endif
775 #    if __HP_aCC-0 >= 061200
776 #      define Q_DECL_ALIGN(n) __attribute__((aligned(n)))
777 #    endif
778 #    if __HP_aCC-0 >= 062000
779 #      define Q_DECL_EXPORT     __attribute__((visibility("default")))
780 #      define Q_DECL_HIDDEN     __attribute__((visibility("hidden")))
781 #      define Q_DECL_IMPORT     Q_DECL_EXPORT
782 #    endif
783 #  else
784 #    define Q_CC_HP
785 #    define Q_NO_BOOL_TYPE
786 #    define Q_FULL_TEMPLATE_INSTANTIATION
787 #    define Q_BROKEN_TEMPLATE_SPECIALIZATION
788 #    define Q_NO_EXPLICIT_KEYWORD
789 #  endif
790 #  define Q_NO_USING_KEYWORD /* ### check "using" status */
791
792 #elif defined(__WINSCW__) && !defined(Q_CC_NOKIAX86)
793 #  define Q_CC_NOKIAX86
794
795 #else
796 #  error "Qt has not been tested with this compiler - talk to qt-bugs@trolltech.com"
797 #endif
798
799 /*
800  * C++11 support
801  *
802  *  Paper           Macro                               SD-6 macro
803  *  N2541           Q_COMPILER_AUTO_FUNCTION
804  *  N1984 N2546     Q_COMPILER_AUTO_TYPE
805  *  N2437           Q_COMPILER_CLASS_ENUM
806  *  N2235           Q_COMPILER_CONSTEXPR                __cpp_constexpr = 200704
807  *  N2343 N3276     Q_COMPILER_DECLTYPE                 __cpp_decltype = 200707
808  *  N2346           Q_COMPILER_DEFAULT_DELETE_MEMBERS
809  *  N1987           Q_COMPILER_EXTERN_TEMPLATES
810  *  N2672           Q_COMPILER_INITIALIZER_LISTS
811  *  N2658 N2927     Q_COMPILER_LAMBDA                   __cpp_lambdas = 200907
812  *  N2118 N2844 N3053 Q_COMPILER_RVALUE_REFS            __cpp_rvalue_references = 200610
813  *  N2442           Q_COMPILER_UNICODE_STRINGS          __cpp_unicode_literals = 200710
814  *  N2242 N2555     Q_COMPILER_VARIADIC_TEMPLATES       __cpp_variadic_templates = 200704
815  *
816  * For any future version of the C++ standard, we use only the SD-6 macro.
817  * For full listing, see
818  *  http://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations
819  */
820
821 #ifdef Q_CC_INTEL
822 #  if __INTEL_COMPILER < 1200
823 #    define Q_NO_TEMPLATE_FRIENDS
824 #  endif
825 #  if __cplusplus >= 201103L
826 #    if __INTEL_COMPILER >= 1100
827 #      define Q_COMPILER_RVALUE_REFS
828 #      define Q_COMPILER_EXTERN_TEMPLATES
829 #      define Q_COMPILER_DECLTYPE
830 #    elif __INTEL_COMPILER >= 1200
831 #      define Q_COMPILER_VARIADIC_TEMPLATES
832 #      define Q_COMPILER_AUTO_TYPE
833 #      define Q_COMPILER_DEFAULT_DELETE_MEMBERS
834 #      define Q_COMPILER_CLASS_ENUM
835 #      define Q_COMPILER_LAMBDA
836 #    endif
837 #  endif
838 #endif
839
840 #if defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
841 #  if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
842     /* Detect C++ features using __has_feature(), see http://clang.llvm.org/docs/LanguageExtensions.html#cxx11 */
843 #    if __has_feature(cxx_auto_type)
844 #      define Q_COMPILER_AUTO_FUNCTION
845 #      define Q_COMPILER_AUTO_TYPE
846 #    endif
847 #    if __has_feature(cxx_constexpr)
848 #      define Q_COMPILER_CONSTEXPR
849 #    endif
850 #    if __has_feature(cxx_decltype) /* && __has_feature(cxx_decltype_incomplete_return_types) */
851 #      define Q_COMPILER_DECLTYPE
852 #    endif
853 #    if __has_feature(cxx_defaulted_functions) && __has_feature(cxx_deleted_functions)
854 #      define Q_COMPILER_DEFAULT_DELETE_MEMBERS
855 #    endif
856 #    if __has_feature(cxx_generalized_initializers)
857 #      define Q_COMPILER_INITIALIZER_LISTS
858 #    endif
859 #    if __has_feature(cxx_lambdas)
860 #      define Q_COMPILER_LAMBDA
861 #    endif
862 #    if __has_feature(cxx_rvalue_references)
863 #      define Q_COMPILER_RVALUE_REFS
864 #    endif
865 #    if __has_feature(cxx_strong_enums)
866 #      define Q_COMPILER_CLASS_ENUM
867 #    endif
868 #    if __has_feature(cxx_unicode_literals)
869 #      define Q_COMPILER_UNICODE_STRINGS
870 #    endif
871 #    if __has_feature(cxx_variadic_templates)
872 #      define Q_COMPILER_VARIADIC_TEMPLATES
873 #    endif
874     /* Features that have no __has_feature() check */
875 #    if ((__clang_major__ * 100) + __clang_minor__) >= 209 /* since clang 2.9 */
876 #      define Q_COMPILER_EXTERN_TEMPLATES
877 #    endif
878 #  endif
879 #endif
880
881 #if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG)
882 #  if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
883 #    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
884        /* C++0x features supported in GCC 4.3: */
885 #      define Q_COMPILER_RVALUE_REFS
886 #      define Q_COMPILER_DECLTYPE
887 #    endif
888 #    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404
889        /* C++0x features supported in GCC 4.4: */
890 #      define Q_COMPILER_VARIADIC_TEMPLATES
891 #      define Q_COMPILER_AUTO_FUNCTION
892 #      define Q_COMPILER_AUTO_TYPE
893 #      define Q_COMPILER_EXTERN_TEMPLATES
894 #      define Q_COMPILER_DEFAULT_DELETE_MEMBERS
895 #      define Q_COMPILER_CLASS_ENUM
896 #      define Q_COMPILER_INITIALIZER_LISTS
897 #    endif
898 #    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
899        /* C++0x features supported in GCC 4.5: */
900 #      define Q_COMPILER_LAMBDA
901 #      define Q_COMPILER_UNICODE_STRINGS
902 #    endif
903 #    if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
904        /* C++0x features supported in GCC 4.6: */
905 #      define Q_COMPILER_CONSTEXPR
906 #    endif
907 #  endif
908 #endif
909
910 #if defined(Q_CC_MSVC) && !defined(Q_CC_INTEL)
911 #  if defined(__cplusplus)
912 #    if _MSC_VER >= 1600
913        /* C++11 features supported in VC10 = VC2010: */
914 #      define Q_COMPILER_AUTO_FUNCTION
915 #      define Q_COMPILER_AUTO_TYPE
916 #      define Q_COMPILER_DECLTYPE
917 #      define Q_COMPILER_LAMBDA
918 #      define Q_COMPILER_RVALUE_REFS
919 //  MSVC's library has std::initializer_list, but the compiler does not support the braces initialization
920 //#      define Q_COMPILER_INITIALIZER_LISTS
921 #    endif
922 #  endif
923 #endif
924
925 #ifndef Q_PACKED
926 #  define Q_PACKED
927 #  undef Q_NO_PACKED_REFERENCE
928 #endif
929
930 #ifndef Q_LIKELY
931 #  define Q_LIKELY(x) (x)
932 #endif
933 #ifndef Q_UNLIKELY
934 #  define Q_UNLIKELY(x) (x)
935 #endif
936
937 #ifndef Q_CONSTRUCTOR_FUNCTION
938 # define Q_CONSTRUCTOR_FUNCTION0(AFUNC) \
939    static const int AFUNC ## __init_variable__ = AFUNC();
940 # define Q_CONSTRUCTOR_FUNCTION(AFUNC) Q_CONSTRUCTOR_FUNCTION0(AFUNC)
941 #endif
942
943 #ifndef Q_DESTRUCTOR_FUNCTION
944 # define Q_DESTRUCTOR_FUNCTION0(AFUNC) \
945     class AFUNC ## __dest_class__ { \
946     public: \
947        inline AFUNC ## __dest_class__() { } \
948        inline ~ AFUNC ## __dest_class__() { AFUNC(); } \
949     } AFUNC ## __dest_instance__;
950 # define Q_DESTRUCTOR_FUNCTION(AFUNC) Q_DESTRUCTOR_FUNCTION0(AFUNC)
951 #endif
952
953 #ifndef Q_REQUIRED_RESULT
954 #  if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1))
955 #    define Q_REQUIRED_RESULT __attribute__ ((warn_unused_result))
956 #  else
957 #    define Q_REQUIRED_RESULT
958 #  endif
959 #endif
960
961 #ifndef Q_COMPILER_MANGLES_RETURN_TYPE
962 #  if defined(Q_CC_MSVC)
963 #    define Q_COMPILER_MANGLES_RETURN_TYPE
964 #  endif
965 #endif
966
967 #ifdef __cplusplus
968 # if defined(Q_OS_QNX) || defined(Q_OS_BLACKBERRY)
969 #  include <utility>
970 #  if defined(_YVALS) || defined(_LIBCPP_VER)
971 // QNX: libcpp (Dinkumware-based) doesn't have the <initializer_list>
972 // header, so the feature is useless, even if the compiler supports
973 // it. Disable.
974 #    ifdef Q_COMPILER_INITIALIZER_LISTS
975 #      undef Q_COMPILER_INITIALIZER_LISTS
976 #    endif
977 #  endif
978 # endif
979 #endif
980
981 /*
982    The window system, must be one of: (Q_WS_x)
983
984      MACX     - Mac OS X
985      MAC9     - Mac OS 9
986      QWS      - Qt for Embedded Linux
987      WIN32    - Windows
988      X11      - X Window System
989      S60      - Symbian S60
990      PM       - unsupported
991      WIN16    - unsupported
992 */
993
994 #if defined(Q_OS_MSDOS)
995 #  define Q_WS_WIN16
996 #  error "Qt requires Win32 and does not work with Windows 3.x"
997 #elif defined(_WIN32_X11_)
998 #  define Q_WS_X11
999 #elif defined(Q_OS_WIN32)
1000 #  define Q_WS_WIN32
1001 #  if defined(Q_OS_WIN64)
1002 #    define Q_WS_WIN64
1003 #  endif
1004 #elif defined(Q_OS_WINCE)
1005 #  define Q_WS_WIN32
1006 #  define Q_WS_WINCE
1007 #  if defined(Q_OS_WINCE_WM)
1008 #    define Q_WS_WINCE_WM
1009 #  endif
1010 #elif defined(Q_OS_OS2)
1011 #  define Q_WS_PM
1012 #  error "Qt does not work with OS/2 Presentation Manager or Workplace Shell"
1013 #elif defined(Q_OS_UNIX)
1014 #  if defined(Q_OS_MAC) && !defined(__USE_WS_X11__) && !defined(Q_WS_QWS) && !defined(Q_WS_QPA)
1015 #    define Q_WS_MAC
1016 #    define Q_WS_MACX
1017 #    if defined(Q_OS_MAC64)
1018 #      define Q_WS_MAC64
1019 #    elif defined(Q_OS_MAC32)
1020 #      define Q_WS_MAC32
1021 #    endif
1022 #  elif defined(Q_OS_SYMBIAN)
1023 #    if !defined(QT_NO_S60)
1024 #      define Q_WS_S60
1025 #    endif
1026 #  elif !defined(Q_WS_QWS) && !defined(Q_WS_QPA)
1027 #    define Q_WS_X11
1028 #  endif
1029 #endif
1030
1031 #if defined(Q_WS_WIN16) || defined(Q_WS_WIN32) || defined(Q_WS_WINCE)
1032 #  define Q_WS_WIN
1033 #endif
1034
1035 QT_BEGIN_HEADER
1036 QT_BEGIN_NAMESPACE
1037
1038 /*
1039    Size-dependent types (architechture-dependent byte order)
1040
1041    Make sure to update QMetaType when changing these typedefs
1042 */
1043
1044 typedef signed char qint8;         /* 8 bit signed */
1045 typedef unsigned char quint8;      /* 8 bit unsigned */
1046 typedef short qint16;              /* 16 bit signed */
1047 typedef unsigned short quint16;    /* 16 bit unsigned */
1048 typedef int qint32;                /* 32 bit signed */
1049 typedef unsigned int quint32;      /* 32 bit unsigned */
1050 #if defined(Q_OS_WIN) && !defined(Q_CC_GNU) && !defined(Q_CC_MWERKS)
1051 #  define Q_INT64_C(c) c ## i64    /* signed 64 bit constant */
1052 #  define Q_UINT64_C(c) c ## ui64   /* unsigned 64 bit constant */
1053 typedef __int64 qint64;            /* 64 bit signed */
1054 typedef unsigned __int64 quint64;  /* 64 bit unsigned */
1055 #else
1056 #  define Q_INT64_C(c) static_cast<long long>(c ## LL)     /* signed 64 bit constant */
1057 #  define Q_UINT64_C(c) static_cast<unsigned long long>(c ## ULL) /* unsigned 64 bit constant */
1058 typedef long long qint64;           /* 64 bit signed */
1059 typedef unsigned long long quint64; /* 64 bit unsigned */
1060 #endif
1061
1062 typedef qint64 qlonglong;
1063 typedef quint64 qulonglong;
1064
1065 #ifndef QT_POINTER_SIZE
1066 #  if defined(Q_OS_WIN64)
1067 #   define QT_POINTER_SIZE 8
1068 #  elif defined(Q_OS_WIN32) || defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
1069 #   define QT_POINTER_SIZE 4
1070 #  endif
1071 #endif
1072
1073 #define Q_INIT_RESOURCE_EXTERN(name) \
1074     extern int QT_MANGLE_NAMESPACE(qInitResources_ ## name) ();
1075
1076 #define Q_INIT_RESOURCE(name) \
1077     do { extern int QT_MANGLE_NAMESPACE(qInitResources_ ## name) ();       \
1078         QT_MANGLE_NAMESPACE(qInitResources_ ## name) (); } while (0)
1079 #define Q_CLEANUP_RESOURCE(name) \
1080     do { extern int QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) ();    \
1081         QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) (); } while (0)
1082
1083 #if defined(__cplusplus)
1084
1085 /*
1086   quintptr and qptrdiff is guaranteed to be the same size as a pointer, i.e.
1087
1088       sizeof(void *) == sizeof(quintptr)
1089       && sizeof(void *) == sizeof(qptrdiff)
1090 */
1091 template <int> struct QIntegerForSize;
1092 template <>    struct QIntegerForSize<1> { typedef quint8  Unsigned; typedef qint8  Signed; };
1093 template <>    struct QIntegerForSize<2> { typedef quint16 Unsigned; typedef qint16 Signed; };
1094 template <>    struct QIntegerForSize<4> { typedef quint32 Unsigned; typedef qint32 Signed; };
1095 template <>    struct QIntegerForSize<8> { typedef quint64 Unsigned; typedef qint64 Signed; };
1096 template <class T> struct QIntegerForSizeof: QIntegerForSize<sizeof(T)> { };
1097 typedef QIntegerForSizeof<void*>::Unsigned quintptr;
1098 typedef QIntegerForSizeof<void*>::Signed qptrdiff;
1099
1100 /*
1101    Useful type definitions for Qt
1102 */
1103
1104 QT_BEGIN_INCLUDE_NAMESPACE
1105 typedef unsigned char uchar;
1106 typedef unsigned short ushort;
1107 typedef unsigned int uint;
1108 typedef unsigned long ulong;
1109 QT_END_INCLUDE_NAMESPACE
1110
1111 #if defined(Q_NO_BOOL_TYPE)
1112 #error "Compiler doesn't support the bool type"
1113 #endif
1114
1115 /*
1116    Constant bool values
1117 */
1118
1119 #ifndef QT_LINUXBASE /* the LSB defines TRUE and FALSE for us */
1120 /* Symbian OS defines TRUE = 1 and FALSE = 0,
1121 redefine to built-in booleans to make autotests work properly */
1122 #ifdef Q_OS_SYMBIAN
1123     #include <e32def.h> /* Symbian OS defines */
1124
1125     #undef TRUE
1126     #undef FALSE
1127 #endif
1128 #  ifndef TRUE
1129 #   define TRUE true
1130 #   define FALSE false
1131 #  endif
1132 #endif
1133
1134 /*
1135    Proper for-scoping in MIPSpro CC
1136 */
1137 #ifndef QT_NO_KEYWORDS
1138 #  if defined(Q_CC_MIPS) || (defined(Q_CC_HPACC) && defined(__ia64))
1139 #    define for if(0){}else for
1140 #  endif
1141 #endif
1142
1143 /*
1144    Workaround for static const members on MSVC++.
1145 */
1146
1147 #if defined(Q_CC_MSVC)
1148 #  define QT_STATIC_CONST static
1149 #  define QT_STATIC_CONST_IMPL
1150 #else
1151 #  define QT_STATIC_CONST static const
1152 #  define QT_STATIC_CONST_IMPL const
1153 #endif
1154
1155 /*
1156    Warnings and errors when using deprecated methods
1157 */
1158 #if defined(Q_MOC_RUN)
1159 #  define Q_DECL_DEPRECATED Q_DECL_DEPRECATED
1160 #elif (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && (__GNUC__ - 0 > 3 || (__GNUC__ - 0 == 3 && __GNUC_MINOR__ - 0 >= 2))) || defined(Q_CC_RVCT)
1161 #  define Q_DECL_DEPRECATED __attribute__ ((__deprecated__))
1162 #elif defined(Q_CC_MSVC)
1163 #  define Q_DECL_DEPRECATED __declspec(deprecated)
1164 #  if defined (Q_CC_INTEL)
1165 #    define Q_DECL_VARIABLE_DEPRECATED
1166 #  else
1167 #  endif
1168 #else
1169 #  define Q_DECL_DEPRECATED
1170 #endif
1171 #ifndef Q_DECL_VARIABLE_DEPRECATED
1172 #  define Q_DECL_VARIABLE_DEPRECATED Q_DECL_DEPRECATED
1173 #endif
1174 #ifndef Q_DECL_CONSTRUCTOR_DEPRECATED
1175 #  if defined(Q_MOC_RUN)
1176 #    define Q_DECL_CONSTRUCTOR_DEPRECATED Q_DECL_CONSTRUCTOR_DEPRECATED
1177 #  elif defined(Q_NO_DEPRECATED_CONSTRUCTORS)
1178 #    define Q_DECL_CONSTRUCTOR_DEPRECATED
1179 #  else
1180 #    define Q_DECL_CONSTRUCTOR_DEPRECATED Q_DECL_DEPRECATED
1181 #  endif
1182 #endif
1183
1184 #if defined(QT_NO_DEPRECATED)
1185 /* disable Qt3 support as well */
1186 #  undef QT3_SUPPORT_WARNINGS
1187 #  undef QT3_SUPPORT
1188 #  undef QT_DEPRECATED
1189 #  undef QT_DEPRECATED_VARIABLE
1190 #  undef QT_DEPRECATED_CONSTRUCTOR
1191 #elif defined(QT_DEPRECATED_WARNINGS)
1192 #  ifdef QT3_SUPPORT
1193 /* enable Qt3 support warnings as well */
1194 #    undef QT3_SUPPORT_WARNINGS
1195 #    define QT3_SUPPORT_WARNINGS
1196 #  endif
1197 #  undef QT_DEPRECATED
1198 #  define QT_DEPRECATED Q_DECL_DEPRECATED
1199 #  undef QT_DEPRECATED_VARIABLE
1200 #  define QT_DEPRECATED_VARIABLE Q_DECL_VARIABLE_DEPRECATED
1201 #  undef QT_DEPRECATED_CONSTRUCTOR
1202 #  define QT_DEPRECATED_CONSTRUCTOR explicit Q_DECL_CONSTRUCTOR_DEPRECATED
1203 #else
1204 #  undef QT_DEPRECATED
1205 #  define QT_DEPRECATED
1206 #  undef QT_DEPRECATED_VARIABLE
1207 #  define QT_DEPRECATED_VARIABLE
1208 #  undef QT_DEPRECATED_CONSTRUCTOR
1209 #  define QT_DEPRECATED_CONSTRUCTOR
1210 #endif
1211
1212 #if defined(QT3_SUPPORT_WARNINGS)
1213 #  if !defined(QT_COMPAT_WARNINGS) /* also enable compat */
1214 #    define QT_COMPAT_WARNINGS
1215 #  endif
1216 #  undef QT3_SUPPORT
1217 #  define QT3_SUPPORT Q_DECL_DEPRECATED
1218 #  undef QT3_SUPPORT_VARIABLE
1219 #  define QT3_SUPPORT_VARIABLE Q_DECL_VARIABLE_DEPRECATED
1220 #  undef QT3_SUPPORT_CONSTRUCTOR
1221 #  define QT3_SUPPORT_CONSTRUCTOR explicit Q_DECL_CONSTRUCTOR_DEPRECATED
1222 #elif defined(QT3_SUPPORT) /* define back to nothing */
1223 #  if !defined(QT_COMPAT) /* also enable qt3 support */
1224 #    define QT_COMPAT
1225 #  endif
1226 #  undef QT3_SUPPORT
1227 #  define QT3_SUPPORT
1228 #  undef QT3_SUPPORT_VARIABLE
1229 #  define QT3_SUPPORT_VARIABLE
1230 #  undef QT3_SUPPORT_CONSTRUCTOR
1231 #  define QT3_SUPPORT_CONSTRUCTOR explicit
1232 #endif
1233
1234 /* moc compats (signals/slots) */
1235 #ifndef QT_MOC_COMPAT
1236 #  if defined(QT3_SUPPORT)
1237 #    define QT_MOC_COMPAT QT3_SUPPORT
1238 #  else
1239 #    define QT_MOC_COMPAT
1240 #  endif
1241 #else
1242 #  undef QT_MOC_COMPAT
1243 #  define QT_MOC_COMPAT
1244 #endif
1245
1246 #ifdef QT_ASCII_CAST_WARNINGS
1247 #  define QT_ASCII_CAST_WARN Q_DECL_DEPRECATED
1248 #  if defined(Q_CC_GNU) && __GNUC__ < 4
1249      /* gcc < 4 doesn't like Q_DECL_DEPRECATED in front of constructors */
1250 #    define QT_ASCII_CAST_WARN_CONSTRUCTOR
1251 #  else
1252 #    define QT_ASCII_CAST_WARN_CONSTRUCTOR Q_DECL_CONSTRUCTOR_DEPRECATED
1253 #  endif
1254 #else
1255 #  define QT_ASCII_CAST_WARN
1256 #  define QT_ASCII_CAST_WARN_CONSTRUCTOR
1257 #endif
1258
1259 #if defined(__i386__) || defined(_WIN32) || defined(_WIN32_WCE)
1260 #  if defined(Q_CC_GNU)
1261 #if !defined(Q_CC_INTEL) && ((100*(__GNUC__ - 0) + 10*(__GNUC_MINOR__ - 0) + __GNUC_PATCHLEVEL__) >= 332)
1262 #    define QT_FASTCALL __attribute__((regparm(3)))
1263 #else
1264 #    define QT_FASTCALL
1265 #endif
1266 #  elif defined(Q_CC_MSVC)
1267 #    define QT_FASTCALL __fastcall
1268 #  else
1269 #     define QT_FASTCALL
1270 #  endif
1271 #else
1272 #  define QT_FASTCALL
1273 #endif
1274
1275 #ifdef Q_COMPILER_CONSTEXPR
1276 # define Q_DECL_CONSTEXPR constexpr
1277 #else
1278 # define Q_DECL_CONSTEXPR
1279 #endif
1280
1281 //defines the type for the WNDPROC on windows
1282 //the alignment needs to be forced for sse2 to not crash with mingw
1283 #if defined(Q_WS_WIN)
1284 #  if defined(Q_CC_MINGW)
1285 #    define QT_ENSURE_STACK_ALIGNED_FOR_SSE __attribute__ ((force_align_arg_pointer))
1286 #  else
1287 #    define QT_ENSURE_STACK_ALIGNED_FOR_SSE
1288 #  endif
1289 #  define QT_WIN_CALLBACK CALLBACK QT_ENSURE_STACK_ALIGNED_FOR_SSE
1290 #endif
1291
1292 typedef int QNoImplicitBoolCast;
1293
1294 #if defined(QT_ARCH_ARM) || defined(QT_ARCH_ARMV6) || defined(QT_ARCH_AVR32) || (defined(QT_ARCH_MIPS) && (defined(Q_WS_QWS) || defined(Q_WS_QPA) || defined(Q_OS_WINCE))) || defined(QT_ARCH_SH) || defined(QT_ARCH_SH4A)
1295 #define QT_NO_FPU
1296 #endif
1297
1298 // This logic must match the one in qmetatype.h
1299 #if defined(QT_COORD_TYPE)
1300 typedef QT_COORD_TYPE qreal;
1301 #elif defined(QT_NO_FPU) || defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE) || defined(QT_ARCH_SYMBIAN)
1302 typedef float qreal;
1303 #else
1304 typedef double qreal;
1305 #endif
1306
1307 /*
1308    Utility macros and inline functions
1309 */
1310
1311 template <typename T>
1312 Q_DECL_CONSTEXPR inline T qAbs(const T &t) { return t >= 0 ? t : -t; }
1313
1314 Q_DECL_CONSTEXPR inline int qRound(qreal d)
1315 { return d >= qreal(0.0) ? int(d + qreal(0.5)) : int(d - int(d-1) + qreal(0.5)) + int(d-1); }
1316
1317 #if defined(QT_NO_FPU) || defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE) || defined(QT_ARCH_SYMBIAN)
1318 Q_DECL_CONSTEXPR inline qint64 qRound64(double d)
1319 { return d >= 0.0 ? qint64(d + 0.5) : qint64(d - qreal(qint64(d-1)) + 0.5) + qint64(d-1); }
1320 #else
1321 Q_DECL_CONSTEXPR inline qint64 qRound64(qreal d)
1322 { return d >= qreal(0.0) ? qint64(d + qreal(0.5)) : qint64(d - qreal(qint64(d-1)) + qreal(0.5)) + qint64(d-1); }
1323 #endif
1324
1325 template <typename T>
1326 Q_DECL_CONSTEXPR inline const T &qMin(const T &a, const T &b) { return (a < b) ? a : b; }
1327 template <typename T>
1328 Q_DECL_CONSTEXPR inline const T &qMax(const T &a, const T &b) { return (a < b) ? b : a; }
1329 template <typename T>
1330 Q_DECL_CONSTEXPR inline const T &qBound(const T &min, const T &val, const T &max)
1331 { return qMax(min, qMin(max, val)); }
1332
1333 #ifdef QT3_SUPPORT
1334 typedef qint8 Q_INT8;
1335 typedef quint8 Q_UINT8;
1336 typedef qint16 Q_INT16;
1337 typedef quint16 Q_UINT16;
1338 typedef qint32 Q_INT32;
1339 typedef quint32 Q_UINT32;
1340 typedef qint64 Q_INT64;
1341 typedef quint64 Q_UINT64;
1342
1343 typedef qint64 Q_LLONG;
1344 typedef quint64 Q_ULLONG;
1345 #if defined(Q_OS_WIN64)
1346 typedef __int64 Q_LONG;             /* word up to 64 bit signed */
1347 typedef unsigned __int64 Q_ULONG;   /* word up to 64 bit unsigned */
1348 #else
1349 typedef long Q_LONG;                /* word up to 64 bit signed */
1350 typedef unsigned long Q_ULONG;      /* word up to 64 bit unsigned */
1351 #endif
1352
1353 #  define QABS(a) qAbs(a)
1354 #  define QMAX(a, b) qMax((a), (b))
1355 #  define QMIN(a, b) qMin((a), (b))
1356 #endif
1357
1358 /*
1359    Data stream functions are provided by many classes (defined in qdatastream.h)
1360 */
1361
1362 class QDataStream;
1363
1364 #ifndef QT_BUILD_KEY
1365 #define QT_BUILD_KEY "unspecified"
1366 #endif
1367
1368 #if defined(Q_WS_MAC)
1369 #  ifndef QMAC_QMENUBAR_NO_EVENT
1370 #    define QMAC_QMENUBAR_NO_EVENT
1371 #  endif
1372 #endif
1373
1374 #if !defined(Q_WS_QWS) && !defined(QT_NO_COP)
1375 #  define QT_NO_COP
1376 #endif
1377
1378 #if defined(Q_OS_VXWORKS)
1379 #  define QT_NO_CRASHHANDLER     // no popen
1380 #  define QT_NO_PROCESS          // no exec*, no fork
1381 #  define QT_NO_LPR
1382 #  define QT_NO_SHAREDMEMORY     // only POSIX, no SysV and in the end...
1383 #  define QT_NO_SYSTEMSEMAPHORE  // not needed at all in a flat address space
1384 #  define QT_NO_QWS_MULTIPROCESS // no processes
1385 #endif
1386
1387 # include <QtCore/qfeatures.h>
1388
1389 #define QT_SUPPORTS(FEATURE) (!defined(QT_NO_##FEATURE))
1390
1391 #if defined(Q_OS_LINUX) && defined(Q_CC_RVCT)
1392 #  define Q_DECL_EXPORT     __attribute__((visibility("default")))
1393 #  define Q_DECL_IMPORT     __attribute__((visibility("default")))
1394 #  define Q_DECL_HIDDEN     __attribute__((visibility("hidden")))
1395 #endif
1396
1397 #ifndef Q_DECL_EXPORT
1398 #  if defined(Q_OS_WIN) || defined(Q_CC_NOKIAX86) || defined(Q_CC_RVCT)
1399 #    define Q_DECL_EXPORT __declspec(dllexport)
1400 #  elif defined(QT_VISIBILITY_AVAILABLE)
1401 #    define Q_DECL_EXPORT __attribute__((visibility("default")))
1402 #    define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
1403 #  endif
1404 #  ifndef Q_DECL_EXPORT
1405 #    define Q_DECL_EXPORT
1406 #  endif
1407 #endif
1408 #ifndef Q_DECL_IMPORT
1409 #  if defined(Q_OS_WIN) || defined(Q_CC_NOKIAX86) || defined(Q_CC_RVCT)
1410 #    define Q_DECL_IMPORT __declspec(dllimport)
1411 #  else
1412 #    define Q_DECL_IMPORT
1413 #  endif
1414 #endif
1415 #ifndef Q_DECL_HIDDEN
1416 #  define Q_DECL_HIDDEN
1417 #endif
1418
1419
1420 /*
1421    Create Qt DLL if QT_DLL is defined (Windows and Symbian only)
1422 */
1423
1424 #if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
1425 #  if defined(QT_NODLL)
1426 #    undef QT_MAKEDLL
1427 #    undef QT_DLL
1428 #  elif defined(QT_MAKEDLL)        /* create a Qt DLL library */
1429 #    if defined(QT_DLL)
1430 #      undef QT_DLL
1431 #    endif
1432 #    if defined(QT_BUILD_CORE_LIB)
1433 #      define Q_CORE_EXPORT Q_DECL_EXPORT
1434 #    else
1435 #      define Q_CORE_EXPORT Q_DECL_IMPORT
1436 #    endif
1437 #    if defined(QT_BUILD_GUI_LIB)
1438 #      define Q_GUI_EXPORT Q_DECL_EXPORT
1439 #    else
1440 #      define Q_GUI_EXPORT Q_DECL_IMPORT
1441 #    endif
1442 #    if defined(QT_BUILD_SQL_LIB)
1443 #      define Q_SQL_EXPORT Q_DECL_EXPORT
1444 #    else
1445 #      define Q_SQL_EXPORT Q_DECL_IMPORT
1446 #    endif
1447 #    if defined(QT_BUILD_NETWORK_LIB)
1448 #      define Q_NETWORK_EXPORT Q_DECL_EXPORT
1449 #    else
1450 #      define Q_NETWORK_EXPORT Q_DECL_IMPORT
1451 #    endif
1452 #    if defined(QT_BUILD_SVG_LIB)
1453 #      define Q_SVG_EXPORT Q_DECL_EXPORT
1454 #    else
1455 #      define Q_SVG_EXPORT Q_DECL_IMPORT
1456 #    endif
1457 #    if defined(QT_BUILD_DECLARATIVE_LIB)
1458 #      define Q_DECLARATIVE_EXPORT Q_DECL_EXPORT
1459 #    else
1460 #      define Q_DECLARATIVE_EXPORT Q_DECL_IMPORT
1461 #    endif
1462 #    if defined(QT_BUILD_OPENGL_LIB)
1463 #      define Q_OPENGL_EXPORT Q_DECL_EXPORT
1464 #    else
1465 #      define Q_OPENGL_EXPORT Q_DECL_IMPORT
1466 #    endif
1467 #    if defined(QT_BUILD_MULTIMEDIA_LIB)
1468 #      define Q_MULTIMEDIA_EXPORT Q_DECL_EXPORT
1469 #    else
1470 #      define Q_MULTIMEDIA_EXPORT Q_DECL_IMPORT
1471 #    endif
1472 #    if defined(QT_BUILD_OPENVG_LIB)
1473 #      define Q_OPENVG_EXPORT Q_DECL_EXPORT
1474 #    else
1475 #      define Q_OPENVG_EXPORT Q_DECL_IMPORT
1476 #    endif
1477 #    if defined(QT_BUILD_XML_LIB)
1478 #      define Q_XML_EXPORT Q_DECL_EXPORT
1479 #    else
1480 #      define Q_XML_EXPORT Q_DECL_IMPORT
1481 #    endif
1482 #    if defined(QT_BUILD_XMLPATTERNS_LIB)
1483 #      define Q_XMLPATTERNS_EXPORT Q_DECL_EXPORT
1484 #    else
1485 #      define Q_XMLPATTERNS_EXPORT Q_DECL_IMPORT
1486 #    endif
1487 #    if defined(QT_BUILD_SCRIPT_LIB)
1488 #      define Q_SCRIPT_EXPORT Q_DECL_EXPORT
1489 #    else
1490 #      define Q_SCRIPT_EXPORT Q_DECL_IMPORT
1491 #    endif
1492 #    if defined(QT_BUILD_SCRIPTTOOLS_LIB)
1493 #      define Q_SCRIPTTOOLS_EXPORT Q_DECL_EXPORT
1494 #    else
1495 #      define Q_SCRIPTTOOLS_EXPORT Q_DECL_IMPORT
1496 #    endif
1497 #    if defined(QT_BUILD_CANVAS_LIB)
1498 #      define Q_CANVAS_EXPORT Q_DECL_EXPORT
1499 #    else
1500 #      define Q_CANVAS_EXPORT Q_DECL_IMPORT
1501 #    endif
1502 #    if defined(QT_BUILD_COMPAT_LIB)
1503 #      define Q_COMPAT_EXPORT Q_DECL_EXPORT
1504 #    else
1505 #      define Q_COMPAT_EXPORT Q_DECL_IMPORT
1506 #    endif
1507 #    if defined(QT_BUILD_DBUS_LIB)
1508 #      define Q_DBUS_EXPORT Q_DECL_EXPORT
1509 #    else
1510 #      define Q_DBUS_EXPORT Q_DECL_IMPORT
1511 #    endif
1512 #    define Q_TEMPLATEDLL
1513 #  elif defined(QT_DLL) /* use a Qt DLL library */
1514 #    define Q_CORE_EXPORT Q_DECL_IMPORT
1515 #    define Q_GUI_EXPORT Q_DECL_IMPORT
1516 #    define Q_SQL_EXPORT Q_DECL_IMPORT
1517 #    define Q_NETWORK_EXPORT Q_DECL_IMPORT
1518 #    define Q_SVG_EXPORT Q_DECL_IMPORT
1519 #    define Q_DECLARATIVE_EXPORT Q_DECL_IMPORT
1520 #    define Q_CANVAS_EXPORT Q_DECL_IMPORT
1521 #    define Q_OPENGL_EXPORT Q_DECL_IMPORT
1522 #    define Q_MULTIMEDIA_EXPORT Q_DECL_IMPORT
1523 #    define Q_OPENVG_EXPORT Q_DECL_IMPORT
1524 #    define Q_XML_EXPORT Q_DECL_IMPORT
1525 #    define Q_XMLPATTERNS_EXPORT Q_DECL_IMPORT
1526 #    define Q_SCRIPT_EXPORT Q_DECL_IMPORT
1527 #    define Q_SCRIPTTOOLS_EXPORT Q_DECL_IMPORT
1528 #    define Q_COMPAT_EXPORT Q_DECL_IMPORT
1529 #    define Q_DBUS_EXPORT Q_DECL_IMPORT
1530 #    define Q_TEMPLATEDLL
1531 #  endif
1532 #  define Q_NO_DECLARED_NOT_DEFINED
1533 #else
1534 #  if defined(Q_OS_LINUX) && defined(Q_CC_BOR)
1535 #    define Q_TEMPLATEDLL
1536 #    define Q_NO_DECLARED_NOT_DEFINED
1537 #  endif
1538 #  undef QT_MAKEDLL /* ignore these for other platforms */
1539 #  undef QT_DLL
1540 #endif
1541
1542 #if !defined(Q_CORE_EXPORT)
1543 #  if defined(QT_SHARED)
1544 #    define Q_CORE_EXPORT Q_DECL_EXPORT
1545 #    define Q_GUI_EXPORT Q_DECL_EXPORT
1546 #    define Q_SQL_EXPORT Q_DECL_EXPORT
1547 #    define Q_NETWORK_EXPORT Q_DECL_EXPORT
1548 #    define Q_SVG_EXPORT Q_DECL_EXPORT
1549 #    define Q_DECLARATIVE_EXPORT Q_DECL_EXPORT
1550 #    define Q_OPENGL_EXPORT Q_DECL_EXPORT
1551 #    define Q_MULTIMEDIA_EXPORT Q_DECL_EXPORT
1552 #    define Q_OPENVG_EXPORT Q_DECL_EXPORT
1553 #    define Q_XML_EXPORT Q_DECL_EXPORT
1554 #    define Q_XMLPATTERNS_EXPORT Q_DECL_EXPORT
1555 #    define Q_SCRIPT_EXPORT Q_DECL_EXPORT
1556 #    define Q_SCRIPTTOOLS_EXPORT Q_DECL_EXPORT
1557 #    define Q_COMPAT_EXPORT Q_DECL_EXPORT
1558 #    define Q_DBUS_EXPORT Q_DECL_EXPORT
1559 #  else
1560 #    define Q_CORE_EXPORT
1561 #    define Q_GUI_EXPORT
1562 #    define Q_SQL_EXPORT
1563 #    define Q_NETWORK_EXPORT
1564 #    define Q_SVG_EXPORT
1565 #    define Q_DECLARATIVE_EXPORT
1566 #    define Q_OPENGL_EXPORT
1567 #    define Q_MULTIMEDIA_EXPORT
1568 #    define Q_OPENVG_EXPORT
1569 #    define Q_XML_EXPORT
1570 #    define Q_XMLPATTERNS_EXPORT
1571 #    define Q_SCRIPT_EXPORT
1572 #    define Q_SCRIPTTOOLS_EXPORT
1573 #    define Q_COMPAT_EXPORT
1574 #    define Q_DBUS_EXPORT
1575 #  endif
1576 #endif
1577
1578 // Functions marked as Q_GUI_EXPORT_INLINE were exported and inlined by mistake.
1579 // Compilers like MinGW complain that the import attribute is ignored.
1580 #if defined(Q_CC_MINGW)
1581 #    if defined(QT_BUILD_CORE_LIB)
1582 #      define Q_CORE_EXPORT_INLINE Q_CORE_EXPORT inline
1583 #    else
1584 #      define Q_CORE_EXPORT_INLINE inline
1585 #    endif
1586 #    if defined(QT_BUILD_GUI_LIB)
1587 #      define Q_GUI_EXPORT_INLINE Q_GUI_EXPORT inline
1588 #    else
1589 #      define Q_GUI_EXPORT_INLINE inline
1590 #    endif
1591 #    if defined(QT_BUILD_COMPAT_LIB)
1592 #      define Q_COMPAT_EXPORT_INLINE Q_COMPAT_EXPORT inline
1593 #    else
1594 #      define Q_COMPAT_EXPORT_INLINE inline
1595 #    endif
1596 #elif defined(Q_CC_RVCT)
1597 // we force RVCT not to export inlines by passing --visibility_inlines_hidden
1598 // so we need to just inline it, rather than exporting and inlining
1599 // note: this affects the contents of the DEF files (ie. these functions do not appear)
1600 #    define Q_CORE_EXPORT_INLINE inline
1601 #    define Q_GUI_EXPORT_INLINE inline
1602 #    define Q_COMPAT_EXPORT_INLINE inline
1603 #else
1604 #    define Q_CORE_EXPORT_INLINE Q_CORE_EXPORT inline
1605 #    define Q_GUI_EXPORT_INLINE Q_GUI_EXPORT inline
1606 #    define Q_COMPAT_EXPORT_INLINE Q_COMPAT_EXPORT inline
1607 #endif
1608
1609 /*
1610    No, this is not an evil backdoor. QT_BUILD_INTERNAL just exports more symbols
1611    for Qt's internal unit tests. If you want slower loading times and more
1612    symbols that can vanish from version to version, feel free to define QT_BUILD_INTERNAL.
1613 */
1614 #if defined(QT_BUILD_INTERNAL) && (defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)) && defined(QT_MAKEDLL)
1615 #    define Q_AUTOTEST_EXPORT Q_DECL_EXPORT
1616 #elif defined(QT_BUILD_INTERNAL) && (defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)) && defined(QT_DLL)
1617 #    define Q_AUTOTEST_EXPORT Q_DECL_IMPORT
1618 #elif defined(QT_BUILD_INTERNAL) && !(defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)) && defined(QT_SHARED)
1619 #    define Q_AUTOTEST_EXPORT Q_DECL_EXPORT
1620 #else
1621 #    define Q_AUTOTEST_EXPORT
1622 #endif
1623
1624 inline void qt_noop(void) {}
1625
1626 /* These wrap try/catch so we can switch off exceptions later.
1627
1628    Beware - do not use more than one QT_CATCH per QT_TRY, and do not use
1629    the exception instance in the catch block.
1630    If you can't live with those constraints, don't use these macros.
1631    Use the QT_NO_EXCEPTIONS macro to protect your code instead.
1632 */
1633
1634 #ifdef QT_BOOTSTRAPPED
1635 #  define QT_NO_EXCEPTIONS
1636 #endif
1637 #if !defined(QT_NO_EXCEPTIONS) && defined(Q_CC_GNU) && !defined (__EXCEPTIONS) && !defined(Q_MOC_RUN)
1638 #  define QT_NO_EXCEPTIONS
1639 #endif
1640
1641 #ifdef QT_NO_EXCEPTIONS
1642 #  define QT_TRY if (true)
1643 #  define QT_CATCH(A) else
1644 #  define QT_THROW(A) qt_noop()
1645 #  define QT_RETHROW qt_noop()
1646 #else
1647 #  define QT_TRY try
1648 #  define QT_CATCH(A) catch (A)
1649 #  define QT_THROW(A) throw A
1650 #  define QT_RETHROW throw
1651 #endif
1652
1653 /*
1654    System information
1655 */
1656
1657 class QString;
1658 class Q_CORE_EXPORT QSysInfo {
1659 public:
1660     enum Sizes {
1661         WordSize = (sizeof(void *)<<3)
1662     };
1663
1664 #if defined(QT_BUILD_QMAKE)
1665     enum Endian {
1666         BigEndian,
1667         LittleEndian
1668     };
1669     /* needed to bootstrap qmake */
1670     static const int ByteOrder;
1671 #elif defined(Q_BYTE_ORDER)
1672     enum Endian {
1673         BigEndian,
1674         LittleEndian
1675
1676 #  ifdef qdoc
1677         , ByteOrder = <platform-dependent>
1678 #  elif Q_BYTE_ORDER == Q_BIG_ENDIAN
1679         , ByteOrder = BigEndian
1680 #  elif Q_BYTE_ORDER == Q_LITTLE_ENDIAN
1681         , ByteOrder = LittleEndian
1682 #  else
1683 #    error "Undefined byte order"
1684 #  endif
1685     };
1686 #else
1687 #  error "Qt not configured correctly, please run configure"
1688 #endif
1689 #if defined(Q_WS_WIN) || defined(Q_OS_CYGWIN)
1690     enum WinVersion {
1691         WV_32s      = 0x0001,
1692         WV_95       = 0x0002,
1693         WV_98       = 0x0003,
1694         WV_Me       = 0x0004,
1695         WV_DOS_based= 0x000f,
1696
1697         /* codenames */
1698         WV_NT       = 0x0010,
1699         WV_2000     = 0x0020,
1700         WV_XP       = 0x0030,
1701         WV_2003     = 0x0040,
1702         WV_VISTA    = 0x0080,
1703         WV_WINDOWS7 = 0x0090,
1704         WV_WINDOWS8 = 0x00a0,
1705         WV_WINDOWS8_1 = 0x00b0,
1706         WV_NT_based = 0x00f0,
1707
1708         /* version numbers */
1709         WV_4_0      = WV_NT,
1710         WV_5_0      = WV_2000,
1711         WV_5_1      = WV_XP,
1712         WV_5_2      = WV_2003,
1713         WV_6_0      = WV_VISTA,
1714         WV_6_1      = WV_WINDOWS7,
1715         WV_6_2      = WV_WINDOWS8,
1716         WV_6_3      = WV_WINDOWS8_1,
1717
1718         WV_CE       = 0x0100,
1719         WV_CENET    = 0x0200,
1720         WV_CE_5     = 0x0300,
1721         WV_CE_6     = 0x0400,
1722         WV_CE_based = 0x0f00
1723     };
1724     static const WinVersion WindowsVersion;
1725     static WinVersion windowsVersion();
1726
1727 #endif
1728 #ifdef Q_OS_MAC
1729     enum MacVersion {
1730         MV_Unknown = 0x0000,
1731
1732         /* version */
1733         MV_9 = 0x0001,
1734         MV_10_0 = 0x0002,
1735         MV_10_1 = 0x0003,
1736         MV_10_2 = 0x0004,
1737         MV_10_3 = 0x0005,
1738         MV_10_4 = 0x0006,
1739         MV_10_5 = 0x0007,
1740         MV_10_6 = 0x0008,
1741         MV_10_7 = 0x0009,
1742         MV_10_8 = 0x000A,
1743         MV_10_9 = 0x000B,
1744         MV_10_10 = 0x000C,
1745
1746         /* codenames */
1747         MV_CHEETAH = MV_10_0,
1748         MV_PUMA = MV_10_1,
1749         MV_JAGUAR = MV_10_2,
1750         MV_PANTHER = MV_10_3,
1751         MV_TIGER = MV_10_4,
1752         MV_LEOPARD = MV_10_5,
1753         MV_SNOWLEOPARD = MV_10_6,
1754         MV_LION = MV_10_7,
1755         MV_MOUNTAINLION = MV_10_8,
1756         MV_MAVERICKS = MV_10_9,
1757         MV_YOSEMITE = MV_10_10
1758     };
1759     static const MacVersion MacintoshVersion;
1760 #endif
1761 #ifdef Q_OS_SYMBIAN
1762     enum SymbianVersion {
1763         SV_Unknown = 1000000, // Assume unknown is something newer than what is supported
1764         //These are the Symbian Ltd versions 9.2-9.4
1765         SV_9_2 = 10,
1766         SV_9_3 = 20,
1767         SV_9_4 = 30,
1768         //Following values are the symbian foundation versions, i.e. Symbian^1 == SV_SF_1
1769         SV_SF_1 = SV_9_4,
1770         SV_SF_2 = 40,
1771         SV_SF_3 = 50,
1772         SV_SF_4 = 60,  // Deprecated
1773         SV_API_5_3 = 70,
1774         SV_API_5_4 = 80,
1775         SV_API_5_5 = 90
1776     };
1777     static SymbianVersion symbianVersion();
1778     enum S60Version {
1779         SV_S60_None = 0,
1780         SV_S60_Unknown = SV_Unknown,
1781         SV_S60_3_1 = SV_9_2,
1782         SV_S60_3_2 = SV_9_3,
1783         SV_S60_5_0 = SV_9_4,
1784         SV_S60_5_1 = SV_SF_2,  // Deprecated
1785         SV_S60_5_2 = SV_SF_3,
1786         SV_S60_5_3 = SV_API_5_3,
1787         SV_S60_5_4 = SV_API_5_4,
1788         SV_S60_5_5 = SV_API_5_5
1789     };
1790     static S60Version s60Version();
1791 #endif
1792 };
1793
1794 Q_CORE_EXPORT const char *qVersion();
1795 Q_CORE_EXPORT bool qSharedBuild();
1796
1797 #if defined(Q_OS_MAC)
1798 inline int qMacVersion() { return QSysInfo::MacintoshVersion; }
1799 #endif
1800
1801 #ifdef QT3_SUPPORT
1802 inline QT3_SUPPORT bool qSysInfo(int *wordSize, bool *bigEndian)
1803 {
1804     *wordSize = QSysInfo::WordSize;
1805     *bigEndian = (QSysInfo::ByteOrder == QSysInfo::BigEndian);
1806     return true;
1807 }
1808 #endif
1809
1810 #if defined(Q_WS_WIN) || defined(Q_OS_CYGWIN)
1811 #if defined(QT3_SUPPORT)
1812 inline QT3_SUPPORT bool qt_winUnicode() { return true; }
1813 inline QT3_SUPPORT int qWinVersion() { return QSysInfo::WindowsVersion; }
1814 #endif
1815
1816 // ### Qt 5: remove Win9x support macros QT_WA and QT_WA_INLINE.
1817 #define QT_WA(unicode, ansi) unicode
1818 #define QT_WA_INLINE(unicode, ansi) (unicode)
1819
1820 #endif /* Q_WS_WIN */
1821
1822 #ifndef Q_OUTOFLINE_TEMPLATE
1823 #  define Q_OUTOFLINE_TEMPLATE
1824 #endif
1825 #ifndef Q_INLINE_TEMPLATE
1826 #  define Q_INLINE_TEMPLATE inline
1827 #endif
1828
1829 #ifndef Q_TYPENAME
1830 #  define Q_TYPENAME typename
1831 #endif
1832
1833 /*
1834    Avoid "unused parameter" warnings
1835 */
1836
1837 #if defined(Q_CC_RVCT)
1838 template <typename T>
1839 inline void qUnused(T &x) { (void)x; }
1840 #  define Q_UNUSED(x) qUnused(x);
1841 #else
1842 #  define Q_UNUSED(x) (void)x;
1843 #endif
1844
1845 /*
1846    Debugging and error handling
1847 */
1848
1849 /*
1850    On Symbian we do not know beforehand whether we are compiling in
1851    release or debug mode, so check the Symbian build define here,
1852    and set the QT_NO_DEBUG define appropriately.
1853 */
1854 #if defined(Q_OS_SYMBIAN) && defined(NDEBUG) && !defined(QT_NO_DEBUG)
1855 #  define QT_NO_DEBUG
1856 #endif
1857
1858 #if !defined(QT_NO_DEBUG) && !defined(QT_DEBUG)
1859 #  define QT_DEBUG
1860 #endif
1861
1862 #ifndef qPrintable
1863 #  define qPrintable(string) QString(string).toLocal8Bit().constData()
1864 #endif
1865
1866 Q_CORE_EXPORT void qDebug(const char *, ...) /* print debug message */
1867 #if defined(Q_CC_GNU) && !defined(__INSURE__)
1868     __attribute__ ((format (printf, 1, 2)))
1869 #endif
1870 ;
1871
1872 Q_CORE_EXPORT void qWarning(const char *, ...) /* print warning message */
1873 #if defined(Q_CC_GNU) && !defined(__INSURE__)
1874     __attribute__ ((format (printf, 1, 2)))
1875 #endif
1876 ;
1877
1878 class QString;
1879 Q_CORE_EXPORT QString qt_error_string(int errorCode = -1);
1880 Q_CORE_EXPORT void qCritical(const char *, ...) /* print critical message */
1881 #if defined(Q_CC_GNU) && !defined(__INSURE__)
1882     __attribute__ ((format (printf, 1, 2)))
1883 #endif
1884 ;
1885 Q_CORE_EXPORT void qFatal(const char *, ...) /* print fatal message and exit */
1886 #if defined(Q_CC_GNU) && !defined(__INSURE__)
1887     __attribute__ ((format (printf, 1, 2)))
1888 #endif
1889 ;
1890
1891 #ifdef QT3_SUPPORT
1892 Q_CORE_EXPORT QT3_SUPPORT void qSystemWarning(const char *msg, int code = -1);
1893 #endif /* QT3_SUPPORT */
1894 Q_CORE_EXPORT void qErrnoWarning(int code, const char *msg, ...);
1895 Q_CORE_EXPORT void qErrnoWarning(const char *msg, ...);
1896
1897 #if (defined(QT_NO_DEBUG_OUTPUT) || defined(QT_NO_TEXTSTREAM)) && !defined(QT_NO_DEBUG_STREAM)
1898 #define QT_NO_DEBUG_STREAM
1899 #endif
1900
1901 /*
1902   Forward declarations only.
1903
1904   In order to use the qDebug() stream, you must #include<QDebug>
1905 */
1906 class QDebug;
1907 class QNoDebug;
1908 #ifndef QT_NO_DEBUG_STREAM
1909 Q_CORE_EXPORT_INLINE QDebug qDebug();
1910 #ifndef QT_NO_WARNING_OUTPUT
1911 Q_CORE_EXPORT_INLINE QDebug qWarning();
1912 #endif
1913 Q_CORE_EXPORT_INLINE QDebug qCritical();
1914 #else
1915 inline QNoDebug qDebug();
1916 #endif
1917
1918 #ifdef QT_NO_WARNING_OUTPUT
1919 inline QNoDebug qWarning();
1920 #endif
1921
1922 #define QT_NO_QDEBUG_MACRO while (false) qDebug
1923 #ifdef QT_NO_DEBUG_OUTPUT
1924 #  define qDebug QT_NO_QDEBUG_MACRO
1925 #endif
1926 #define QT_NO_QWARNING_MACRO while (false) qWarning
1927 #ifdef QT_NO_WARNING_OUTPUT
1928 #  define qWarning QT_NO_QWARNING_MACRO
1929 #endif
1930
1931
1932 Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line);
1933
1934 #if !defined(Q_ASSERT)
1935 #  ifndef QT_NO_DEBUG
1936 #    define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop())
1937 #  else
1938 #    define Q_ASSERT(cond) qt_noop()
1939 #  endif
1940 #endif
1941
1942 #if defined(QT_NO_DEBUG) && !defined(QT_PAINT_DEBUG)
1943 #define QT_NO_PAINT_DEBUG
1944 #endif
1945
1946 Q_CORE_EXPORT void qt_assert_x(const char *where, const char *what, const char *file, int line);
1947
1948 #if !defined(Q_ASSERT_X)
1949 #  ifndef QT_NO_DEBUG
1950 #    define Q_ASSERT_X(cond, where, what) ((!(cond)) ? qt_assert_x(where, what,__FILE__,__LINE__) : qt_noop())
1951 #  else
1952 #    define Q_ASSERT_X(cond, where, what) qt_noop()
1953 #  endif
1954 #endif
1955
1956 Q_CORE_EXPORT void qt_check_pointer(const char *, int);
1957 Q_CORE_EXPORT void qBadAlloc();
1958
1959 #ifdef QT_NO_EXCEPTIONS
1960 #  if defined(QT_NO_DEBUG)
1961 #    define Q_CHECK_PTR(p) qt_noop()
1962 #  else
1963 #    define Q_CHECK_PTR(p) do {if(!(p))qt_check_pointer(__FILE__,__LINE__);} while (0)
1964 #  endif
1965 #else
1966 #  define Q_CHECK_PTR(p) do { if (!(p)) qBadAlloc(); } while (0)
1967 #endif
1968
1969 template <typename T>
1970 inline T *q_check_ptr(T *p) { Q_CHECK_PTR(p); return p; }
1971
1972 #if (defined(Q_CC_GNU) && !defined(Q_OS_SOLARIS)) || defined(Q_CC_HPACC) || defined(Q_CC_DIAB)
1973 #  define Q_FUNC_INFO __PRETTY_FUNCTION__
1974 #elif defined(_MSC_VER)
1975 #  define Q_FUNC_INFO __FUNCSIG__
1976 #else
1977 #   if defined(Q_OS_SOLARIS) || defined(Q_CC_XLC) || defined(Q_OS_SYMBIAN) || defined(Q_OS_INTEGRITY)
1978 #      define Q_FUNC_INFO __FILE__ "(line number unavailable)"
1979 #   else
1980         /* These two macros makes it possible to turn the builtin line expander into a
1981          * string literal. */
1982 #       define QT_STRINGIFY2(x) #x
1983 #       define QT_STRINGIFY(x) QT_STRINGIFY2(x)
1984 #       define Q_FUNC_INFO __FILE__ ":" QT_STRINGIFY(__LINE__)
1985 #   endif
1986     /* The MIPSpro and RVCT compilers postpones macro expansion,
1987        and therefore macros must be in scope when being used. */
1988 #   if !defined(Q_CC_MIPS) && !defined(Q_CC_RVCT) && !defined(Q_CC_NOKIAX86)
1989 #       undef QT_STRINGIFY2
1990 #       undef QT_STRINGIFY
1991 #   endif
1992 #endif
1993
1994 enum QtMsgType { QtDebugMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg, QtSystemMsg = QtCriticalMsg };
1995
1996 Q_CORE_EXPORT void qt_message_output(QtMsgType, const char *buf);
1997
1998 typedef void (*QtMsgHandler)(QtMsgType, const char *);
1999 Q_CORE_EXPORT QtMsgHandler qInstallMsgHandler(QtMsgHandler);
2000
2001 #ifdef QT3_SUPPORT
2002 inline QT3_SUPPORT void qSuppressObsoleteWarnings(bool = true) {}
2003 inline QT3_SUPPORT void qObsolete(const char *, const char * = 0, const char * = 0) {}
2004 #endif
2005
2006 #if defined(QT_NO_THREAD)
2007
2008 template <typename T>
2009 class QGlobalStatic
2010 {
2011 public:
2012     T *pointer;
2013     inline QGlobalStatic(T *p) : pointer(p) { }
2014     inline ~QGlobalStatic() { pointer = 0; }
2015 };
2016
2017 #define Q_GLOBAL_STATIC(TYPE, NAME)                                  \
2018     static TYPE *NAME()                                              \
2019     {                                                                \
2020         static TYPE thisVariable;                                    \
2021         static QGlobalStatic<TYPE > thisGlobalStatic(&thisVariable); \
2022         return thisGlobalStatic.pointer;                             \
2023     }
2024
2025 #define Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS)                  \
2026     static TYPE *NAME()                                              \
2027     {                                                                \
2028         static TYPE thisVariable ARGS;                               \
2029         static QGlobalStatic<TYPE > thisGlobalStatic(&thisVariable); \
2030         return thisGlobalStatic.pointer;                             \
2031     }
2032
2033 #define Q_GLOBAL_STATIC_WITH_INITIALIZER(TYPE, NAME, INITIALIZER)    \
2034     static TYPE *NAME()                                              \
2035     {                                                                \
2036         static TYPE thisVariable;                                    \
2037         static QGlobalStatic<TYPE > thisGlobalStatic(0);             \
2038         if (!thisGlobalStatic.pointer) {                             \
2039             TYPE *x = thisGlobalStatic.pointer = &thisVariable;      \
2040             INITIALIZER;                                             \
2041         }                                                            \
2042         return thisGlobalStatic.pointer;                             \
2043     }
2044
2045 #else
2046
2047 // forward declaration, since qatomic.h needs qglobal.h
2048 template <typename T> class QBasicAtomicPointer;
2049
2050 // POD for Q_GLOBAL_STATIC
2051 template <typename T>
2052 class QGlobalStatic
2053 {
2054 public:
2055     QBasicAtomicPointer<T> pointer;
2056     bool destroyed;
2057 };
2058
2059 // Created as a function-local static to delete a QGlobalStatic<T>
2060 template <typename T>
2061 class QGlobalStaticDeleter
2062 {
2063 public:
2064     QGlobalStatic<T> &globalStatic;
2065     QGlobalStaticDeleter(QGlobalStatic<T> &_globalStatic)
2066         : globalStatic(_globalStatic)
2067     { }
2068
2069     inline ~QGlobalStaticDeleter()
2070     {
2071         delete globalStatic.pointer;
2072         globalStatic.pointer = 0;
2073         globalStatic.destroyed = true;
2074     }
2075 };
2076
2077 #define Q_GLOBAL_STATIC_INIT(TYPE, NAME)                                      \
2078         static QGlobalStatic<TYPE > this_ ## NAME                             \
2079                             = { Q_BASIC_ATOMIC_INITIALIZER(0), false }
2080
2081 #define Q_GLOBAL_STATIC(TYPE, NAME)                                           \
2082     static TYPE *NAME()                                                       \
2083     {                                                                         \
2084         Q_GLOBAL_STATIC_INIT(TYPE, _StaticVar_);                              \
2085         if (!this__StaticVar_.pointer && !this__StaticVar_.destroyed) {       \
2086             TYPE *x = new TYPE;                                               \
2087             if (!this__StaticVar_.pointer.testAndSetOrdered(0, x))            \
2088                 delete x;                                                     \
2089             else                                                              \
2090                 static QGlobalStaticDeleter<TYPE > cleanup(this__StaticVar_); \
2091         }                                                                     \
2092         return this__StaticVar_.pointer;                                      \
2093     }
2094
2095 #define Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS)                           \
2096     static TYPE *NAME()                                                       \
2097     {                                                                         \
2098         Q_GLOBAL_STATIC_INIT(TYPE, _StaticVar_);                              \
2099         if (!this__StaticVar_.pointer && !this__StaticVar_.destroyed) {       \
2100             TYPE *x = new TYPE ARGS;                                          \
2101             if (!this__StaticVar_.pointer.testAndSetOrdered(0, x))            \
2102                 delete x;                                                     \
2103             else                                                              \
2104                 static QGlobalStaticDeleter<TYPE > cleanup(this__StaticVar_); \
2105         }                                                                     \
2106         return this__StaticVar_.pointer;                                      \
2107     }
2108
2109 #define Q_GLOBAL_STATIC_WITH_INITIALIZER(TYPE, NAME, INITIALIZER)             \
2110     static TYPE *NAME()                                                       \
2111     {                                                                         \
2112         Q_GLOBAL_STATIC_INIT(TYPE, _StaticVar_);                              \
2113         if (!this__StaticVar_.pointer && !this__StaticVar_.destroyed) {       \
2114             QScopedPointer<TYPE > x(new TYPE);                                \
2115             INITIALIZER;                                                      \
2116             if (this__StaticVar_.pointer.testAndSetOrdered(0, x.data())) {    \
2117                 static QGlobalStaticDeleter<TYPE > cleanup(this__StaticVar_); \
2118                 x.take();                                                     \
2119             }                                                                 \
2120         }                                                                     \
2121         return this__StaticVar_.pointer;                                      \
2122     }
2123
2124 #endif
2125
2126 class QBool
2127 {
2128     bool b;
2129
2130 public:
2131     inline explicit QBool(bool B) : b(B) {}
2132     inline operator const void *() const
2133     { return b ? static_cast<const void *>(this) : static_cast<const void *>(0); }
2134 };
2135
2136 inline bool operator==(QBool b1, bool b2) { return !b1 == !b2; }
2137 inline bool operator==(bool b1, QBool b2) { return !b1 == !b2; }
2138 inline bool operator==(QBool b1, QBool b2) { return !b1 == !b2; }
2139 inline bool operator!=(QBool b1, bool b2) { return !b1 != !b2; }
2140 inline bool operator!=(bool b1, QBool b2) { return !b1 != !b2; }
2141 inline bool operator!=(QBool b1, QBool b2) { return !b1 != !b2; }
2142
2143 Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2)
2144 {
2145     return (qAbs(p1 - p2) <= 0.000000000001 * qMin(qAbs(p1), qAbs(p2)));
2146 }
2147
2148 Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2)
2149 {
2150     return (qAbs(p1 - p2) <= 0.00001f * qMin(qAbs(p1), qAbs(p2)));
2151 }
2152
2153 /*!
2154   \internal
2155 */
2156 Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d)
2157 {
2158     return qAbs(d) <= 0.000000000001;
2159 }
2160
2161 /*!
2162   \internal
2163 */
2164 Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f)
2165 {
2166     return qAbs(f) <= 0.00001f;
2167 }
2168
2169 /*
2170    This function tests a double for a null value. It doesn't
2171    check whether the actual value is 0 or close to 0, but whether
2172    it is binary 0.
2173 */
2174 static inline bool qIsNull(double d)
2175 {
2176     union U {
2177         double d;
2178         quint64 u;
2179     };
2180     U val;
2181     val.d = d;
2182     return val.u == quint64(0);
2183 }
2184
2185 /*
2186    This function tests a float for a null value. It doesn't
2187    check whether the actual value is 0 or close to 0, but whether
2188    it is binary 0.
2189 */
2190 static inline bool qIsNull(float f)
2191 {
2192     union U {
2193         float f;
2194         quint32 u;
2195     };
2196     U val;
2197     val.f = f;
2198     return val.u == 0u;
2199 }
2200
2201 /*
2202    Compilers which follow outdated template instantiation rules
2203    require a class to have a comparison operator to exist when
2204    a QList of this type is instantiated. It's not actually
2205    used in the list, though. Hence the dummy implementation.
2206    Just in case other code relies on it we better trigger a warning
2207    mandating a real implementation.
2208 */
2209
2210 #ifdef Q_FULL_TEMPLATE_INSTANTIATION
2211 #  define Q_DUMMY_COMPARISON_OPERATOR(C) \
2212     bool operator==(const C&) const { \
2213         qWarning(#C"::operator==(const "#C"&) was called"); \
2214         return false; \
2215     }
2216 #else
2217 #  define Q_DUMMY_COMPARISON_OPERATOR(C)
2218 #endif
2219
2220
2221 /*
2222    QTypeInfo     - type trait functionality
2223    qIsDetached   - data sharing functionality
2224 */
2225
2226 /*
2227   The catch-all template.
2228 */
2229
2230 template <typename T> inline bool qIsDetached(T &) { return true; }
2231
2232 template <typename T>
2233 class QTypeInfo
2234 {
2235 public:
2236     enum {
2237         isPointer = false,
2238         isComplex = true,
2239         isStatic = true,
2240         isLarge = (sizeof(T)>sizeof(void*)),
2241         isDummy = false
2242     };
2243 };
2244
2245 template <typename T>
2246 class QTypeInfo<T*>
2247 {
2248 public:
2249     enum {
2250         isPointer = true,
2251         isComplex = false,
2252         isStatic = false,
2253         isLarge = false,
2254         isDummy = false
2255     };
2256 };
2257
2258 /*
2259    Specialize a specific type with:
2260
2261      Q_DECLARE_TYPEINFO(type, flags);
2262
2263    where 'type' is the name of the type to specialize and 'flags' is
2264    logically-OR'ed combination of the flags below.
2265 */
2266 enum { /* TYPEINFO flags */
2267     Q_COMPLEX_TYPE = 0,
2268     Q_PRIMITIVE_TYPE = 0x1,
2269     Q_STATIC_TYPE = 0,
2270     Q_MOVABLE_TYPE = 0x2,
2271     Q_DUMMY_TYPE = 0x4
2272 };
2273
2274 #define Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS) \
2275 class QTypeInfo<TYPE > \
2276 { \
2277 public: \
2278     enum { \
2279         isComplex = (((FLAGS) & Q_PRIMITIVE_TYPE) == 0), \
2280         isStatic = (((FLAGS) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), \
2281         isLarge = (sizeof(TYPE)>sizeof(void*)), \
2282         isPointer = false, \
2283         isDummy = (((FLAGS) & Q_DUMMY_TYPE) != 0) \
2284     }; \
2285     static inline const char *name() { return #TYPE; } \
2286 }
2287
2288 #define Q_DECLARE_TYPEINFO(TYPE, FLAGS) \
2289 template<> \
2290 Q_DECLARE_TYPEINFO_BODY(TYPE, FLAGS)
2291
2292
2293 template <typename T>
2294 inline void qSwap(T &value1, T &value2)
2295 {
2296 #ifdef QT_NO_STL
2297     const T t = value1;
2298     value1 = value2;
2299     value2 = t;
2300 #else
2301     using std::swap;
2302     swap(value1, value2);
2303 #endif
2304 }
2305
2306 /*
2307    Specialize a shared type with:
2308
2309      Q_DECLARE_SHARED(type);
2310
2311    where 'type' is the name of the type to specialize.  NOTE: shared
2312    types must declare a 'bool isDetached(void) const;' member for this
2313    to work.
2314 */
2315 #ifdef QT_NO_STL
2316 #define Q_DECLARE_SHARED_STL(TYPE)
2317 #else
2318 #define Q_DECLARE_SHARED_STL(TYPE) \
2319 QT_END_NAMESPACE \
2320 namespace std { \
2321     template<> inline void swap<QT_PREPEND_NAMESPACE(TYPE)>(QT_PREPEND_NAMESPACE(TYPE) &value1, QT_PREPEND_NAMESPACE(TYPE) &value2) \
2322     { swap(value1.data_ptr(), value2.data_ptr()); } \
2323 } \
2324 QT_BEGIN_NAMESPACE
2325 #endif
2326
2327 #define Q_DECLARE_SHARED(TYPE)                                          \
2328 template <> inline bool qIsDetached<TYPE>(TYPE &t) { return t.isDetached(); } \
2329 template <> inline void qSwap<TYPE>(TYPE &value1, TYPE &value2) \
2330 { qSwap(value1.data_ptr(), value2.data_ptr()); } \
2331 Q_DECLARE_SHARED_STL(TYPE)
2332
2333 /*
2334    QTypeInfo primitive specializations
2335 */
2336 Q_DECLARE_TYPEINFO(bool, Q_PRIMITIVE_TYPE);
2337 Q_DECLARE_TYPEINFO(char, Q_PRIMITIVE_TYPE);
2338 Q_DECLARE_TYPEINFO(signed char, Q_PRIMITIVE_TYPE);
2339 Q_DECLARE_TYPEINFO(uchar, Q_PRIMITIVE_TYPE);
2340 Q_DECLARE_TYPEINFO(short, Q_PRIMITIVE_TYPE);
2341 Q_DECLARE_TYPEINFO(ushort, Q_PRIMITIVE_TYPE);
2342 Q_DECLARE_TYPEINFO(int, Q_PRIMITIVE_TYPE);
2343 Q_DECLARE_TYPEINFO(uint, Q_PRIMITIVE_TYPE);
2344 Q_DECLARE_TYPEINFO(long, Q_PRIMITIVE_TYPE);
2345 Q_DECLARE_TYPEINFO(ulong, Q_PRIMITIVE_TYPE);
2346 Q_DECLARE_TYPEINFO(qint64, Q_PRIMITIVE_TYPE);
2347 Q_DECLARE_TYPEINFO(quint64, Q_PRIMITIVE_TYPE);
2348 Q_DECLARE_TYPEINFO(float, Q_PRIMITIVE_TYPE);
2349 Q_DECLARE_TYPEINFO(double, Q_PRIMITIVE_TYPE);
2350 #ifndef Q_OS_DARWIN
2351 Q_DECLARE_TYPEINFO(long double, Q_PRIMITIVE_TYPE);
2352 #endif
2353
2354 /*
2355    These functions make it possible to use standard C++ functions with
2356    a similar name from Qt header files (especially template classes).
2357 */
2358 Q_CORE_EXPORT void *qMalloc(size_t size);
2359 Q_CORE_EXPORT void qFree(void *ptr);
2360 Q_CORE_EXPORT void *qRealloc(void *ptr, size_t size);
2361 Q_CORE_EXPORT void *qMallocAligned(size_t size, size_t alignment);
2362 Q_CORE_EXPORT void *qReallocAligned(void *ptr, size_t size, size_t oldsize, size_t alignment);
2363 Q_CORE_EXPORT void qFreeAligned(void *ptr);
2364 Q_CORE_EXPORT void *qMemCopy(void *dest, const void *src, size_t n);
2365 Q_CORE_EXPORT void *qMemSet(void *dest, int c, size_t n);
2366
2367
2368 /*
2369    Avoid some particularly useless warnings from some stupid compilers.
2370    To get ALL C++ compiler warnings, define QT_CC_WARNINGS or comment out
2371    the line "#define QT_NO_WARNINGS".
2372 */
2373 #if !defined(QT_CC_WARNINGS)
2374 #  define QT_NO_WARNINGS
2375 #endif
2376 #if defined(QT_NO_WARNINGS)
2377 #  if defined(Q_CC_MSVC)
2378 #    pragma warning(disable: 4251) /* class 'A' needs to have dll interface for to be used by clients of class 'B'. */
2379 #    pragma warning(disable: 4244) /* 'conversion' conversion from 'type1' to 'type2', possible loss of data */
2380 #    pragma warning(disable: 4275) /* non - DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier' */
2381 #    pragma warning(disable: 4514) /* unreferenced inline/local function has been removed */
2382 #    pragma warning(disable: 4800) /* 'type' : forcing value to bool 'true' or 'false' (performance warning) */
2383 #    pragma warning(disable: 4097) /* typedef-name 'identifier1' used as synonym for class-name 'identifier2' */
2384 #    pragma warning(disable: 4706) /* assignment within conditional expression */
2385 #    pragma warning(disable: 4786) /* truncating debug info after 255 characters */
2386 #    pragma warning(disable: 4660) /* template-class specialization 'identifier' is already instantiated */
2387 #    pragma warning(disable: 4355) /* 'this' : used in base member initializer list */
2388 #    pragma warning(disable: 4231) /* nonstandard extension used : 'extern' before template explicit instantiation */
2389 #    pragma warning(disable: 4710) /* function not inlined */
2390 #    pragma warning(disable: 4530) /* C++ exception handler used, but unwind semantics are not enabled. Specify -GX */
2391 #  elif defined(Q_CC_BOR)
2392 #    pragma option -w-inl
2393 #    pragma option -w-aus
2394 #    pragma warn -inl
2395 #    pragma warn -pia
2396 #    pragma warn -ccc
2397 #    pragma warn -rch
2398 #    pragma warn -sig
2399 #  endif
2400 #endif
2401
2402 class Q_CORE_EXPORT QFlag
2403 {
2404     int i;
2405 public:
2406     inline QFlag(int i);
2407     inline operator int() const { return i; }
2408 };
2409
2410 inline QFlag::QFlag(int ai) : i(ai) {}
2411
2412 class Q_CORE_EXPORT QIncompatibleFlag
2413 {
2414     int i;
2415 public:
2416     inline explicit QIncompatibleFlag(int i);
2417     inline operator int() const { return i; }
2418 };
2419
2420 inline QIncompatibleFlag::QIncompatibleFlag(int ai) : i(ai) {}
2421
2422
2423 #ifndef Q_NO_TYPESAFE_FLAGS
2424
2425 template<typename Enum>
2426 class QFlags
2427 {
2428     typedef void **Zero;
2429     int i;
2430 public:
2431     typedef Enum enum_type;
2432     Q_DECL_CONSTEXPR inline QFlags(const QFlags &f) : i(f.i) {}
2433     Q_DECL_CONSTEXPR inline QFlags(Enum f) : i(f) {}
2434     Q_DECL_CONSTEXPR inline QFlags(Zero = 0) : i(0) {}
2435     inline QFlags(QFlag f) : i(f) {}
2436
2437     inline QFlags &operator=(const QFlags &f) { i = f.i; return *this; }
2438     inline QFlags &operator&=(int mask) { i &= mask; return *this; }
2439     inline QFlags &operator&=(uint mask) { i &= mask; return *this; }
2440     inline QFlags &operator|=(QFlags f) { i |= f.i; return *this; }
2441     inline QFlags &operator|=(Enum f) { i |= f; return *this; }
2442     inline QFlags &operator^=(QFlags f) { i ^= f.i; return *this; }
2443     inline QFlags &operator^=(Enum f) { i ^= f; return *this; }
2444
2445     Q_DECL_CONSTEXPR  inline operator int() const { return i; }
2446
2447     Q_DECL_CONSTEXPR inline QFlags operator|(QFlags f) const { return QFlags(Enum(i | f.i)); }
2448     Q_DECL_CONSTEXPR inline QFlags operator|(Enum f) const { return QFlags(Enum(i | f)); }
2449     Q_DECL_CONSTEXPR inline QFlags operator^(QFlags f) const { return QFlags(Enum(i ^ f.i)); }
2450     Q_DECL_CONSTEXPR inline QFlags operator^(Enum f) const { return QFlags(Enum(i ^ f)); }
2451     Q_DECL_CONSTEXPR inline QFlags operator&(int mask) const { return QFlags(Enum(i & mask)); }
2452     Q_DECL_CONSTEXPR inline QFlags operator&(uint mask) const { return QFlags(Enum(i & mask)); }
2453     Q_DECL_CONSTEXPR inline QFlags operator&(Enum f) const { return QFlags(Enum(i & f)); }
2454     Q_DECL_CONSTEXPR inline QFlags operator~() const { return QFlags(Enum(~i)); }
2455
2456     Q_DECL_CONSTEXPR inline bool operator!() const { return !i; }
2457
2458     inline bool testFlag(Enum f) const { return (i & f) == f && (f != 0 || i == int(f) ); }
2459 };
2460
2461 #define Q_DECLARE_FLAGS(Flags, Enum)\
2462 typedef QFlags<Enum> Flags;
2463
2464 #define Q_DECLARE_INCOMPATIBLE_FLAGS(Flags) \
2465 inline QIncompatibleFlag operator|(Flags::enum_type f1, int f2) \
2466 { return QIncompatibleFlag(int(f1) | f2); }
2467
2468 #define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags) \
2469 Q_DECL_CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, Flags::enum_type f2) \
2470 { return QFlags<Flags::enum_type>(f1) | f2; } \
2471 Q_DECL_CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, QFlags<Flags::enum_type> f2) \
2472 { return f2 | f1; } Q_DECLARE_INCOMPATIBLE_FLAGS(Flags)
2473
2474
2475 #else /* Q_NO_TYPESAFE_FLAGS */
2476
2477 #define Q_DECLARE_FLAGS(Flags, Enum)\
2478 typedef uint Flags;
2479 #define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
2480
2481 #endif /* Q_NO_TYPESAFE_FLAGS */
2482
2483 #if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_RVCT)
2484 /* make use of typeof-extension */
2485 template <typename T>
2486 class QForeachContainer {
2487 public:
2488     inline QForeachContainer(const T& t) : c(t), brk(0), i(c.begin()), e(c.end()) { }
2489     const T c;
2490     int brk;
2491     typename T::const_iterator i, e;
2492 };
2493
2494 #define Q_FOREACH(variable, container)                                \
2495 for (QForeachContainer<__typeof__(container)> _container_(container); \
2496      !_container_.brk && _container_.i != _container_.e;              \
2497      __extension__  ({ ++_container_.brk; ++_container_.i; }))                       \
2498     for (variable = *_container_.i;; __extension__ ({--_container_.brk; break;}))
2499
2500 #else
2501
2502 struct QForeachContainerBase {};
2503
2504 template <typename T>
2505 class QForeachContainer : public QForeachContainerBase {
2506 public:
2507     inline QForeachContainer(const T& t): c(t), brk(0), i(c.begin()), e(c.end()){};
2508     const T c;
2509     mutable int brk;
2510     mutable typename T::const_iterator i, e;
2511     inline bool condition() const { return (!brk++ && i != e); }
2512 };
2513
2514 template <typename T> inline T *qForeachPointer(const T &) { return 0; }
2515
2516 template <typename T> inline QForeachContainer<T> qForeachContainerNew(const T& t)
2517 { return QForeachContainer<T>(t); }
2518
2519 template <typename T>
2520 inline const QForeachContainer<T> *qForeachContainer(const QForeachContainerBase *base, const T *)
2521 { return static_cast<const QForeachContainer<T> *>(base); }
2522
2523 #if defined(Q_CC_MIPS)
2524 /*
2525    Proper for-scoping in MIPSpro CC
2526 */
2527 #  define Q_FOREACH(variable,container)                                                             \
2528     if(0){}else                                                                                     \
2529     for (const QForeachContainerBase &_container_ = qForeachContainerNew(container);                \
2530          qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->condition();       \
2531          ++qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->i)               \
2532         for (variable = *qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->i; \
2533              qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->brk;           \
2534              --qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->brk)
2535
2536 #elif defined(Q_CC_DIAB)
2537 // VxWorks DIAB generates unresolvable symbols, if container is a function call
2538 #  define Q_FOREACH(variable,container)                                                             \
2539     if(0){}else                                                                                     \
2540     for (const QForeachContainerBase &_container_ = qForeachContainerNew(container);                \
2541          qForeachContainer(&_container_, (__typeof__(container) *) 0)->condition();       \
2542          ++qForeachContainer(&_container_, (__typeof__(container) *) 0)->i)               \
2543         for (variable = *qForeachContainer(&_container_, (__typeof__(container) *) 0)->i; \
2544              qForeachContainer(&_container_, (__typeof__(container) *) 0)->brk;           \
2545              --qForeachContainer(&_container_, (__typeof__(container) *) 0)->brk)
2546
2547 #else
2548 #  define Q_FOREACH(variable, container) \
2549     for (const QForeachContainerBase &_container_ = qForeachContainerNew(container); \
2550          qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->condition();       \
2551          ++qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->i)               \
2552         for (variable = *qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->i; \
2553              qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->brk;           \
2554              --qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))->brk)
2555 #endif // MSVC6 || MIPSpro
2556
2557 #endif
2558
2559 #define Q_FOREVER for(;;)
2560 #ifndef QT_NO_KEYWORDS
2561 #  ifndef foreach
2562 #    define foreach Q_FOREACH
2563 #  endif
2564 #  ifndef forever
2565 #    define forever Q_FOREVER
2566 #  endif
2567 #endif
2568
2569 #if 0
2570 /* tell gcc to use its built-in methods for some common functions */
2571 #if defined(QT_NO_DEBUG) && defined(Q_CC_GNU)
2572 #  define qMemCopy __builtin_memcpy
2573 #  define qMemSet __builtin_memset
2574 #endif
2575 #endif
2576
2577 template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }
2578 template <typename Wrapper> static inline typename Wrapper::pointer qGetPtrHelper(const Wrapper &p) { return p.data(); }
2579
2580 #define Q_DECLARE_PRIVATE(Class) \
2581     inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \
2582     inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \
2583     friend class Class##Private;
2584
2585 #define Q_DECLARE_PRIVATE_D(Dptr, Class) \
2586     inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(Dptr); } \
2587     inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(Dptr); } \
2588     friend class Class##Private;
2589
2590 #define Q_DECLARE_PUBLIC(Class)                                    \
2591     inline Class* q_func() { return static_cast<Class *>(q_ptr); } \
2592     inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \
2593     friend class Class;
2594
2595 #define Q_D(Class) Class##Private * const d = d_func()
2596 #define Q_Q(Class) Class * const q = q_func()
2597
2598 #define QT_TR_NOOP(x) (x)
2599 #define QT_TR_NOOP_UTF8(x) (x)
2600 #define QT_TRANSLATE_NOOP(scope, x) (x)
2601 #define QT_TRANSLATE_NOOP_UTF8(scope, x) (x)
2602 #define QT_TRANSLATE_NOOP3(scope, x, comment) {x, comment}
2603 #define QT_TRANSLATE_NOOP3_UTF8(scope, x, comment) {x, comment}
2604
2605 #ifndef QT_NO_TRANSLATION // ### This should enclose the NOOPs above
2606
2607 // Defined in qcoreapplication.cpp
2608 // The better name qTrId() is reserved for an upcoming function which would
2609 // return a much more powerful QStringFormatter instead of a QString.
2610 Q_CORE_EXPORT QString qtTrId(const char *id, int n = -1);
2611
2612 #define QT_TRID_NOOP(id) id
2613
2614 #endif // QT_NO_TRANSLATION
2615
2616 #define QDOC_PROPERTY(text)
2617
2618 /*
2619    When RTTI is not available, define this macro to force any uses of
2620    dynamic_cast to cause a compile failure.
2621 */
2622
2623 #ifdef QT_NO_DYNAMIC_CAST
2624 #  define dynamic_cast QT_PREPEND_NAMESPACE(qt_dynamic_cast_check)
2625
2626   template<typename T, typename X>
2627   T qt_dynamic_cast_check(X, T* = 0)
2628   { return T::dynamic_cast_will_always_fail_because_rtti_is_disabled; }
2629 #endif
2630
2631 /*
2632    Some classes do not permit copies to be made of an object. These
2633    classes contains a private copy constructor and assignment
2634    operator to disable copying (the compiler gives an error message).
2635 */
2636 #define Q_DISABLE_COPY(Class) \
2637     Class(const Class &); \
2638     Class &operator=(const Class &);
2639
2640 class QByteArray;
2641 Q_CORE_EXPORT QByteArray qgetenv(const char *varName);
2642 Q_CORE_EXPORT bool qputenv(const char *varName, const QByteArray& value);
2643
2644 inline int qIntCast(double f) { return int(f); }
2645 inline int qIntCast(float f) { return int(f); }
2646
2647 /*
2648   Reentrant versions of basic rand() functions for random number generation
2649 */
2650 Q_CORE_EXPORT void qsrand(uint seed);
2651 Q_CORE_EXPORT int qrand();
2652
2653 /*
2654    Compat functions that were generated by configure
2655 */
2656 #ifdef QT3_SUPPORT
2657 #ifndef QT_PRODUCT_LICENSEE
2658 #  define QT_PRODUCT_LICENSEE QLibraryInfo::licensee()
2659 #endif
2660 #ifndef QT_PRODUCT_LICENSE
2661 #  define QT_PRODUCT_LICENSE QLibraryInfo::licensedProducts()
2662 #endif
2663 QT3_SUPPORT Q_CORE_EXPORT const char *qInstallPath();
2664 QT3_SUPPORT Q_CORE_EXPORT const char *qInstallPathDocs();
2665 QT3_SUPPORT Q_CORE_EXPORT const char *qInstallPathHeaders();
2666 QT3_SUPPORT Q_CORE_EXPORT const char *qInstallPathLibs();
2667 QT3_SUPPORT Q_CORE_EXPORT const char *qInstallPathBins();
2668 QT3_SUPPORT Q_CORE_EXPORT const char *qInstallPathPlugins();
2669 QT3_SUPPORT Q_CORE_EXPORT const char *qInstallPathData();
2670 QT3_SUPPORT Q_CORE_EXPORT const char *qInstallPathTranslations();
2671 QT3_SUPPORT Q_CORE_EXPORT const char *qInstallPathSysconf();
2672 #endif
2673
2674 #if defined(Q_OS_SYMBIAN)
2675
2676 #ifdef SYMBIAN_BUILD_GCE
2677 #define Q_SYMBIAN_SUPPORTS_SURFACES
2678 //RWsPointerCursor is fixed, so don't use low performance sprites
2679 #define Q_SYMBIAN_FIXED_POINTER_CURSORS
2680 #define Q_SYMBIAN_HAS_EXTENDED_BITMAP_TYPE
2681 #define Q_SYMBIAN_WINDOW_SIZE_CACHE
2682 #define QT_SYMBIAN_SUPPORTS_ADVANCED_POINTER
2683
2684 //enabling new graphics resources
2685 #ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
2686 #  define QT_SYMBIAN_SUPPORTS_SGIMAGE
2687 #endif
2688
2689 #ifdef SYMBIAN_GRAPHICS_SET_SURFACE_TRANSPARENCY_AVAILABLE
2690 #  define Q_SYMBIAN_SEMITRANSPARENT_BG_SURFACE
2691 #endif
2692
2693 #ifdef SYMBIAN_GRAPHICS_TRANSITION_EFFECTS_SIGNALING_AVAILABLE
2694 #  define Q_SYMBIAN_TRANSITION_EFFECTS
2695 #endif
2696 #endif
2697
2698 #ifdef SYMBIAN_WSERV_AND_CONE_MULTIPLE_SCREENS
2699 #define Q_SYMBIAN_SUPPORTS_MULTIPLE_SCREENS
2700 #endif
2701
2702 #ifdef SYMBIAN_GRAPHICS_FIXNATIVEORIENTATION
2703 #define Q_SYMBIAN_SUPPORTS_FIXNATIVEORIENTATION
2704 #endif
2705
2706 //Symbian does not support data imports from a DLL
2707 #define Q_NO_DATA_RELOCATION
2708
2709 // Winscw compiler is unable to compile QtConcurrent.
2710 #ifdef Q_CC_NOKIAX86
2711 #ifndef QT_NO_CONCURRENT
2712 #define QT_NO_CONCURRENT
2713 #endif
2714 #ifndef QT_NO_QFUTURE
2715 #define QT_NO_QFUTURE
2716 #endif
2717 #endif
2718
2719 QT_END_NAMESPACE
2720 // forward declare std::exception
2721 #ifdef __cplusplus
2722 namespace std { class exception; }
2723 #endif
2724 QT_BEGIN_NAMESPACE
2725 Q_CORE_EXPORT void qt_symbian_throwIfError(int error);
2726 Q_CORE_EXPORT void qt_symbian_exception2LeaveL(const std::exception& ex);
2727 Q_CORE_EXPORT int qt_symbian_exception2Error(const std::exception& ex);
2728
2729 #define QT_TRAP_THROWING(_f)                        \
2730     {                                               \
2731         TInt ____error;                             \
2732         TRAP(____error, _f);                        \
2733         qt_symbian_throwIfError(____error);                 \
2734      }
2735
2736 #define QT_TRYCATCH_ERROR(_err, _f)                         \
2737     {                                                       \
2738         _err = KErrNone;                                    \
2739         try {                                               \
2740             _f;                                             \
2741         } catch (const std::exception &____ex) {            \
2742             _err = qt_symbian_exception2Error(____ex);       \
2743         }                                                   \
2744     }
2745
2746 #define QT_TRYCATCH_LEAVING(_f)                         \
2747     {                                                   \
2748     TInt ____err;                                       \
2749     QT_TRYCATCH_ERROR(____err, _f)                      \
2750     User::LeaveIfError(____err);                        \
2751     }
2752 #endif
2753
2754
2755 /*
2756    This gives us the possibility to check which modules the user can
2757    use. These are purely compile time checks and will generate no code.
2758 */
2759
2760 /* Qt modules */
2761 #define QT_MODULE_CORE                 0x00001
2762 #define QT_MODULE_GUI                  0x00002
2763 #define QT_MODULE_NETWORK              0x00004
2764 #define QT_MODULE_OPENGL               0x00008
2765 #define QT_MODULE_SQL                  0x00010
2766 #define QT_MODULE_XML                  0x00020
2767 #define QT_MODULE_QT3SUPPORTLIGHT      0x00040
2768 #define QT_MODULE_QT3SUPPORT           0x00080
2769 #define QT_MODULE_SVG                  0x00100
2770 #define QT_MODULE_ACTIVEQT             0x00200
2771 #define QT_MODULE_GRAPHICSVIEW         0x00400
2772 #define QT_MODULE_SCRIPT               0x00800
2773 #define QT_MODULE_XMLPATTERNS          0x01000
2774 #define QT_MODULE_HELP                 0x02000
2775 #define QT_MODULE_TEST                 0x04000
2776 #define QT_MODULE_DBUS                 0x08000
2777 #define QT_MODULE_SCRIPTTOOLS          0x10000
2778 #define QT_MODULE_OPENVG               0x20000
2779 #define QT_MODULE_MULTIMEDIA           0x40000
2780 #define QT_MODULE_DECLARATIVE          0x80000
2781
2782 /* Qt editions */
2783 #define QT_EDITION_CONSOLE      (QT_MODULE_CORE \
2784                                  | QT_MODULE_NETWORK \
2785                                  | QT_MODULE_SQL \
2786                                  | QT_MODULE_SCRIPT \
2787                                  | QT_MODULE_MULTIMEDIA \
2788                                  | QT_MODULE_XML \
2789                                  | QT_MODULE_XMLPATTERNS \
2790                                  | QT_MODULE_TEST \
2791                                  | QT_MODULE_DBUS)
2792 #define QT_EDITION_DESKTOPLIGHT (QT_MODULE_CORE \
2793                                  | QT_MODULE_GUI \
2794                                  | QT_MODULE_QT3SUPPORTLIGHT \
2795                                  | QT_MODULE_TEST \
2796                                  | QT_MODULE_DBUS)
2797 #define QT_EDITION_OPENSOURCE   (QT_MODULE_CORE \
2798                                  | QT_MODULE_GUI \
2799                                  | QT_MODULE_NETWORK \
2800                                  | QT_MODULE_OPENGL \
2801                                  | QT_MODULE_OPENVG \
2802                                  | QT_MODULE_SQL \
2803                                  | QT_MODULE_MULTIMEDIA \
2804                                  | QT_MODULE_XML \
2805                                  | QT_MODULE_XMLPATTERNS \
2806                                  | QT_MODULE_SCRIPT \
2807                                  | QT_MODULE_SCRIPTTOOLS \
2808                                  | QT_MODULE_QT3SUPPORTLIGHT \
2809                                  | QT_MODULE_QT3SUPPORT \
2810                                  | QT_MODULE_SVG \
2811                                  | QT_MODULE_DECLARATIVE \
2812                                  | QT_MODULE_GRAPHICSVIEW \
2813                                  | QT_MODULE_HELP \
2814                                  | QT_MODULE_TEST \
2815                                  | QT_MODULE_DBUS \
2816                                  | QT_MODULE_ACTIVEQT)
2817 #define QT_EDITION_DESKTOP      (QT_EDITION_OPENSOURCE)
2818 #define QT_EDITION_UNIVERSAL    QT_EDITION_DESKTOP
2819 #define QT_EDITION_ACADEMIC     QT_EDITION_DESKTOP
2820 #define QT_EDITION_EDUCATIONAL  QT_EDITION_DESKTOP
2821 #define QT_EDITION_EVALUATION   QT_EDITION_DESKTOP
2822
2823 /* Determine which modules can be used */
2824 #ifndef QT_EDITION
2825 #  ifdef QT_BUILD_QMAKE
2826 #    define QT_EDITION QT_EDITION_DESKTOP
2827 #  else
2828 #    error "Qt not configured correctly, please run configure"
2829 #  endif
2830 #endif
2831
2832 #define QT_LICENSED_MODULE(x) \
2833     enum QtValidLicenseFor##x##Module { Licensed##x = true };
2834
2835 /* qdoc is really unhappy with the following block of preprocessor checks,
2836    making it difficult to document classes properly after this point. */
2837
2838 #if (QT_EDITION & QT_MODULE_CORE)
2839 QT_LICENSED_MODULE(Core)
2840 #endif
2841 #if (QT_EDITION & QT_MODULE_GUI)
2842 QT_LICENSED_MODULE(Gui)
2843 #endif
2844 #if (QT_EDITION & QT_MODULE_NETWORK)
2845 QT_LICENSED_MODULE(Network)
2846 #endif
2847 #if (QT_EDITION & QT_MODULE_OPENGL)
2848 QT_LICENSED_MODULE(OpenGL)
2849 #endif
2850 #if (QT_EDITION & QT_MODULE_OPENVG)
2851 QT_LICENSED_MODULE(OpenVG)
2852 #endif
2853 #if (QT_EDITION & QT_MODULE_SQL)
2854 QT_LICENSED_MODULE(Sql)
2855 #endif
2856 #if (QT_EDITION & QT_MODULE_MULTIMEDIA)
2857 QT_LICENSED_MODULE(Multimedia)
2858 #endif
2859 #if (QT_EDITION & QT_MODULE_XML)
2860 QT_LICENSED_MODULE(Xml)
2861 #endif
2862 #if (QT_EDITION & QT_MODULE_XMLPATTERNS)
2863 QT_LICENSED_MODULE(XmlPatterns)
2864 #endif
2865 #if (QT_EDITION & QT_MODULE_HELP)
2866 QT_LICENSED_MODULE(Help)
2867 #endif
2868 #if (QT_EDITION & QT_MODULE_SCRIPT) || defined(QT_BUILD_QMAKE)
2869 QT_LICENSED_MODULE(Script)
2870 #endif
2871 #if (QT_EDITION & QT_MODULE_SCRIPTTOOLS)
2872 QT_LICENSED_MODULE(ScriptTools)
2873 #endif
2874 #if (QT_EDITION & QT_MODULE_QT3SUPPORTLIGHT)
2875 QT_LICENSED_MODULE(Qt3SupportLight)
2876 #endif
2877 #if (QT_EDITION & QT_MODULE_QT3SUPPORT)
2878 QT_LICENSED_MODULE(Qt3Support)
2879 #endif
2880 #if (QT_EDITION & QT_MODULE_SVG)
2881 QT_LICENSED_MODULE(Svg)
2882 #endif
2883 #if (QT_EDITION & QT_MODULE_DECLARATIVE)
2884 QT_LICENSED_MODULE(Declarative)
2885 #endif
2886 #if (QT_EDITION & QT_MODULE_ACTIVEQT)
2887 QT_LICENSED_MODULE(ActiveQt)
2888 #endif
2889 #if (QT_EDITION & QT_MODULE_TEST)
2890 QT_LICENSED_MODULE(Test)
2891 #endif
2892 #if (QT_EDITION & QT_MODULE_DBUS)
2893 QT_LICENSED_MODULE(DBus)
2894 #endif
2895
2896 #define QT_MODULE(x) \
2897     typedef QtValidLicenseFor##x##Module Qt##x##Module;
2898
2899 #ifdef QT_NO_CONCURRENT
2900 #  define QT_NO_QFUTURE
2901 #endif
2902
2903 // gcc 3 version has problems with some of the
2904 // map/filter overloads.
2905 #if defined(Q_CC_GNU) && (__GNUC__ < 4)
2906 #  define QT_NO_CONCURRENT_MAP
2907 #  define QT_NO_CONCURRENT_FILTER
2908 #endif
2909
2910 #if defined (__ELF__)
2911 #  if defined (Q_OS_LINUX) || defined (Q_OS_SOLARIS) || defined (Q_OS_FREEBSD) || defined (Q_OS_OPENBSD) || defined (Q_OS_IRIX)
2912 #    define Q_OF_ELF
2913 #  endif
2914 #endif
2915
2916 #if !(defined(Q_WS_WIN) && !defined(Q_WS_WINCE)) \
2917     && !(defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA)) \
2918     && !(defined(Q_WS_X11) && !defined(QT_NO_FREETYPE)) \
2919     && !(defined(Q_WS_QPA))
2920 #  define QT_NO_RAWFONT
2921 #endif
2922
2923 namespace QtPrivate {
2924 //like std::enable_if
2925 template <bool B, typename T = void> struct QEnableIf;
2926 template <typename T> struct QEnableIf<true, T> { typedef T Type; };
2927 }
2928
2929 QT_END_NAMESPACE
2930 QT_END_HEADER
2931
2932 #endif /* __cplusplus */
2933
2934 #endif /* QGLOBAL_H */