1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Copyright (C) 2017 Intel Corporation.
5 ** Contact: https://www.qt.io/licensing/
6 **
7 ** This file is part of the QtCore module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** Commercial License Usage
11 ** Licensees holding valid commercial Qt licenses may use this file in
12 ** accordance with the commercial license agreement provided with the
13 ** Software or, alternatively, in accordance with the terms contained in
14 ** a written agreement between you and The Qt Company. For licensing terms
15 ** and conditions see https://www.qt.io/terms-conditions. For further
16 ** information use the contact form at https://www.qt.io/contact-us.
17 **
18 ** GNU Lesser General Public License Usage
19 ** Alternatively, this file may be used under the terms of the GNU Lesser
20 ** General Public License version 3 as published by the Free Software
21 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
22 ** packaging of this file. Please review the following information to
23 ** ensure the GNU Lesser General Public License version 3 requirements
24 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
25 **
26 ** GNU General Public License Usage
27 ** Alternatively, this file may be used under the terms of the GNU
28 ** General Public License version 2.0 or (at your option) the GNU General
29 ** Public license version 3 or any later version approved by the KDE Free
30 ** Qt Foundation. The licenses are as published by the Free Software
31 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
32 ** included in the packaging of this file. Please review the following
33 ** information to ensure the GNU General Public License requirements will
34 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
35 ** https://www.gnu.org/licenses/gpl-3.0.html.
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40 
41 #include "qplatformdefs.h"
42 #include "qstring.h"
43 #include "qvector.h"
44 #include "qlist.h"
45 #include "qdir.h"
46 #include "qdatetime.h"
47 #include "qoperatingsystemversion.h"
48 #include "qoperatingsystemversion_p.h"
49 #if defined(Q_OS_WIN) || defined(Q_OS_CYGWIN) || defined(Q_OS_WINRT)
50 #  include "qoperatingsystemversion_win_p.h"
51 #  ifndef Q_OS_WINRT
52 #    include "private/qwinregistry_p.h"
53 #  endif
54 #endif // Q_OS_WIN || Q_OS_CYGWIN
55 #include <private/qlocale_tools_p.h>
56 
57 #include <qmutex.h>
58 #include <QtCore/private/qlocking_p.h>
59 
60 #include <stdlib.h>
61 #include <limits.h>
62 #include <stdarg.h>
63 #include <string.h>
64 
65 #ifndef QT_NO_EXCEPTIONS
66 #  include <string>
67 #  include <exception>
68 #endif
69 
70 #include <errno.h>
71 #if defined(Q_CC_MSVC)
72 #  include <crtdbg.h>
73 #endif
74 
75 #ifdef Q_OS_WINRT
76 #include <Ws2tcpip.h>
77 #endif // Q_OS_WINRT
78 
79 #ifdef Q_OS_WIN
80 #  include <qt_windows.h>
81 #endif
82 
83 #if defined(Q_OS_VXWORKS) && defined(_WRS_KERNEL)
84 #  include <envLib.h>
85 #endif
86 
87 #if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
88 #include <private/qjni_p.h>
89 #endif
90 
91 #if defined(Q_OS_SOLARIS)
92 #  include <sys/systeminfo.h>
93 #endif
94 
95 #if defined(Q_OS_DARWIN) && __has_include(<IOKit/IOKitLib.h>)
96 #  include <IOKit/IOKitLib.h>
97 #  include <private/qcore_mac_p.h>
98 #endif
99 
100 #ifdef Q_OS_UNIX
101 #include <sys/utsname.h>
102 #include <private/qcore_unix_p.h>
103 #endif
104 
105 #ifdef Q_OS_BSD4
106 #include <sys/sysctl.h>
107 #endif
108 
109 #if defined(Q_OS_INTEGRITY)
110 extern "C" {
111     // Function mmap resides in libshm_client.a. To be able to link with it one needs
112     // to define symbols 'shm_area_password' and 'shm_area_name', because the library
113     // is meant to allow the application that links to it to use POSIX shared memory
114     // without full system POSIX.
115 #  pragma weak shm_area_password
116 #  pragma weak shm_area_name
117     char shm_area_password[] = "dummy";
118     char shm_area_name[] = "dummy";
119 }
120 #endif
121 
122 #include "archdetect.cpp"
123 
124 #ifdef qFatal
125 // the qFatal in this file are just redirections from elsewhere, so
126 // don't capture any context again
127 #  undef qFatal
128 #endif
129 
130 QT_BEGIN_NAMESPACE
131 
132 #if !QT_DEPRECATED_SINCE(5, 0)
133 // Make sure they're defined to be exported
134 Q_CORE_EXPORT void *qMemCopy(void *dest, const void *src, size_t n);
135 Q_CORE_EXPORT void *qMemSet(void *dest, int c, size_t n);
136 #endif
137 
138 // Statically check assumptions about the environment we're running
139 // in. The idea here is to error or warn if otherwise implicit Qt
140 // assumptions are not fulfilled on new hardware or compilers
141 // (if this list becomes too long, consider factoring into a separate file)
142 Q_STATIC_ASSERT_X(UCHAR_MAX == 255, "Qt assumes that char is 8 bits");
143 Q_STATIC_ASSERT_X(sizeof(int) == 4, "Qt assumes that int is 32 bits");
144 Q_STATIC_ASSERT_X(QT_POINTER_SIZE == sizeof(void *), "QT_POINTER_SIZE defined incorrectly");
145 Q_STATIC_ASSERT_X(sizeof(float) == 4, "Qt assumes that float is 32 bits");
146 Q_STATIC_ASSERT_X(sizeof(char16_t) == 2, "Qt assumes that char16_t is 16 bits");
147 Q_STATIC_ASSERT_X(sizeof(char32_t) == 4, "Qt assumes that char32_t is 32 bits");
148 Q_STATIC_ASSERT_X(std::numeric_limits<int>::radix == 2,
149                   "Qt assumes binary integers");
150 Q_STATIC_ASSERT_X((std::numeric_limits<int>::max() + std::numeric_limits<int>::lowest()) == -1,
151                   "Qt assumes two's complement integers");
152 
153 // While we'd like to check for __STDC_IEC_559__, as per ISO/IEC 9899:2011
154 // Annex F (C11, normative for C++11), there are a few corner cases regarding
155 // denormals where GHS compiler is relying hardware behavior that is not IEC
156 // 559 compliant. So split the check in several subchecks.
157 
158 // On GHC the compiler reports std::numeric_limits<float>::is_iec559 as false.
159 // This is all right according to our needs.
160 #if !defined(Q_CC_GHS)
161 Q_STATIC_ASSERT_X(std::numeric_limits<float>::is_iec559,
162                   "Qt assumes IEEE 754 floating point");
163 #endif
164 
165 // Technically, presence of NaN and infinities are implied from the above check,
166 // but double checking our environment doesn't hurt...
167 Q_STATIC_ASSERT_X(std::numeric_limits<float>::has_infinity &&
168                   std::numeric_limits<float>::has_quiet_NaN &&
169                   std::numeric_limits<float>::has_signaling_NaN,
170                   "Qt assumes IEEE 754 floating point");
171 
172 // is_iec559 checks for ISO/IEC/IEEE 60559:2011 (aka IEEE 754-2008) compliance,
173 // but that allows for a non-binary radix. We need to recheck that.
174 // Note how __STDC_IEC_559__ would instead check for IEC 60559:1989, aka
175 // ANSI/IEEE 754−1985, which specifically implies binary floating point numbers.
176 Q_STATIC_ASSERT_X(std::numeric_limits<float>::radix == 2,
177                   "Qt assumes binary IEEE 754 floating point");
178 
179 // not required by the definition of size_t, but we depend on this
180 Q_STATIC_ASSERT_X(sizeof(size_t) == sizeof(void *), "size_t and a pointer don't have the same size");
181 Q_STATIC_ASSERT(sizeof(size_t) == sizeof(qsizetype)); // implied by the definition
182 Q_STATIC_ASSERT((std::is_same<qsizetype, qptrdiff>::value));
183 
184 /*!
185     \class QFlag
186     \inmodule QtCore
187     \brief The QFlag class is a helper data type for QFlags.
188 
189     It is equivalent to a plain \c int, except with respect to
190     function overloading and type conversions. You should never need
191     to use this class in your applications.
192 
193     \sa QFlags
194 */
195 
196 /*!
197     \fn QFlag::QFlag(int value)
198 
199     Constructs a QFlag object that stores the \a value.
200 */
201 
202 /*!
203     \fn QFlag::QFlag(uint value)
204     \since 5.3
205 
206     Constructs a QFlag object that stores the \a value.
207 */
208 
209 /*!
210     \fn QFlag::QFlag(short value)
211     \since 5.3
212 
213     Constructs a QFlag object that stores the \a value.
214 */
215 
216 /*!
217     \fn QFlag::QFlag(ushort value)
218     \since 5.3
219 
220     Constructs a QFlag object that stores the \a value.
221 */
222 
223 /*!
224     \fn QFlag::operator int() const
225 
226     Returns the value stored by the QFlag object.
227 */
228 
229 /*!
230     \fn QFlag::operator uint() const
231     \since 5.3
232 
233     Returns the value stored by the QFlag object.
234 */
235 
236 /*!
237     \class QFlags
238     \inmodule QtCore
239     \brief The QFlags class provides a type-safe way of storing
240     OR-combinations of enum values.
241 
242 
243     \ingroup tools
244 
245     The QFlags<Enum> class is a template class, where Enum is an enum
246     type. QFlags is used throughout Qt for storing combinations of
247     enum values.
248 
249     The traditional C++ approach for storing OR-combinations of enum
250     values is to use an \c int or \c uint variable. The inconvenience
251     with this approach is that there's no type checking at all; any
252     enum value can be OR'd with any other enum value and passed on to
253     a function that takes an \c int or \c uint.
254 
255     Qt uses QFlags to provide type safety. For example, the
256     Qt::Alignment type is simply a typedef for
257     QFlags<Qt::AlignmentFlag>. QLabel::setAlignment() takes a
258     Qt::Alignment parameter, which means that any combination of
259     Qt::AlignmentFlag values, or \c{{ }}, is legal:
260 
261     \snippet code/src_corelib_global_qglobal.cpp 0
262 
263     If you try to pass a value from another enum or just a plain
264     integer other than 0, the compiler will report an error. If you
265     need to cast integer values to flags in a untyped fashion, you can
266     use the explicit QFlags constructor as cast operator.
267 
268     If you want to use QFlags for your own enum types, use
269     the Q_DECLARE_FLAGS() and Q_DECLARE_OPERATORS_FOR_FLAGS().
270 
271     Example:
272 
273     \snippet code/src_corelib_global_qglobal.cpp 1
274 
275     You can then use the \c MyClass::Options type to store
276     combinations of \c MyClass::Option values.
277 
278     \section1 Flags and the Meta-Object System
279 
280     The Q_DECLARE_FLAGS() macro does not expose the flags to the meta-object
281     system, so they cannot be used by Qt Script or edited in Qt Designer.
282     To make the flags available for these purposes, the Q_FLAG() macro must
283     be used:
284 
285     \snippet code/src_corelib_global_qglobal.cpp meta-object flags
286 
287     \section1 Naming Convention
288 
289     A sensible naming convention for enum types and associated QFlags
290     types is to give a singular name to the enum type (e.g., \c
291     Option) and a plural name to the QFlags type (e.g., \c Options).
292     When a singular name is desired for the QFlags type (e.g., \c
293     Alignment), you can use \c Flag as the suffix for the enum type
294     (e.g., \c AlignmentFlag).
295 
296     \sa QFlag
297 */
298 
299 /*!
300     \typedef QFlags::Int
301     \since 5.0
302 
303     Typedef for the integer type used for storage as well as for
304     implicit conversion. Either \c int or \c{unsigned int}, depending
305     on whether the enum's underlying type is signed or unsigned.
306 */
307 
308 /*!
309     \typedef QFlags::enum_type
310 
311     Typedef for the Enum template type.
312 */
313 
314 /*!
315     \fn template<typename Enum> QFlags<Enum>::QFlags(const QFlags &other)
316 
317     Constructs a copy of \a other.
318 */
319 
320 /*!
321     \fn template <typename Enum> QFlags<Enum>::QFlags(Enum flags)
322 
323     Constructs a QFlags object storing the \a flags.
324 */
325 
326 /*!
327     \fn template <typename Enum> QFlags<Enum>::QFlags()
328     \since 5.15
329 
330     Constructs a QFlags object with no flags set.
331 */
332 
333 /*!
334     \fn template <typename Enum> QFlags<Enum>::QFlags(Zero)
335     \deprecated
336 
337     Constructs a QFlags object with no flags set. The parameter must be a
338     literal 0 value.
339 
340     Deprecated, use default constructor instead.
341 */
342 
343 /*!
344     \fn template <typename Enum> QFlags<Enum>::QFlags(QFlag flag)
345 
346     Constructs a QFlags object initialized with the integer \a flag.
347 
348     The QFlag type is a helper type. By using it here instead of \c
349     int, we effectively ensure that arbitrary enum values cannot be
350     cast to a QFlags, whereas untyped enum values (i.e., \c int
351     values) can.
352 */
353 
354 /*!
355     \fn template <typename Enum> QFlags<Enum>::QFlags(std::initializer_list<Enum> flags)
356     \since 5.4
357 
358     Constructs a QFlags object initialized with all \a flags
359     combined using the bitwise OR operator.
360 
361     \sa operator|=(), operator|()
362 */
363 
364 /*!
365     \fn template <typename Enum> QFlags &QFlags<Enum>::operator=(const QFlags &other)
366 
367     Assigns \a other to this object and returns a reference to this
368     object.
369 */
370 
371 /*!
372     \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(int mask)
373 
374     Performs a bitwise AND operation with \a mask and stores the
375     result in this QFlags object. Returns a reference to this object.
376 
377     \sa operator&(), operator|=(), operator^=()
378 */
379 
380 /*!
381     \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(uint mask)
382 
383     \overload
384 */
385 
386 /*!
387     \fn template <typename Enum> QFlags &QFlags<Enum>::operator&=(Enum mask)
388 
389     \overload
390 */
391 
392 /*!
393     \fn template <typename Enum> QFlags &QFlags<Enum>::operator|=(QFlags other)
394 
395     Performs a bitwise OR operation with \a other and stores the
396     result in this QFlags object. Returns a reference to this object.
397 
398     \sa operator|(), operator&=(), operator^=()
399 */
400 
401 /*!
402     \fn template <typename Enum> QFlags &QFlags<Enum>::operator|=(Enum other)
403 
404     \overload
405 */
406 
407 /*!
408     \fn template <typename Enum> QFlags &QFlags<Enum>::operator^=(QFlags other)
409 
410     Performs a bitwise XOR operation with \a other and stores the
411     result in this QFlags object. Returns a reference to this object.
412 
413     \sa operator^(), operator&=(), operator|=()
414 */
415 
416 /*!
417     \fn template <typename Enum> QFlags &QFlags<Enum>::operator^=(Enum other)
418 
419     \overload
420 */
421 
422 /*!
423     \fn template <typename Enum> QFlags<Enum>::operator Int() const
424 
425     Returns the value stored in the QFlags object as an integer.
426 
427     \sa Int
428 */
429 
430 /*!
431     \fn template <typename Enum> QFlags QFlags<Enum>::operator|(QFlags other) const
432 
433     Returns a QFlags object containing the result of the bitwise OR
434     operation on this object and \a other.
435 
436     \sa operator|=(), operator^(), operator&(), operator~()
437 */
438 
439 /*!
440     \fn template <typename Enum> QFlags QFlags<Enum>::operator|(Enum other) const
441 
442     \overload
443 */
444 
445 /*!
446     \fn template <typename Enum> QFlags QFlags<Enum>::operator^(QFlags other) const
447 
448     Returns a QFlags object containing the result of the bitwise XOR
449     operation on this object and \a other.
450 
451     \sa operator^=(), operator&(), operator|(), operator~()
452 */
453 
454 /*!
455     \fn template <typename Enum> QFlags QFlags<Enum>::operator^(Enum other) const
456 
457     \overload
458 */
459 
460 /*!
461     \fn template <typename Enum> QFlags QFlags<Enum>::operator&(int mask) const
462 
463     Returns a QFlags object containing the result of the bitwise AND
464     operation on this object and \a mask.
465 
466     \sa operator&=(), operator|(), operator^(), operator~()
467 */
468 
469 /*!
470     \fn template <typename Enum> QFlags QFlags<Enum>::operator&(uint mask) const
471 
472     \overload
473 */
474 
475 /*!
476     \fn template <typename Enum> QFlags QFlags<Enum>::operator&(Enum mask) const
477 
478     \overload
479 */
480 
481 /*!
482     \fn template <typename Enum> QFlags QFlags<Enum>::operator~() const
483 
484     Returns a QFlags object that contains the bitwise negation of
485     this object.
486 
487     \sa operator&(), operator|(), operator^()
488 */
489 
490 /*!
491     \fn template <typename Enum> bool QFlags<Enum>::operator!() const
492 
493     Returns \c true if no flag is set (i.e., if the value stored by the
494     QFlags object is 0); otherwise returns \c false.
495 */
496 
497 /*!
498     \fn template <typename Enum> bool QFlags<Enum>::testFlag(Enum flag) const
499     \since 4.2
500 
501     Returns \c true if the flag \a flag is set, otherwise \c false.
502 */
503 
504 /*!
505     \fn template <typename Enum> QFlags QFlags<Enum>::setFlag(Enum flag, bool on)
506     \since 5.7
507 
508     Sets the flag \a flag if \a on is \c true or unsets it if
509     \a on is \c false. Returns a reference to this object.
510 */
511 
512 /*!
513   \macro Q_DISABLE_COPY(Class)
514   \relates QObject
515 
516   Disables the use of copy constructors and assignment operators
517   for the given \a Class.
518 
519   Instances of subclasses of QObject should not be thought of as
520   values that can be copied or assigned, but as unique identities.
521   This means that when you create your own subclass of QObject
522   (director or indirect), you should \e not give it a copy constructor
523   or an assignment operator.  However, it may not enough to simply
524   omit them from your class, because, if you mistakenly write some code
525   that requires a copy constructor or an assignment operator (it's easy
526   to do), your compiler will thoughtfully create it for you. You must
527   do more.
528 
529   The curious user will have seen that the Qt classes derived
530   from QObject typically include this macro in a private section:
531 
532   \snippet code/src_corelib_global_qglobal.cpp 43
533 
534   It declares a copy constructor and an assignment operator in the
535   private section, so that if you use them by mistake, the compiler
536   will report an error.
537 
538   \snippet code/src_corelib_global_qglobal.cpp 44
539 
540   But even this might not catch absolutely every case. You might be
541   tempted to do something like this:
542 
543   \snippet code/src_corelib_global_qglobal.cpp 45
544 
545   First of all, don't do that. Most compilers will generate code that
546   uses the copy constructor, so the privacy violation error will be
547   reported, but your C++ compiler is not required to generate code for
548   this statement in a specific way. It could generate code using
549   \e{neither} the copy constructor \e{nor} the assignment operator we
550   made private. In that case, no error would be reported, but your
551   application would probably crash when you called a member function
552   of \c{w}.
553 
554   \sa Q_DISABLE_COPY_MOVE, Q_DISABLE_MOVE
555 */
556 
557 /*!
558   \macro Q_DISABLE_MOVE(Class)
559   \relates QObject
560 
561   Disables the use of move constructors and move assignment operators
562   for the given \a Class.
563 
564   \sa Q_DISABLE_COPY, Q_DISABLE_COPY_MOVE
565   \since 5.13
566 */
567 
568 /*!
569   \macro Q_DISABLE_COPY_MOVE(Class)
570   \relates QObject
571 
572   A convenience macro that disables the use of copy constructors, assignment
573   operators, move constructors and move assignment operators for the given
574   \a Class, combining Q_DISABLE_COPY and Q_DISABLE_MOVE.
575 
576   \sa Q_DISABLE_COPY, Q_DISABLE_MOVE
577   \since 5.13
578 */
579 
580 /*!
581     \macro Q_DECLARE_FLAGS(Flags, Enum)
582     \relates QFlags
583 
584     The Q_DECLARE_FLAGS() macro expands to
585 
586     \snippet code/src_corelib_global_qglobal.cpp 2
587 
588     \a Enum is the name of an existing enum type, whereas \a Flags is
589     the name of the QFlags<\e{Enum}> typedef.
590 
591     See the QFlags documentation for details.
592 
593     \sa Q_DECLARE_OPERATORS_FOR_FLAGS()
594 */
595 
596 /*!
597     \macro Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
598     \relates QFlags
599 
600     The Q_DECLARE_OPERATORS_FOR_FLAGS() macro declares global \c
601     operator|() functions for \a Flags, which is of type QFlags<T>.
602 
603     See the QFlags documentation for details.
604 
605     \sa Q_DECLARE_FLAGS()
606 */
607 
608 /*!
609     \headerfile <QtGlobal>
610     \title Global Qt Declarations
611     \ingroup funclists
612 
613     \brief The <QtGlobal> header file includes the fundamental global
614     declarations. It is included by most other Qt header files.
615 
616     The global declarations include \l{types}, \l{functions} and
617     \l{macros}.
618 
619     The type definitions are partly convenience definitions for basic
620     types (some of which guarantee certain bit-sizes on all platforms
621     supported by Qt), partly types related to Qt message handling. The
622     functions are related to generating messages, Qt version handling
623     and comparing and adjusting object values. And finally, some of
624     the declared macros enable programmers to add compiler or platform
625     specific code to their applications, while others are convenience
626     macros for larger operations.
627 
628     \section1 Types
629 
630     The header file declares several type definitions that guarantee a
631     specified bit-size on all platforms supported by Qt for various
632     basic types, for example \l qint8 which is a signed char
633     guaranteed to be 8-bit on all platforms supported by Qt. The
634     header file also declares the \l qlonglong type definition for \c
635     {long long int } (\c __int64 on Windows).
636 
637     Several convenience type definitions are declared: \l qreal for \c
638     double or \c float, \l uchar for \c unsigned char, \l uint for \c unsigned
639     int, \l ulong for \c unsigned long and \l ushort for \c unsigned
640     short.
641 
642     Finally, the QtMsgType definition identifies the various messages
643     that can be generated and sent to a Qt message handler;
644     QtMessageHandler is a type definition for a pointer to a function with
645     the signature
646     \c {void myMessageHandler(QtMsgType, const QMessageLogContext &, const char *)}.
647     QMessageLogContext class contains the line, file, and function the
648     message was logged at. This information is created by the QMessageLogger
649     class.
650 
651     \section1 Functions
652 
653     The <QtGlobal> header file contains several functions comparing
654     and adjusting an object's value. These functions take a template
655     type as argument: You can retrieve the absolute value of an object
656     using the qAbs() function, and you can bound a given object's
657     value by given minimum and maximum values using the qBound()
658     function. You can retrieve the minimum and maximum of two given
659     objects using qMin() and qMax() respectively. All these functions
660     return a corresponding template type; the template types can be
661     replaced by any other type.
662 
663     Example:
664 
665     \snippet code/src_corelib_global_qglobal.cpp 3
666 
667     <QtGlobal> also contains functions that generate messages from the
668     given string argument: qDebug(), qInfo(), qWarning(), qCritical(),
669     and qFatal(). These functions call the message handler
670     with the given message.
671 
672     Example:
673 
674     \snippet code/src_corelib_global_qglobal.cpp 4
675 
676     The remaining functions are qRound() and qRound64(), which both
677     accept a \c double or \c float value as their argument returning
678     the value rounded up to the nearest integer and 64-bit integer
679     respectively, the qInstallMessageHandler() function which installs
680     the given QtMessageHandler, and the qVersion() function which
681     returns the version number of Qt at run-time as a string.
682 
683     \section1 Macros
684 
685     The <QtGlobal> header file provides a range of macros (Q_CC_*)
686     that are defined if the application is compiled using the
687     specified platforms. For example, the Q_CC_SUN macro is defined if
688     the application is compiled using Forte Developer, or Sun Studio
689     C++.  The header file also declares a range of macros (Q_OS_*)
690     that are defined for the specified platforms. For example,
691     Q_OS_UNIX which is defined for the Unix-based systems.
692 
693     The purpose of these macros is to enable programmers to add
694     compiler or platform specific code to their application.
695 
696     The remaining macros are convenience macros for larger operations:
697     The QT_TR_NOOP(), QT_TRANSLATE_NOOP(), and QT_TRANSLATE_NOOP3()
698     macros provide the possibility of marking strings for delayed
699     translation. QT_TR_N_NOOP(), QT_TRANSLATE_N_NOOP(), and
700     QT_TRANSLATE_N_NOOP3() are numerator dependent variants of these.
701     The Q_ASSERT() and Q_ASSERT_X() enables warning messages of various
702     level of refinement. The Q_FOREACH() and foreach() macros
703     implement Qt's foreach loop.
704 
705     The Q_INT64_C() and Q_UINT64_C() macros wrap signed and unsigned
706     64-bit integer literals in a platform-independent way. The
707     Q_CHECK_PTR() macro prints a warning containing the source code's
708     file name and line number, saying that the program ran out of
709     memory, if the pointer is \nullptr. The qPrintable() and qUtf8Printable()
710     macros represent an easy way of printing text.
711 
712     The QT_POINTER_SIZE macro expands to the size of a pointer in bytes.
713 
714     The macros QT_VERSION and QT_VERSION_STR expand to a numeric value
715     or a string, respectively, that specifies the version of Qt that the
716     application is compiled against.
717 
718     \sa <QtAlgorithms>, QSysInfo
719 */
720 
721 /*!
722     \typedef qreal
723     \relates <QtGlobal>
724 
725     Typedef for \c double unless Qt is configured with the
726     \c{-qreal float} option.
727 */
728 
729 /*! \typedef uchar
730     \relates <QtGlobal>
731 
732     Convenience typedef for \c{unsigned char}.
733 */
734 
735 /*! \typedef ushort
736     \relates <QtGlobal>
737 
738     Convenience typedef for \c{unsigned short}.
739 */
740 
741 /*! \typedef uint
742     \relates <QtGlobal>
743 
744     Convenience typedef for \c{unsigned int}.
745 */
746 
747 /*! \typedef ulong
748     \relates <QtGlobal>
749 
750     Convenience typedef for \c{unsigned long}.
751 */
752 
753 /*! \typedef qint8
754     \relates <QtGlobal>
755 
756     Typedef for \c{signed char}. This type is guaranteed to be 8-bit
757     on all platforms supported by Qt.
758 */
759 
760 /*!
761     \typedef quint8
762     \relates <QtGlobal>
763 
764     Typedef for \c{unsigned char}. This type is guaranteed to
765     be 8-bit on all platforms supported by Qt.
766 */
767 
768 /*! \typedef qint16
769     \relates <QtGlobal>
770 
771     Typedef for \c{signed short}. This type is guaranteed to be
772     16-bit on all platforms supported by Qt.
773 */
774 
775 /*!
776     \typedef quint16
777     \relates <QtGlobal>
778 
779     Typedef for \c{unsigned short}. This type is guaranteed to
780     be 16-bit on all platforms supported by Qt.
781 */
782 
783 /*! \typedef qint32
784     \relates <QtGlobal>
785 
786     Typedef for \c{signed int}. This type is guaranteed to be 32-bit
787     on all platforms supported by Qt.
788 */
789 
790 /*!
791     \typedef quint32
792     \relates <QtGlobal>
793 
794     Typedef for \c{unsigned int}. This type is guaranteed to
795     be 32-bit on all platforms supported by Qt.
796 */
797 
798 /*! \typedef qint64
799     \relates <QtGlobal>
800 
801     Typedef for \c{long long int} (\c __int64 on Windows). This type
802     is guaranteed to be 64-bit on all platforms supported by Qt.
803 
804     Literals of this type can be created using the Q_INT64_C() macro:
805 
806     \snippet code/src_corelib_global_qglobal.cpp 5
807 
808     \sa Q_INT64_C(), quint64, qlonglong
809 */
810 
811 /*!
812     \typedef quint64
813     \relates <QtGlobal>
814 
815     Typedef for \c{unsigned long long int} (\c{unsigned __int64} on
816     Windows). This type is guaranteed to be 64-bit on all platforms
817     supported by Qt.
818 
819     Literals of this type can be created using the Q_UINT64_C()
820     macro:
821 
822     \snippet code/src_corelib_global_qglobal.cpp 6
823 
824     \sa Q_UINT64_C(), qint64, qulonglong
825 */
826 
827 /*!
828     \typedef qintptr
829     \relates <QtGlobal>
830 
831     Integral type for representing pointers in a signed integer (useful for
832     hashing, etc.).
833 
834     Typedef for either qint32 or qint64. This type is guaranteed to
835     be the same size as a pointer on all platforms supported by Qt. On
836     a system with 32-bit pointers, qintptr is a typedef for qint32;
837     on a system with 64-bit pointers, qintptr is a typedef for
838     qint64.
839 
840     Note that qintptr is signed. Use quintptr for unsigned values.
841 
842     \sa qptrdiff, qint32, qint64
843 */
844 
845 /*!
846     \typedef quintptr
847     \relates <QtGlobal>
848 
849     Integral type for representing pointers in an unsigned integer (useful for
850     hashing, etc.).
851 
852     Typedef for either quint32 or quint64. This type is guaranteed to
853     be the same size as a pointer on all platforms supported by Qt. On
854     a system with 32-bit pointers, quintptr is a typedef for quint32;
855     on a system with 64-bit pointers, quintptr is a typedef for
856     quint64.
857 
858     Note that quintptr is unsigned. Use qptrdiff for signed values.
859 
860     \sa qptrdiff, quint32, quint64
861 */
862 
863 /*!
864     \typedef qptrdiff
865     \relates <QtGlobal>
866 
867     Integral type for representing pointer differences.
868 
869     Typedef for either qint32 or qint64. This type is guaranteed to be
870     the same size as a pointer on all platforms supported by Qt. On a
871     system with 32-bit pointers, quintptr is a typedef for quint32; on
872     a system with 64-bit pointers, quintptr is a typedef for quint64.
873 
874     Note that qptrdiff is signed. Use quintptr for unsigned values.
875 
876     \sa quintptr, qint32, qint64
877 */
878 
879 /*!
880     \typedef qsizetype
881     \relates <QtGlobal>
882     \since 5.10
883 
884     Integral type providing Posix' \c ssize_t for all platforms.
885 
886     This type is guaranteed to be the same size as a \c size_t on all
887     platforms supported by Qt.
888 
889     Note that qsizetype is signed. Use \c size_t for unsigned values.
890 
891     \sa qptrdiff
892 */
893 
894 /*!
895     \enum QtMsgType
896     \relates <QtGlobal>
897 
898     This enum describes the messages that can be sent to a message
899     handler (QtMessageHandler). You can use the enum to identify and
900     associate the various message types with the appropriate
901     actions.
902 
903     \value QtDebugMsg
904            A message generated by the qDebug() function.
905     \value QtInfoMsg
906            A message generated by the qInfo() function.
907     \value QtWarningMsg
908            A message generated by the qWarning() function.
909     \value QtCriticalMsg
910            A message generated by the qCritical() function.
911     \value QtFatalMsg
912            A message generated by the qFatal() function.
913     \value QtSystemMsg
914 
915     \c QtInfoMsg was added in Qt 5.5.
916 
917     \sa QtMessageHandler, qInstallMessageHandler()
918 */
919 
920 /*! \typedef QFunctionPointer
921     \relates <QtGlobal>
922 
923     This is a typedef for \c{void (*)()}, a pointer to a function that takes
924     no arguments and returns void.
925 */
926 
927 /*! \macro qint64 Q_INT64_C(literal)
928     \relates <QtGlobal>
929 
930     Wraps the signed 64-bit integer \a literal in a
931     platform-independent way.
932 
933     Example:
934 
935     \snippet code/src_corelib_global_qglobal.cpp 8
936 
937     \sa qint64, Q_UINT64_C()
938 */
939 
940 /*! \macro quint64 Q_UINT64_C(literal)
941     \relates <QtGlobal>
942 
943     Wraps the unsigned 64-bit integer \a literal in a
944     platform-independent way.
945 
946     Example:
947 
948     \snippet code/src_corelib_global_qglobal.cpp 9
949 
950     \sa quint64, Q_INT64_C()
951 */
952 
953 /*! \typedef qlonglong
954     \relates <QtGlobal>
955 
956     Typedef for \c{long long int} (\c __int64 on Windows). This is
957     the same as \l qint64.
958 
959     \sa qulonglong, qint64
960 */
961 
962 /*!
963     \typedef qulonglong
964     \relates <QtGlobal>
965 
966     Typedef for \c{unsigned long long int} (\c{unsigned __int64} on
967     Windows). This is the same as \l quint64.
968 
969     \sa quint64, qlonglong
970 */
971 
972 /*! \fn template <typename T> T qAbs(const T &t)
973     \relates <QtGlobal>
974 
975     Compares \a t to the 0 of type T and returns the absolute
976     value. Thus if T is \e {double}, then \a t is compared to
977     \e{(double) 0}.
978 
979     Example:
980 
981     \snippet code/src_corelib_global_qglobal.cpp 10
982 */
983 
984 /*! \fn int qRound(double d)
985     \relates <QtGlobal>
986 
987     Rounds \a d to the nearest integer.
988 
989     Rounds half up (e.g. 0.5 -> 1, -0.5 -> 0).
990 
991     Example:
992 
993     \snippet code/src_corelib_global_qglobal.cpp 11A
994 */
995 
996 /*! \fn int qRound(float d)
997     \relates <QtGlobal>
998 
999     Rounds \a d to the nearest integer.
1000 
1001     Rounds half up (e.g. 0.5f -> 1, -0.5f -> 0).
1002 
1003     Example:
1004 
1005     \snippet code/src_corelib_global_qglobal.cpp 11B
1006 */
1007 
1008 /*! \fn qint64 qRound64(double d)
1009     \relates <QtGlobal>
1010 
1011     Rounds \a d to the nearest 64-bit integer.
1012 
1013     Rounds half up (e.g. 0.5 -> 1, -0.5 -> 0).
1014 
1015     Example:
1016 
1017     \snippet code/src_corelib_global_qglobal.cpp 12A
1018 */
1019 
1020 /*! \fn qint64 qRound64(float d)
1021     \relates <QtGlobal>
1022 
1023     Rounds \a d to the nearest 64-bit integer.
1024 
1025     Rounds half up (e.g. 0.5f -> 1, -0.5f -> 0).
1026 
1027     Example:
1028 
1029     \snippet code/src_corelib_global_qglobal.cpp 12B
1030 */
1031 
1032 /*! \fn template <typename T> const T &qMin(const T &a, const T &b)
1033     \relates <QtGlobal>
1034 
1035     Returns the minimum of \a a and \a b.
1036 
1037     Example:
1038 
1039     \snippet code/src_corelib_global_qglobal.cpp 13
1040 
1041     \sa qMax(), qBound()
1042 */
1043 
1044 /*! \fn template <typename T> const T &qMax(const T &a, const T &b)
1045     \relates <QtGlobal>
1046 
1047     Returns the maximum of \a a and \a b.
1048 
1049     Example:
1050 
1051     \snippet code/src_corelib_global_qglobal.cpp 14
1052 
1053     \sa qMin(), qBound()
1054 */
1055 
1056 /*! \fn template <typename T> const T &qBound(const T &min, const T &val, const T &max)
1057     \relates <QtGlobal>
1058 
1059     Returns \a val bounded by \a min and \a max. This is equivalent
1060     to qMax(\a min, qMin(\a val, \a max)).
1061 
1062     Example:
1063 
1064     \snippet code/src_corelib_global_qglobal.cpp 15
1065 
1066     \sa qMin(), qMax()
1067 */
1068 
1069 /*! \fn template <typename T> auto qOverload(T functionPointer)
1070     \relates <QtGlobal>
1071     \since 5.7
1072 
1073     Returns a pointer to an overloaded function. The template
1074     parameter is the list of the argument types of the function.
1075     \a functionPointer is the pointer to the (member) function:
1076 
1077     \snippet code/src_corelib_global_qglobal.cpp 52
1078 
1079     If a member function is also const-overloaded \l qConstOverload and
1080     \l qNonConstOverload need to be used.
1081 
1082     qOverload() requires C++14 enabled. In C++11-only code, the helper
1083     classes QOverload, QConstOverload, and QNonConstOverload can be used directly:
1084 
1085     \snippet code/src_corelib_global_qglobal.cpp 53
1086 
1087     \note Qt detects the necessary C++14 compiler support by way of the feature
1088     test recommendations from
1089     \l{https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations}
1090     {C++ Committee's Standing Document 6}.
1091 
1092     \sa qConstOverload(), qNonConstOverload(), {Differences between String-Based
1093     and Functor-Based Connections}
1094 */
1095 
1096 /*! \fn template <typename T> auto qConstOverload(T memberFunctionPointer)
1097     \relates <QtGlobal>
1098     \since 5.7
1099 
1100     Returns the \a memberFunctionPointer pointer to a constant member function:
1101 
1102     \snippet code/src_corelib_global_qglobal.cpp 54
1103 
1104     \sa qOverload, qNonConstOverload, {Differences between String-Based
1105     and Functor-Based Connections}
1106 */
1107 
1108 /*! \fn template <typename T> auto qNonConstOverload(T memberFunctionPointer)
1109     \relates <QtGlobal>
1110     \since 5.7
1111 
1112     Returns the \a memberFunctionPointer pointer to a non-constant member function:
1113 
1114     \snippet code/src_corelib_global_qglobal.cpp 54
1115 
1116     \sa qOverload, qNonConstOverload, {Differences between String-Based
1117     and Functor-Based Connections}
1118 */
1119 
1120 /*!
1121     \macro QT_VERSION_CHECK
1122     \relates <QtGlobal>
1123 
1124     Turns the major, minor and patch numbers of a version into an
1125     integer, 0xMMNNPP (MM = major, NN = minor, PP = patch). This can
1126     be compared with another similarly processed version id.
1127 
1128     Example:
1129 
1130     \snippet code/src_corelib_global_qglobal.cpp qt-version-check
1131 
1132     \sa QT_VERSION
1133 */
1134 
1135 /*!
1136     \macro QT_VERSION
1137     \relates <QtGlobal>
1138 
1139     This macro expands a numeric value of the form 0xMMNNPP (MM =
1140     major, NN = minor, PP = patch) that specifies Qt's version
1141     number. For example, if you compile your application against Qt
1142     4.1.2, the QT_VERSION macro will expand to 0x040102.
1143 
1144     You can use QT_VERSION to use the latest Qt features where
1145     available.
1146 
1147     Example:
1148 
1149     \snippet code/src_corelib_global_qglobal.cpp 16
1150 
1151     \sa QT_VERSION_STR, qVersion()
1152 */
1153 
1154 /*!
1155     \macro QT_VERSION_STR
1156     \relates <QtGlobal>
1157 
1158     This macro expands to a string that specifies Qt's version number
1159     (for example, "4.1.2"). This is the version against which the
1160     application is compiled.
1161 
1162     \sa qVersion(), QT_VERSION
1163 */
1164 
1165 /*!
1166     \relates <QtGlobal>
1167 
1168     Returns the version number of Qt at run-time as a string (for
1169     example, "4.1.2"). This may be a different version than the
1170     version the application was compiled against.
1171 
1172     \sa QT_VERSION_STR, QLibraryInfo::version()
1173 */
1174 
qVersion()1175 const char *qVersion() noexcept
1176 {
1177     return QT_VERSION_STR;
1178 }
1179 
qSharedBuild()1180 bool qSharedBuild() noexcept
1181 {
1182 #ifdef QT_SHARED
1183     return true;
1184 #else
1185     return false;
1186 #endif
1187 }
1188 
1189 /*****************************************************************************
1190   System detection routines
1191  *****************************************************************************/
1192 
1193 /*!
1194     \class QSysInfo
1195     \inmodule QtCore
1196     \brief The QSysInfo class provides information about the system.
1197 
1198     \list
1199     \li \l WordSize specifies the size of a pointer for the platform
1200        on which the application is compiled.
1201     \li \l ByteOrder specifies whether the platform is big-endian or
1202        little-endian.
1203     \endlist
1204 
1205     Some constants are defined only on certain platforms. You can use
1206     the preprocessor symbols Q_OS_WIN and Q_OS_MACOS to test that
1207     the application is compiled under Windows or \macos.
1208 
1209     \sa QLibraryInfo
1210 */
1211 
1212 /*!
1213     \enum QSysInfo::Sizes
1214 
1215     This enum provides platform-specific information about the sizes of data
1216     structures used by the underlying architecture.
1217 
1218     \value WordSize The size in bits of a pointer for the platform on which
1219            the application is compiled (32 or 64).
1220 */
1221 
1222 /*!
1223     \deprecated
1224     \variable QSysInfo::WindowsVersion
1225     \brief the version of the Windows operating system on which the
1226            application is run.
1227 */
1228 
1229 /*!
1230     \deprecated
1231     \fn QSysInfo::WindowsVersion QSysInfo::windowsVersion()
1232     \since 4.4
1233 
1234     Returns the version of the Windows operating system on which the
1235     application is run, or WV_None if the operating system is not
1236     Windows.
1237 */
1238 
1239 /*!
1240     \deprecated
1241     \variable QSysInfo::MacintoshVersion
1242     \brief the version of the Macintosh operating system on which
1243            the application is run.
1244 */
1245 
1246 /*!
1247     \deprecated
1248     \fn QSysInfo::MacVersion QSysInfo::macVersion()
1249 
1250     Returns the version of Darwin (\macos or iOS) on which the
1251     application is run, or MV_None if the operating system
1252     is not a version of Darwin.
1253 */
1254 
1255 /*!
1256     \enum QSysInfo::Endian
1257 
1258     \value BigEndian  Big-endian byte order (also called Network byte order)
1259     \value LittleEndian  Little-endian byte order
1260     \value ByteOrder  Equals BigEndian or LittleEndian, depending on
1261                       the platform's byte order.
1262 */
1263 
1264 /*!
1265     \deprecated
1266     \enum QSysInfo::WinVersion
1267 
1268     This enum provides symbolic names for the various versions of the
1269     Windows operating system. On Windows, the
1270     QSysInfo::WindowsVersion variable gives the version of the system
1271     on which the application is run.
1272 
1273     MS-DOS-based versions:
1274 
1275     \value WV_32s   Windows 3.1 with Win 32s
1276     \value WV_95    Windows 95
1277     \value WV_98    Windows 98
1278     \value WV_Me    Windows Me
1279 
1280     NT-based versions (note that each operating system version is only represented once rather than each Windows edition):
1281 
1282     \value WV_NT    Windows NT (operating system version 4.0)
1283     \value WV_2000  Windows 2000 (operating system version 5.0)
1284     \value WV_XP    Windows XP (operating system version 5.1)
1285     \value WV_2003  Windows Server 2003, Windows Server 2003 R2, Windows Home Server, Windows XP Professional x64 Edition (operating system version 5.2)
1286     \value WV_VISTA Windows Vista, Windows Server 2008 (operating system version 6.0)
1287     \value WV_WINDOWS7 Windows 7, Windows Server 2008 R2 (operating system version 6.1)
1288     \value WV_WINDOWS8 Windows 8 (operating system version 6.2)
1289     \value WV_WINDOWS8_1 Windows 8.1 (operating system version 6.3), introduced in Qt 5.2
1290     \value WV_WINDOWS10 Windows 10 (operating system version 10.0), introduced in Qt 5.5
1291 
1292     Alternatively, you may use the following macros which correspond directly to the Windows operating system version number:
1293 
1294     \value WV_4_0   Operating system version 4.0, corresponds to Windows NT
1295     \value WV_5_0   Operating system version 5.0, corresponds to Windows 2000
1296     \value WV_5_1   Operating system version 5.1, corresponds to Windows XP
1297     \value WV_5_2   Operating system version 5.2, corresponds to Windows Server 2003, Windows Server 2003 R2, Windows Home Server, and Windows XP Professional x64 Edition
1298     \value WV_6_0   Operating system version 6.0, corresponds to Windows Vista and Windows Server 2008
1299     \value WV_6_1   Operating system version 6.1, corresponds to Windows 7 and Windows Server 2008 R2
1300     \value WV_6_2   Operating system version 6.2, corresponds to Windows 8
1301     \value WV_6_3   Operating system version 6.3, corresponds to Windows 8.1, introduced in Qt 5.2
1302     \value WV_10_0  Operating system version 10.0, corresponds to Windows 10, introduced in Qt 5.5
1303 
1304     The following masks can be used for testing whether a Windows
1305     version is MS-DOS-based or NT-based:
1306 
1307     \value WV_DOS_based MS-DOS-based version of Windows
1308     \value WV_NT_based  NT-based version of Windows
1309 
1310     \value WV_None Operating system other than Windows.
1311 
1312     \omitvalue WV_CE
1313     \omitvalue WV_CENET
1314     \omitvalue WV_CE_5
1315     \omitvalue WV_CE_6
1316     \omitvalue WV_CE_based
1317 
1318     \sa MacVersion
1319 */
1320 
1321 /*!
1322     \deprecated
1323     \enum QSysInfo::MacVersion
1324 
1325     This enum provides symbolic names for the various versions of the
1326     Darwin operating system, covering both \macos and iOS. The
1327     QSysInfo::MacintoshVersion variable gives the version of the
1328     system on which the application is run.
1329 
1330     \value MV_9        \macos 9
1331     \value MV_10_0     \macos 10.0
1332     \value MV_10_1     \macos 10.1
1333     \value MV_10_2     \macos 10.2
1334     \value MV_10_3     \macos 10.3
1335     \value MV_10_4     \macos 10.4
1336     \value MV_10_5     \macos 10.5
1337     \value MV_10_6     \macos 10.6
1338     \value MV_10_7     \macos 10.7
1339     \value MV_10_8     \macos 10.8
1340     \value MV_10_9     \macos 10.9
1341     \value MV_10_10    \macos 10.10
1342     \value MV_10_11    \macos 10.11
1343     \value MV_10_12    \macos 10.12
1344     \value MV_Unknown  An unknown and currently unsupported platform
1345 
1346     \value MV_CHEETAH  Apple codename for MV_10_0
1347     \value MV_PUMA     Apple codename for MV_10_1
1348     \value MV_JAGUAR   Apple codename for MV_10_2
1349     \value MV_PANTHER  Apple codename for MV_10_3
1350     \value MV_TIGER    Apple codename for MV_10_4
1351     \value MV_LEOPARD  Apple codename for MV_10_5
1352     \value MV_SNOWLEOPARD  Apple codename for MV_10_6
1353     \value MV_LION     Apple codename for MV_10_7
1354     \value MV_MOUNTAINLION Apple codename for MV_10_8
1355     \value MV_MAVERICKS    Apple codename for MV_10_9
1356     \value MV_YOSEMITE     Apple codename for MV_10_10
1357     \value MV_ELCAPITAN    Apple codename for MV_10_11
1358     \value MV_SIERRA       Apple codename for MV_10_12
1359 
1360     \value MV_IOS      iOS (any)
1361     \value MV_IOS_4_3  iOS 4.3
1362     \value MV_IOS_5_0  iOS 5.0
1363     \value MV_IOS_5_1  iOS 5.1
1364     \value MV_IOS_6_0  iOS 6.0
1365     \value MV_IOS_6_1  iOS 6.1
1366     \value MV_IOS_7_0  iOS 7.0
1367     \value MV_IOS_7_1  iOS 7.1
1368     \value MV_IOS_8_0  iOS 8.0
1369     \value MV_IOS_8_1  iOS 8.1
1370     \value MV_IOS_8_2  iOS 8.2
1371     \value MV_IOS_8_3  iOS 8.3
1372     \value MV_IOS_8_4  iOS 8.4
1373     \value MV_IOS_9_0  iOS 9.0
1374     \value MV_IOS_9_1  iOS 9.1
1375     \value MV_IOS_9_2  iOS 9.2
1376     \value MV_IOS_9_3  iOS 9.3
1377     \value MV_IOS_10_0 iOS 10.0
1378 
1379     \value MV_TVOS          tvOS (any)
1380     \value MV_TVOS_9_0      tvOS 9.0
1381     \value MV_TVOS_9_1      tvOS 9.1
1382     \value MV_TVOS_9_2      tvOS 9.2
1383     \value MV_TVOS_10_0     tvOS 10.0
1384 
1385     \value MV_WATCHOS       watchOS (any)
1386     \value MV_WATCHOS_2_0   watchOS 2.0
1387     \value MV_WATCHOS_2_1   watchOS 2.1
1388     \value MV_WATCHOS_2_2   watchOS 2.2
1389     \value MV_WATCHOS_3_0   watchOS 3.0
1390 
1391     \value MV_None     Not a Darwin operating system
1392 
1393     \sa WinVersion
1394 */
1395 
1396 /*!
1397     \macro Q_OS_DARWIN
1398     \relates <QtGlobal>
1399 
1400     Defined on Darwin-based operating systems such as \macos, iOS, watchOS, and tvOS.
1401 */
1402 
1403 /*!
1404     \macro Q_OS_MAC
1405     \relates <QtGlobal>
1406 
1407     Deprecated synonym for \c Q_OS_DARWIN. Do not use.
1408  */
1409 
1410 /*!
1411     \macro Q_OS_OSX
1412     \relates <QtGlobal>
1413 
1414     Deprecated synonym for \c Q_OS_MACOS. Do not use.
1415  */
1416 
1417 /*!
1418     \macro Q_OS_MACOS
1419     \relates <QtGlobal>
1420 
1421     Defined on \macos.
1422  */
1423 
1424 /*!
1425     \macro Q_OS_IOS
1426     \relates <QtGlobal>
1427 
1428     Defined on iOS.
1429  */
1430 
1431 /*!
1432     \macro Q_OS_WATCHOS
1433     \relates <QtGlobal>
1434 
1435     Defined on watchOS.
1436  */
1437 
1438 /*!
1439     \macro Q_OS_TVOS
1440     \relates <QtGlobal>
1441 
1442     Defined on tvOS.
1443  */
1444 
1445 /*!
1446     \macro Q_OS_WIN
1447     \relates <QtGlobal>
1448 
1449     Defined on all supported versions of Windows. That is, if
1450     \l Q_OS_WIN32, \l Q_OS_WIN64, or \l Q_OS_WINRT is defined.
1451 */
1452 
1453 /*!
1454     \macro Q_OS_WINDOWS
1455     \relates <QtGlobal>
1456 
1457     This is a synonym for Q_OS_WIN.
1458 */
1459 
1460 /*!
1461     \macro Q_OS_WIN32
1462     \relates <QtGlobal>
1463 
1464     Defined on 32-bit and 64-bit versions of Windows.
1465 */
1466 
1467 /*!
1468     \macro Q_OS_WIN64
1469     \relates <QtGlobal>
1470 
1471     Defined on 64-bit versions of Windows.
1472 */
1473 
1474 /*!
1475     \macro Q_OS_WINRT
1476     \relates <QtGlobal>
1477 
1478     Defined for Windows Runtime (Windows Store apps) on Windows 8, Windows RT,
1479     and Windows Phone 8.
1480 */
1481 
1482 /*!
1483     \macro Q_OS_CYGWIN
1484     \relates <QtGlobal>
1485 
1486     Defined on Cygwin.
1487 */
1488 
1489 /*!
1490     \macro Q_OS_SOLARIS
1491     \relates <QtGlobal>
1492 
1493     Defined on Sun Solaris.
1494 */
1495 
1496 /*!
1497     \macro Q_OS_HPUX
1498     \relates <QtGlobal>
1499 
1500     Defined on HP-UX.
1501 */
1502 
1503 /*!
1504     \macro Q_OS_LINUX
1505     \relates <QtGlobal>
1506 
1507     Defined on Linux.
1508 */
1509 
1510 /*!
1511     \macro Q_OS_ANDROID
1512     \relates <QtGlobal>
1513 
1514     Defined on Android.
1515 */
1516 
1517 /*!
1518     \macro Q_OS_FREEBSD
1519     \relates <QtGlobal>
1520 
1521     Defined on FreeBSD.
1522 */
1523 
1524 /*!
1525     \macro Q_OS_NETBSD
1526     \relates <QtGlobal>
1527 
1528     Defined on NetBSD.
1529 */
1530 
1531 /*!
1532     \macro Q_OS_OPENBSD
1533     \relates <QtGlobal>
1534 
1535     Defined on OpenBSD.
1536 */
1537 
1538 /*!
1539     \macro Q_OS_AIX
1540     \relates <QtGlobal>
1541 
1542     Defined on AIX.
1543 */
1544 
1545 /*!
1546     \macro Q_OS_HURD
1547     \relates <QtGlobal>
1548 
1549     Defined on GNU Hurd.
1550 */
1551 
1552 /*!
1553     \macro Q_OS_QNX
1554     \relates <QtGlobal>
1555 
1556     Defined on QNX Neutrino.
1557 */
1558 
1559 /*!
1560     \macro Q_OS_LYNX
1561     \relates <QtGlobal>
1562 
1563     Defined on LynxOS.
1564 */
1565 
1566 /*!
1567     \macro Q_OS_BSD4
1568     \relates <QtGlobal>
1569 
1570     Defined on Any BSD 4.4 system.
1571 */
1572 
1573 /*!
1574     \macro Q_OS_UNIX
1575     \relates <QtGlobal>
1576 
1577     Defined on Any UNIX BSD/SYSV system.
1578 */
1579 
1580 /*!
1581     \macro Q_OS_WASM
1582     \relates <QtGlobal>
1583 
1584     Defined on Web Assembly.
1585 */
1586 
1587 /*!
1588     \macro Q_CC_SYM
1589     \relates <QtGlobal>
1590 
1591     Defined if the application is compiled using Digital Mars C/C++
1592     (used to be Symantec C++).
1593 */
1594 
1595 /*!
1596     \macro Q_CC_MSVC
1597     \relates <QtGlobal>
1598 
1599     Defined if the application is compiled using Microsoft Visual
1600     C/C++, Intel C++ for Windows.
1601 */
1602 
1603 /*!
1604     \macro Q_CC_CLANG
1605     \relates <QtGlobal>
1606 
1607     Defined if the application is compiled using Clang.
1608 */
1609 
1610 /*!
1611     \macro Q_CC_BOR
1612     \relates <QtGlobal>
1613 
1614     Defined if the application is compiled using Borland/Turbo C++.
1615 */
1616 
1617 /*!
1618     \macro Q_CC_WAT
1619     \relates <QtGlobal>
1620 
1621     Defined if the application is compiled using Watcom C++.
1622 */
1623 
1624 /*!
1625     \macro Q_CC_GNU
1626     \relates <QtGlobal>
1627 
1628     Defined if the application is compiled using GNU C++.
1629 */
1630 
1631 /*!
1632     \macro Q_CC_COMEAU
1633     \relates <QtGlobal>
1634 
1635     Defined if the application is compiled using Comeau C++.
1636 */
1637 
1638 /*!
1639     \macro Q_CC_EDG
1640     \relates <QtGlobal>
1641 
1642     Defined if the application is compiled using Edison Design Group
1643     C++.
1644 */
1645 
1646 /*!
1647     \macro Q_CC_OC
1648     \relates <QtGlobal>
1649 
1650     Defined if the application is compiled using CenterLine C++.
1651 */
1652 
1653 /*!
1654     \macro Q_CC_SUN
1655     \relates <QtGlobal>
1656 
1657     Defined if the application is compiled using Forte Developer, or
1658     Sun Studio C++.
1659 */
1660 
1661 /*!
1662     \macro Q_CC_MIPS
1663     \relates <QtGlobal>
1664 
1665     Defined if the application is compiled using MIPSpro C++.
1666 */
1667 
1668 /*!
1669     \macro Q_CC_DEC
1670     \relates <QtGlobal>
1671 
1672     Defined if the application is compiled using DEC C++.
1673 */
1674 
1675 /*!
1676     \macro Q_CC_HPACC
1677     \relates <QtGlobal>
1678 
1679     Defined if the application is compiled using HP aC++.
1680 */
1681 
1682 /*!
1683     \macro Q_CC_USLC
1684     \relates <QtGlobal>
1685 
1686     Defined if the application is compiled using SCO OUDK and UDK.
1687 */
1688 
1689 /*!
1690     \macro Q_CC_CDS
1691     \relates <QtGlobal>
1692 
1693     Defined if the application is compiled using Reliant C++.
1694 */
1695 
1696 /*!
1697     \macro Q_CC_KAI
1698     \relates <QtGlobal>
1699 
1700     Defined if the application is compiled using KAI C++.
1701 */
1702 
1703 /*!
1704     \macro Q_CC_INTEL
1705     \relates <QtGlobal>
1706 
1707     Defined if the application is compiled using Intel C++ for Linux,
1708     Intel C++ for Windows.
1709 */
1710 
1711 /*!
1712     \macro Q_CC_HIGHC
1713     \relates <QtGlobal>
1714 
1715     Defined if the application is compiled using MetaWare High C/C++.
1716 */
1717 
1718 /*!
1719     \macro Q_CC_PGI
1720     \relates <QtGlobal>
1721 
1722     Defined if the application is compiled using Portland Group C++.
1723 */
1724 
1725 /*!
1726     \macro Q_CC_GHS
1727     \relates <QtGlobal>
1728 
1729     Defined if the application is compiled using Green Hills
1730     Optimizing C++ Compilers.
1731 */
1732 
1733 /*!
1734     \macro Q_PROCESSOR_ALPHA
1735     \relates <QtGlobal>
1736 
1737     Defined if the application is compiled for Alpha processors.
1738 
1739     \sa QSysInfo::buildCpuArchitecture()
1740 */
1741 
1742 /*!
1743     \macro Q_PROCESSOR_ARM
1744     \relates <QtGlobal>
1745 
1746     Defined if the application is compiled for ARM processors. Qt currently
1747     supports three optional ARM revisions: \l Q_PROCESSOR_ARM_V5, \l
1748     Q_PROCESSOR_ARM_V6, and \l Q_PROCESSOR_ARM_V7.
1749 
1750     \sa QSysInfo::buildCpuArchitecture()
1751 */
1752 /*!
1753     \macro Q_PROCESSOR_ARM_V5
1754     \relates <QtGlobal>
1755 
1756     Defined if the application is compiled for ARMv5 processors. The \l
1757     Q_PROCESSOR_ARM macro is also defined when Q_PROCESSOR_ARM_V5 is defined.
1758 
1759     \sa QSysInfo::buildCpuArchitecture()
1760 */
1761 /*!
1762     \macro Q_PROCESSOR_ARM_V6
1763     \relates <QtGlobal>
1764 
1765     Defined if the application is compiled for ARMv6 processors. The \l
1766     Q_PROCESSOR_ARM and \l Q_PROCESSOR_ARM_V5 macros are also defined when
1767     Q_PROCESSOR_ARM_V6 is defined.
1768 
1769     \sa QSysInfo::buildCpuArchitecture()
1770 */
1771 /*!
1772     \macro Q_PROCESSOR_ARM_V7
1773     \relates <QtGlobal>
1774 
1775     Defined if the application is compiled for ARMv7 processors. The \l
1776     Q_PROCESSOR_ARM, \l Q_PROCESSOR_ARM_V5, and \l Q_PROCESSOR_ARM_V6 macros
1777     are also defined when Q_PROCESSOR_ARM_V7 is defined.
1778 
1779     \sa QSysInfo::buildCpuArchitecture()
1780 */
1781 
1782 /*!
1783     \macro Q_PROCESSOR_AVR32
1784     \relates <QtGlobal>
1785 
1786     Defined if the application is compiled for AVR32 processors.
1787 
1788     \sa QSysInfo::buildCpuArchitecture()
1789 */
1790 
1791 /*!
1792     \macro Q_PROCESSOR_BLACKFIN
1793     \relates <QtGlobal>
1794 
1795     Defined if the application is compiled for Blackfin processors.
1796 
1797     \sa QSysInfo::buildCpuArchitecture()
1798 */
1799 
1800 /*!
1801     \macro Q_PROCESSOR_IA64
1802     \relates <QtGlobal>
1803 
1804     Defined if the application is compiled for IA-64 processors. This includes
1805     all Itanium and Itanium 2 processors.
1806 
1807     \sa QSysInfo::buildCpuArchitecture()
1808 */
1809 
1810 /*!
1811     \macro Q_PROCESSOR_MIPS
1812     \relates <QtGlobal>
1813 
1814     Defined if the application is compiled for MIPS processors. Qt currently
1815     supports seven MIPS revisions: \l Q_PROCESSOR_MIPS_I, \l
1816     Q_PROCESSOR_MIPS_II, \l Q_PROCESSOR_MIPS_III, \l Q_PROCESSOR_MIPS_IV, \l
1817     Q_PROCESSOR_MIPS_V, \l Q_PROCESSOR_MIPS_32, and \l Q_PROCESSOR_MIPS_64.
1818 
1819     \sa QSysInfo::buildCpuArchitecture()
1820 */
1821 /*!
1822     \macro Q_PROCESSOR_MIPS_I
1823     \relates <QtGlobal>
1824 
1825     Defined if the application is compiled for MIPS-I processors. The \l
1826     Q_PROCESSOR_MIPS macro is also defined when Q_PROCESSOR_MIPS_I is defined.
1827 
1828     \sa QSysInfo::buildCpuArchitecture()
1829 */
1830 /*!
1831     \macro Q_PROCESSOR_MIPS_II
1832     \relates <QtGlobal>
1833 
1834     Defined if the application is compiled for MIPS-II processors. The \l
1835     Q_PROCESSOR_MIPS and \l Q_PROCESSOR_MIPS_I macros are also defined when
1836     Q_PROCESSOR_MIPS_II is defined.
1837 
1838     \sa QSysInfo::buildCpuArchitecture()
1839 */
1840 /*!
1841     \macro Q_PROCESSOR_MIPS_32
1842     \relates <QtGlobal>
1843 
1844     Defined if the application is compiled for MIPS32 processors. The \l
1845     Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, and \l Q_PROCESSOR_MIPS_II macros
1846     are also defined when Q_PROCESSOR_MIPS_32 is defined.
1847 
1848     \sa QSysInfo::buildCpuArchitecture()
1849 */
1850 /*!
1851     \macro Q_PROCESSOR_MIPS_III
1852     \relates <QtGlobal>
1853 
1854     Defined if the application is compiled for MIPS-III processors. The \l
1855     Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, and \l Q_PROCESSOR_MIPS_II macros
1856     are also defined when Q_PROCESSOR_MIPS_III is defined.
1857 
1858     \sa QSysInfo::buildCpuArchitecture()
1859 */
1860 /*!
1861     \macro Q_PROCESSOR_MIPS_IV
1862     \relates <QtGlobal>
1863 
1864     Defined if the application is compiled for MIPS-IV processors. The \l
1865     Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, and \l
1866     Q_PROCESSOR_MIPS_III macros are also defined when Q_PROCESSOR_MIPS_IV is
1867     defined.
1868 
1869     \sa QSysInfo::buildCpuArchitecture()
1870 */
1871 /*!
1872     \macro Q_PROCESSOR_MIPS_V
1873     \relates <QtGlobal>
1874 
1875     Defined if the application is compiled for MIPS-V processors. The \l
1876     Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, \l
1877     Q_PROCESSOR_MIPS_III, and \l Q_PROCESSOR_MIPS_IV macros are also defined
1878     when Q_PROCESSOR_MIPS_V is defined.
1879 
1880     \sa QSysInfo::buildCpuArchitecture()
1881 */
1882 /*!
1883     \macro Q_PROCESSOR_MIPS_64
1884     \relates <QtGlobal>
1885 
1886     Defined if the application is compiled for MIPS64 processors. The \l
1887     Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, \l
1888     Q_PROCESSOR_MIPS_III, \l Q_PROCESSOR_MIPS_IV, and \l Q_PROCESSOR_MIPS_V
1889     macros are also defined when Q_PROCESSOR_MIPS_64 is defined.
1890 
1891     \sa QSysInfo::buildCpuArchitecture()
1892 */
1893 
1894 /*!
1895     \macro Q_PROCESSOR_POWER
1896     \relates <QtGlobal>
1897 
1898     Defined if the application is compiled for POWER processors. Qt currently
1899     supports two Power variants: \l Q_PROCESSOR_POWER_32 and \l
1900     Q_PROCESSOR_POWER_64.
1901 
1902     \sa QSysInfo::buildCpuArchitecture()
1903 */
1904 /*!
1905     \macro Q_PROCESSOR_POWER_32
1906     \relates <QtGlobal>
1907 
1908     Defined if the application is compiled for 32-bit Power processors. The \l
1909     Q_PROCESSOR_POWER macro is also defined when Q_PROCESSOR_POWER_32 is
1910     defined.
1911 
1912     \sa QSysInfo::buildCpuArchitecture()
1913 */
1914 /*!
1915     \macro Q_PROCESSOR_POWER_64
1916     \relates <QtGlobal>
1917 
1918     Defined if the application is compiled for 64-bit Power processors. The \l
1919     Q_PROCESSOR_POWER macro is also defined when Q_PROCESSOR_POWER_64 is
1920     defined.
1921 
1922     \sa QSysInfo::buildCpuArchitecture()
1923 */
1924 
1925 /*!
1926     \macro Q_PROCESSOR_RISCV
1927     \relates <QtGlobal>
1928     \since 5.13
1929 
1930     Defined if the application is compiled for RISC-V processors. Qt currently
1931     supports two RISC-V variants: \l Q_PROCESSOR_RISCV_32 and \l
1932     Q_PROCESSOR_RISCV_64.
1933 
1934     \sa QSysInfo::buildCpuArchitecture()
1935 */
1936 
1937 /*!
1938     \macro Q_PROCESSOR_RISCV_32
1939     \relates <QtGlobal>
1940     \since 5.13
1941 
1942     Defined if the application is compiled for 32-bit RISC-V processors. The \l
1943     Q_PROCESSOR_RISCV macro is also defined when Q_PROCESSOR_RISCV_32 is
1944     defined.
1945 
1946     \sa QSysInfo::buildCpuArchitecture()
1947 */
1948 
1949 /*!
1950     \macro Q_PROCESSOR_RISCV_64
1951     \relates <QtGlobal>
1952     \since 5.13
1953 
1954     Defined if the application is compiled for 64-bit RISC-V processors. The \l
1955     Q_PROCESSOR_RISCV macro is also defined when Q_PROCESSOR_RISCV_64 is
1956     defined.
1957 
1958     \sa QSysInfo::buildCpuArchitecture()
1959 */
1960 
1961 /*!
1962     \macro Q_PROCESSOR_S390
1963     \relates <QtGlobal>
1964 
1965     Defined if the application is compiled for S/390 processors. Qt supports
1966     one optional variant of S/390: Q_PROCESSOR_S390_X.
1967 
1968     \sa QSysInfo::buildCpuArchitecture()
1969 */
1970 /*!
1971     \macro Q_PROCESSOR_S390_X
1972     \relates <QtGlobal>
1973 
1974     Defined if the application is compiled for S/390x processors. The \l
1975     Q_PROCESSOR_S390 macro is also defined when Q_PROCESSOR_S390_X is defined.
1976 
1977     \sa QSysInfo::buildCpuArchitecture()
1978 */
1979 
1980 /*!
1981     \macro Q_PROCESSOR_SH
1982     \relates <QtGlobal>
1983 
1984     Defined if the application is compiled for SuperH processors. Qt currently
1985     supports one SuperH revision: \l Q_PROCESSOR_SH_4A.
1986 
1987     \sa QSysInfo::buildCpuArchitecture()
1988 */
1989 /*!
1990     \macro Q_PROCESSOR_SH_4A
1991     \relates <QtGlobal>
1992 
1993     Defined if the application is compiled for SuperH 4A processors. The \l
1994     Q_PROCESSOR_SH macro is also defined when Q_PROCESSOR_SH_4A is defined.
1995 
1996     \sa QSysInfo::buildCpuArchitecture()
1997 */
1998 
1999 /*!
2000     \macro Q_PROCESSOR_SPARC
2001     \relates <QtGlobal>
2002 
2003     Defined if the application is compiled for SPARC processors. Qt currently
2004     supports one optional SPARC revision: \l Q_PROCESSOR_SPARC_V9.
2005 
2006     \sa QSysInfo::buildCpuArchitecture()
2007 */
2008 /*!
2009     \macro Q_PROCESSOR_SPARC_V9
2010     \relates <QtGlobal>
2011 
2012     Defined if the application is compiled for SPARC V9 processors. The \l
2013     Q_PROCESSOR_SPARC macro is also defined when Q_PROCESSOR_SPARC_V9 is
2014     defined.
2015 
2016     \sa QSysInfo::buildCpuArchitecture()
2017 */
2018 
2019 /*!
2020     \macro Q_PROCESSOR_X86
2021     \relates <QtGlobal>
2022 
2023     Defined if the application is compiled for x86 processors. Qt currently
2024     supports two x86 variants: \l Q_PROCESSOR_X86_32 and \l Q_PROCESSOR_X86_64.
2025 
2026     \sa QSysInfo::buildCpuArchitecture()
2027 */
2028 /*!
2029     \macro Q_PROCESSOR_X86_32
2030     \relates <QtGlobal>
2031 
2032     Defined if the application is compiled for 32-bit x86 processors. This
2033     includes all i386, i486, i586, and i686 processors. The \l Q_PROCESSOR_X86
2034     macro is also defined when Q_PROCESSOR_X86_32 is defined.
2035 
2036     \sa QSysInfo::buildCpuArchitecture()
2037 */
2038 /*!
2039     \macro Q_PROCESSOR_X86_64
2040     \relates <QtGlobal>
2041 
2042     Defined if the application is compiled for 64-bit x86 processors. This
2043     includes all AMD64, Intel 64, and other x86_64/x64 processors. The \l
2044     Q_PROCESSOR_X86 macro is also defined when Q_PROCESSOR_X86_64 is defined.
2045 
2046     \sa QSysInfo::buildCpuArchitecture()
2047 */
2048 
2049 /*!
2050   \macro QT_DISABLE_DEPRECATED_BEFORE
2051   \relates <QtGlobal>
2052 
2053   This macro can be defined in the project file to disable functions deprecated in
2054   a specified version of Qt or any earlier version. The default version number is 5.0,
2055   meaning that functions deprecated in or before Qt 5.0 will not be included.
2056 
2057   For instance, when using a future release of Qt 5, set
2058   \c{QT_DISABLE_DEPRECATED_BEFORE=0x050100} to disable functions deprecated in
2059   Qt 5.1 and earlier. In any release, set
2060   \c{QT_DISABLE_DEPRECATED_BEFORE=0x000000} to enable all functions, including
2061   the ones deprecated in Qt 5.0.
2062 
2063   \sa QT_DEPRECATED_WARNINGS
2064  */
2065 
2066 
2067 /*!
2068   \macro QT_DEPRECATED_WARNINGS
2069   \relates <QtGlobal>
2070 
2071   Since Qt 5.13, this macro has no effect. In Qt 5.12 and before, if this macro
2072   is defined, the compiler will generate warnings if any API declared as
2073   deprecated by Qt is used.
2074 
2075   \sa QT_DISABLE_DEPRECATED_BEFORE, QT_NO_DEPRECATED_WARNINGS
2076  */
2077 
2078 /*!
2079   \macro QT_NO_DEPRECATED_WARNINGS
2080   \relates <QtGlobal>
2081   \since 5.13
2082 
2083   This macro can be used to suppress deprecation warnings that would otherwise
2084   be generated when using deprecated APIs.
2085 
2086   \sa QT_DISABLE_DEPRECATED_BEFORE
2087 */
2088 
2089 #if defined(QT_BUILD_QMAKE)
2090 // needed to bootstrap qmake
2091 static const unsigned int qt_one = 1;
2092 const int QSysInfo::ByteOrder = ((*((unsigned char *) &qt_one) == 0) ? BigEndian : LittleEndian);
2093 #endif
2094 
2095 #if defined(Q_OS_MAC)
2096 
2097 QT_BEGIN_INCLUDE_NAMESPACE
2098 #include "private/qcore_mac_p.h"
2099 #include "qnamespace.h"
2100 QT_END_INCLUDE_NAMESPACE
2101 
2102 #if QT_DEPRECATED_SINCE(5, 9)
2103 QT_WARNING_PUSH
2104 QT_WARNING_DISABLE_DEPRECATED
macVersion()2105 QSysInfo::MacVersion QSysInfo::macVersion()
2106 {
2107     const auto version = QOperatingSystemVersion::current();
2108 #if defined(Q_OS_MACOS)
2109     return QSysInfo::MacVersion(Q_MV_OSX(version.majorVersion(), version.minorVersion()));
2110 #elif defined(Q_OS_IOS)
2111     return QSysInfo::MacVersion(Q_MV_IOS(version.majorVersion(), version.minorVersion()));
2112 #elif defined(Q_OS_TVOS)
2113     return QSysInfo::MacVersion(Q_MV_TVOS(version.majorVersion(), version.minorVersion()));
2114 #elif defined(Q_OS_WATCHOS)
2115     return QSysInfo::MacVersion(Q_MV_WATCHOS(version.majorVersion(), version.minorVersion()));
2116 #else
2117     return QSysInfo::MV_Unknown;
2118 #endif
2119 }
2120 const QSysInfo::MacVersion QSysInfo::MacintoshVersion = QSysInfo::macVersion();
2121 QT_WARNING_POP
2122 #endif
2123 
2124 #ifdef Q_OS_DARWIN
osVer_helper(QOperatingSystemVersion version=QOperatingSystemVersion::current ())2125 static const char *osVer_helper(QOperatingSystemVersion version = QOperatingSystemVersion::current())
2126 {
2127 #ifdef Q_OS_MACOS
2128     if (version.majorVersion() == 10) {
2129         switch (version.minorVersion()) {
2130         case 9:
2131             return "Mavericks";
2132         case 10:
2133             return "Yosemite";
2134         case 11:
2135             return "El Capitan";
2136         case 12:
2137             return "Sierra";
2138         case 13:
2139             return "High Sierra";
2140         case 14:
2141             return "Mojave";
2142         }
2143     }
2144     // unknown, future version
2145 #else
2146     Q_UNUSED(version);
2147 #endif
2148     return 0;
2149 }
2150 #endif
2151 
2152 #elif defined(Q_OS_WIN) || defined(Q_OS_CYGWIN) || defined(Q_OS_WINRT)
2153 
2154 QT_BEGIN_INCLUDE_NAMESPACE
2155 #include "qt_windows.h"
2156 QT_END_INCLUDE_NAMESPACE
2157 
2158 #  ifndef QT_BOOTSTRAPPED
2159 class QWindowsSockInit
2160 {
2161 public:
2162     QWindowsSockInit();
2163     ~QWindowsSockInit();
2164     int version;
2165 };
2166 
QWindowsSockInit()2167 QWindowsSockInit::QWindowsSockInit()
2168 :   version(0)
2169 {
2170     //### should we try for 2.2 on all platforms ??
2171     WSAData wsadata;
2172 
2173     // IPv6 requires Winsock v2.0 or better.
2174     if (WSAStartup(MAKEWORD(2,0), &wsadata) != 0) {
2175         qWarning("QTcpSocketAPI: WinSock v2.0 initialization failed.");
2176     } else {
2177         version = 0x20;
2178     }
2179 }
2180 
~QWindowsSockInit()2181 QWindowsSockInit::~QWindowsSockInit()
2182 {
2183     WSACleanup();
2184 }
Q_GLOBAL_STATIC(QWindowsSockInit,winsockInit)2185 Q_GLOBAL_STATIC(QWindowsSockInit, winsockInit)
2186 #  endif // QT_BOOTSTRAPPED
2187 
2188 #if QT_DEPRECATED_SINCE(5, 9)
2189 QT_WARNING_PUSH
2190 QT_WARNING_DISABLE_DEPRECATED
2191 QSysInfo::WinVersion QSysInfo::windowsVersion()
2192 {
2193     const auto version = QOperatingSystemVersion::current();
2194     if (version.majorVersion() == 6 && version.minorVersion() == 1)
2195         return QSysInfo::WV_WINDOWS7;
2196     if (version.majorVersion() == 6 && version.minorVersion() == 2)
2197         return QSysInfo::WV_WINDOWS8;
2198     if (version.majorVersion() == 6 && version.minorVersion() == 3)
2199         return QSysInfo::WV_WINDOWS8_1;
2200     if (version.majorVersion() == 10 && version.minorVersion() == 0)
2201         return QSysInfo::WV_WINDOWS10;
2202     return QSysInfo::WV_NT_based;
2203 }
2204 const QSysInfo::WinVersion QSysInfo::WindowsVersion = QSysInfo::windowsVersion();
2205 QT_WARNING_POP
2206 #endif
2207 
readVersionRegistryString(const wchar_t * subKey)2208 static QString readVersionRegistryString(const wchar_t *subKey)
2209 {
2210 #if !defined(QT_BUILD_QMAKE) && !defined(Q_OS_WINRT)
2211      return QWinRegistryKey(HKEY_LOCAL_MACHINE, LR"(SOFTWARE\Microsoft\Windows NT\CurrentVersion)")
2212             .stringValue(subKey);
2213 #else
2214      Q_UNUSED(subKey);
2215      return QString();
2216 #endif
2217 }
2218 
windows10ReleaseId()2219 static inline QString windows10ReleaseId()
2220 {
2221     return readVersionRegistryString(L"ReleaseId");
2222 }
2223 
windows7Build()2224 static inline QString windows7Build()
2225 {
2226     return readVersionRegistryString(L"CurrentBuild");
2227 }
2228 
winSp_helper()2229 static QString winSp_helper()
2230 {
2231     const auto osv = qWindowsVersionInfo();
2232     const qint16 major = osv.wServicePackMajor;
2233     if (major) {
2234         QString sp = QStringLiteral("SP ") + QString::number(major);
2235         const qint16 minor = osv.wServicePackMinor;
2236         if (minor)
2237             sp += QLatin1Char('.') + QString::number(minor);
2238 
2239         return sp;
2240     }
2241     return QString();
2242 }
2243 
osVer_helper(QOperatingSystemVersion version=QOperatingSystemVersion::current ())2244 static const char *osVer_helper(QOperatingSystemVersion version = QOperatingSystemVersion::current())
2245 {
2246     Q_UNUSED(version);
2247     const OSVERSIONINFOEX osver = qWindowsVersionInfo();
2248     const bool workstation = osver.wProductType == VER_NT_WORKSTATION;
2249 
2250 #define Q_WINVER(major, minor) (major << 8 | minor)
2251     switch (Q_WINVER(osver.dwMajorVersion, osver.dwMinorVersion)) {
2252     case Q_WINVER(6, 1):
2253         return workstation ? "7" : "Server 2008 R2";
2254     case Q_WINVER(6, 2):
2255         return workstation ? "8" : "Server 2012";
2256     case Q_WINVER(6, 3):
2257         return workstation ? "8.1" : "Server 2012 R2";
2258     case Q_WINVER(10, 0):
2259         return workstation ? "10" : "Server 2016";
2260     }
2261 #undef Q_WINVER
2262     // unknown, future version
2263     return 0;
2264 }
2265 
2266 #endif
2267 #if defined(Q_OS_UNIX)
2268 #  if (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || defined(Q_OS_FREEBSD)
2269 #    define USE_ETC_OS_RELEASE
2270 struct QUnixOSVersion
2271 {
2272                                     // from /etc/os-release         older /etc/lsb-release         // redhat /etc/redhat-release         // debian /etc/debian_version
2273     QString productType;            // $ID                          $DISTRIB_ID                    // single line file containing:       // Debian
2274     QString productVersion;         // $VERSION_ID                  $DISTRIB_RELEASE               // <Vendor_ID release Version_ID>     // single line file <Release_ID/sid>
2275     QString prettyName;             // $PRETTY_NAME                 $DISTRIB_DESCRIPTION
2276 };
2277 
unquote(const char * begin,const char * end)2278 static QString unquote(const char *begin, const char *end)
2279 {
2280     // man os-release says:
2281     // Variable assignment values must be enclosed in double
2282     // or single quotes if they include spaces, semicolons or
2283     // other special characters outside of A–Z, a–z, 0–9. Shell
2284     // special characters ("$", quotes, backslash, backtick)
2285     // must be escaped with backslashes, following shell style.
2286     // All strings should be in UTF-8 format, and non-printable
2287     // characters should not be used. It is not supported to
2288     // concatenate multiple individually quoted strings.
2289     if (*begin == '"') {
2290         Q_ASSERT(end[-1] == '"');
2291         return QString::fromUtf8(begin + 1, end - begin - 2);
2292     }
2293     return QString::fromUtf8(begin, end - begin);
2294 }
getEtcFileContent(const char * filename)2295 static QByteArray getEtcFileContent(const char *filename)
2296 {
2297     // we're avoiding QFile here
2298     int fd = qt_safe_open(filename, O_RDONLY);
2299     if (fd == -1)
2300         return QByteArray();
2301 
2302     QT_STATBUF sbuf;
2303     if (QT_FSTAT(fd, &sbuf) == -1) {
2304         qt_safe_close(fd);
2305         return QByteArray();
2306     }
2307 
2308     QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
2309     buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size));
2310     qt_safe_close(fd);
2311     return buffer;
2312 }
2313 
readEtcFile(QUnixOSVersion & v,const char * filename,const QByteArray & idKey,const QByteArray & versionKey,const QByteArray & prettyNameKey)2314 static bool readEtcFile(QUnixOSVersion &v, const char *filename,
2315                         const QByteArray &idKey, const QByteArray &versionKey, const QByteArray &prettyNameKey)
2316 {
2317 
2318     QByteArray buffer = getEtcFileContent(filename);
2319     if (buffer.isEmpty())
2320         return false;
2321 
2322     const char *ptr = buffer.constData();
2323     const char *end = buffer.constEnd();
2324     const char *eol;
2325     QByteArray line;
2326     for ( ; ptr != end; ptr = eol + 1) {
2327         // find the end of the line after ptr
2328         eol = static_cast<const char *>(memchr(ptr, '\n', end - ptr));
2329         if (!eol)
2330             eol = end - 1;
2331         line.setRawData(ptr, eol - ptr);
2332 
2333         if (line.startsWith(idKey)) {
2334             ptr += idKey.length();
2335             v.productType = unquote(ptr, eol);
2336             continue;
2337         }
2338 
2339         if (line.startsWith(prettyNameKey)) {
2340             ptr += prettyNameKey.length();
2341             v.prettyName = unquote(ptr, eol);
2342             continue;
2343         }
2344 
2345         if (line.startsWith(versionKey)) {
2346             ptr += versionKey.length();
2347             v.productVersion = unquote(ptr, eol);
2348             continue;
2349         }
2350     }
2351 
2352     return true;
2353 }
2354 
readOsRelease(QUnixOSVersion & v)2355 static bool readOsRelease(QUnixOSVersion &v)
2356 {
2357     QByteArray id = QByteArrayLiteral("ID=");
2358     QByteArray versionId = QByteArrayLiteral("VERSION_ID=");
2359     QByteArray prettyName = QByteArrayLiteral("PRETTY_NAME=");
2360 
2361     // man os-release(5) says:
2362     // The file /etc/os-release takes precedence over /usr/lib/os-release.
2363     // Applications should check for the former, and exclusively use its data
2364     // if it exists, and only fall back to /usr/lib/os-release if it is
2365     // missing.
2366     return readEtcFile(v, "/etc/os-release", id, versionId, prettyName) ||
2367             readEtcFile(v, "/usr/lib/os-release", id, versionId, prettyName);
2368 }
2369 
readEtcLsbRelease(QUnixOSVersion & v)2370 static bool readEtcLsbRelease(QUnixOSVersion &v)
2371 {
2372     bool ok = readEtcFile(v, "/etc/lsb-release", QByteArrayLiteral("DISTRIB_ID="),
2373                           QByteArrayLiteral("DISTRIB_RELEASE="), QByteArrayLiteral("DISTRIB_DESCRIPTION="));
2374     if (ok && (v.prettyName.isEmpty() || v.prettyName == v.productType)) {
2375         // some distributions have redundant information for the pretty name,
2376         // so try /etc/<lowercasename>-release
2377 
2378         // we're still avoiding QFile here
2379         QByteArray distrorelease = "/etc/" + v.productType.toLatin1().toLower() + "-release";
2380         int fd = qt_safe_open(distrorelease, O_RDONLY);
2381         if (fd != -1) {
2382             QT_STATBUF sbuf;
2383             if (QT_FSTAT(fd, &sbuf) != -1 && sbuf.st_size > v.prettyName.length()) {
2384                 // file apparently contains interesting information
2385                 QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
2386                 buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size));
2387                 v.prettyName = QString::fromLatin1(buffer.trimmed());
2388             }
2389             qt_safe_close(fd);
2390         }
2391     }
2392 
2393     // some distributions have a /etc/lsb-release file that does not provide the values
2394     // we are looking for, i.e. DISTRIB_ID, DISTRIB_RELEASE and DISTRIB_DESCRIPTION.
2395     // Assuming that neither DISTRIB_ID nor DISTRIB_RELEASE were found, or contained valid values,
2396     // returning false for readEtcLsbRelease will allow further /etc/<lowercasename>-release parsing.
2397     return ok && !(v.productType.isEmpty() && v.productVersion.isEmpty());
2398 }
2399 
2400 #if defined(Q_OS_LINUX)
getEtcFileFirstLine(const char * fileName)2401 static QByteArray getEtcFileFirstLine(const char *fileName)
2402 {
2403     QByteArray buffer = getEtcFileContent(fileName);
2404     if (buffer.isEmpty())
2405         return QByteArray();
2406 
2407     const char *ptr = buffer.constData();
2408     int eol = buffer.indexOf("\n");
2409     return QByteArray(ptr, eol).trimmed();
2410 }
2411 
readEtcRedHatRelease(QUnixOSVersion & v)2412 static bool readEtcRedHatRelease(QUnixOSVersion &v)
2413 {
2414     // /etc/redhat-release analysed should be a one line file
2415     // the format of its content is <Vendor_ID release Version>
2416     // i.e. "Red Hat Enterprise Linux Workstation release 6.5 (Santiago)"
2417     QByteArray line = getEtcFileFirstLine("/etc/redhat-release");
2418     if (line.isEmpty())
2419         return false;
2420 
2421     v.prettyName = QString::fromLatin1(line);
2422 
2423     const char keyword[] = "release ";
2424     int releaseIndex = line.indexOf(keyword);
2425     v.productType = QString::fromLatin1(line.mid(0, releaseIndex)).remove(QLatin1Char(' '));
2426     int spaceIndex = line.indexOf(' ', releaseIndex + strlen(keyword));
2427     v.productVersion = QString::fromLatin1(line.mid(releaseIndex + strlen(keyword),
2428                                                     spaceIndex > -1 ? spaceIndex - releaseIndex - int(strlen(keyword)) : -1));
2429     return true;
2430 }
2431 
readEtcDebianVersion(QUnixOSVersion & v)2432 static bool readEtcDebianVersion(QUnixOSVersion &v)
2433 {
2434     // /etc/debian_version analysed should be a one line file
2435     // the format of its content is <Release_ID/sid>
2436     // i.e. "jessie/sid"
2437     QByteArray line = getEtcFileFirstLine("/etc/debian_version");
2438     if (line.isEmpty())
2439         return false;
2440 
2441     v.productType = QStringLiteral("Debian");
2442     v.productVersion = QString::fromLatin1(line);
2443     return true;
2444 }
2445 #endif
2446 
findUnixOsVersion(QUnixOSVersion & v)2447 static bool findUnixOsVersion(QUnixOSVersion &v)
2448 {
2449     if (readOsRelease(v))
2450         return true;
2451     if (readEtcLsbRelease(v))
2452         return true;
2453 #if defined(Q_OS_LINUX)
2454     if (readEtcRedHatRelease(v))
2455         return true;
2456     if (readEtcDebianVersion(v))
2457         return true;
2458 #endif
2459     return false;
2460 }
2461 #  endif // USE_ETC_OS_RELEASE
2462 #endif // Q_OS_UNIX
2463 
2464 #if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
osVer_helper(QOperatingSystemVersion)2465 static const char *osVer_helper(QOperatingSystemVersion)
2466 {
2467 /* Data:
2468 
2469 
2470 
2471 Cupcake
2472 Donut
2473 Eclair
2474 Eclair
2475 Eclair
2476 Froyo
2477 Gingerbread
2478 Gingerbread
2479 Honeycomb
2480 Honeycomb
2481 Honeycomb
2482 Ice Cream Sandwich
2483 Ice Cream Sandwich
2484 Jelly Bean
2485 Jelly Bean
2486 Jelly Bean
2487 KitKat
2488 KitKat
2489 Lollipop
2490 Lollipop
2491 Marshmallow
2492 Nougat
2493 Nougat
2494 Oreo
2495  */
2496     static const char versions_string[] =
2497         "\0"
2498         "Cupcake\0"
2499         "Donut\0"
2500         "Eclair\0"
2501         "Froyo\0"
2502         "Gingerbread\0"
2503         "Honeycomb\0"
2504         "Ice Cream Sandwich\0"
2505         "Jelly Bean\0"
2506         "KitKat\0"
2507         "Lollipop\0"
2508         "Marshmallow\0"
2509         "Nougat\0"
2510         "Oreo\0"
2511         "\0";
2512 
2513     static const int versions_indices[] = {
2514            0,    0,    0,    1,    9,   15,   15,   15,
2515           22,   28,   28,   40,   40,   40,   50,   50,
2516           69,   69,   69,   80,   80,   87,   87,   96,
2517          108,  108,  115,   -1
2518     };
2519 
2520     static const int versions_count = (sizeof versions_indices) / (sizeof versions_indices[0]);
2521 
2522     // https://source.android.com/source/build-numbers.html
2523     // https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels
2524     const int sdk_int = QJNIObjectPrivate::getStaticField<jint>("android/os/Build$VERSION", "SDK_INT");
2525     return &versions_string[versions_indices[qBound(0, sdk_int, versions_count - 1)]];
2526 }
2527 #endif
2528 
2529 /*!
2530     \since 5.4
2531 
2532     Returns the architecture of the CPU that Qt was compiled for, in text
2533     format. Note that this may not match the actual CPU that the application is
2534     running on if there's an emulation layer or if the CPU supports multiple
2535     architectures (like x86-64 processors supporting i386 applications). To
2536     detect that, use currentCpuArchitecture().
2537 
2538     Values returned by this function are stable and will not change over time,
2539     so applications can rely on the returned value as an identifier, except
2540     that new CPU types may be added over time.
2541 
2542     Typical returned values are (note: list not exhaustive):
2543     \list
2544         \li "arm"
2545         \li "arm64"
2546         \li "i386"
2547         \li "ia64"
2548         \li "mips"
2549         \li "mips64"
2550         \li "power"
2551         \li "power64"
2552         \li "sparc"
2553         \li "sparcv9"
2554         \li "x86_64"
2555     \endlist
2556 
2557     \sa QSysInfo::buildAbi(), QSysInfo::currentCpuArchitecture()
2558 */
buildCpuArchitecture()2559 QString QSysInfo::buildCpuArchitecture()
2560 {
2561     return QStringLiteral(ARCH_PROCESSOR);
2562 }
2563 
2564 /*!
2565     \since 5.4
2566 
2567     Returns the architecture of the CPU that the application is running on, in
2568     text format. Note that this function depends on what the OS will report and
2569     may not detect the actual CPU architecture if the OS hides that information
2570     or is unable to provide it. For example, a 32-bit OS running on a 64-bit
2571     CPU is usually unable to determine the CPU is actually capable of running
2572     64-bit programs.
2573 
2574     Values returned by this function are mostly stable: an attempt will be made
2575     to ensure that they stay constant over time and match the values returned
2576     by QSysInfo::builldCpuArchitecture(). However, due to the nature of the
2577     operating system functions being used, there may be discrepancies.
2578 
2579     Typical returned values are (note: list not exhaustive):
2580     \list
2581         \li "arm"
2582         \li "arm64"
2583         \li "i386"
2584         \li "ia64"
2585         \li "mips"
2586         \li "mips64"
2587         \li "power"
2588         \li "power64"
2589         \li "sparc"
2590         \li "sparcv9"
2591         \li "x86_64"
2592     \endlist
2593 
2594     \sa QSysInfo::buildAbi(), QSysInfo::buildCpuArchitecture()
2595  */
currentCpuArchitecture()2596 QString QSysInfo::currentCpuArchitecture()
2597 {
2598 #if defined(Q_OS_WIN)
2599     // We don't need to catch all the CPU architectures in this function;
2600     // only those where the host CPU might be different than the build target
2601     // (usually, 64-bit platforms).
2602     SYSTEM_INFO info;
2603     GetNativeSystemInfo(&info);
2604     switch (info.wProcessorArchitecture) {
2605 #  ifdef PROCESSOR_ARCHITECTURE_AMD64
2606     case PROCESSOR_ARCHITECTURE_AMD64:
2607         return QStringLiteral("x86_64");
2608 #  endif
2609 #  ifdef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64
2610     case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
2611 #  endif
2612     case PROCESSOR_ARCHITECTURE_IA64:
2613         return QStringLiteral("ia64");
2614     }
2615 #elif defined(Q_OS_DARWIN) && !defined(Q_OS_MACOS)
2616     // iOS-based OSes do not return the architecture on uname(2)'s result.
2617     return buildCpuArchitecture();
2618 #elif defined(Q_OS_UNIX)
2619     long ret = -1;
2620     struct utsname u;
2621 
2622 #  if defined(Q_OS_SOLARIS)
2623     // We need a special call for Solaris because uname(2) on x86 returns "i86pc" for
2624     // both 32- and 64-bit CPUs. Reference:
2625     // http://docs.oracle.com/cd/E18752_01/html/816-5167/sysinfo-2.html#REFMAN2sysinfo-2
2626     // http://fxr.watson.org/fxr/source/common/syscall/systeminfo.c?v=OPENSOLARIS
2627     // http://fxr.watson.org/fxr/source/common/conf/param.c?v=OPENSOLARIS;im=10#L530
2628     if (ret == -1)
2629         ret = sysinfo(SI_ARCHITECTURE_64, u.machine, sizeof u.machine);
2630 #  endif
2631 
2632     if (ret == -1)
2633         ret = uname(&u);
2634 
2635     // we could use detectUnixVersion() above, but we only need a field no other function does
2636     if (ret != -1) {
2637         // the use of QT_BUILD_INTERNAL here is simply to ensure all branches build
2638         // as we don't often build on some of the less common platforms
2639 #  if defined(Q_PROCESSOR_ARM) || defined(QT_BUILD_INTERNAL)
2640         if (strcmp(u.machine, "aarch64") == 0)
2641             return QStringLiteral("arm64");
2642         if (strncmp(u.machine, "armv", 4) == 0)
2643             return QStringLiteral("arm");
2644 #  endif
2645 #  if defined(Q_PROCESSOR_POWER) || defined(QT_BUILD_INTERNAL)
2646         // harmonize "powerpc" and "ppc" to "power"
2647         if (strncmp(u.machine, "ppc", 3) == 0)
2648             return QLatin1String("power") + QLatin1String(u.machine + 3);
2649         if (strncmp(u.machine, "powerpc", 7) == 0)
2650             return QLatin1String("power") + QLatin1String(u.machine + 7);
2651         if (strcmp(u.machine, "Power Macintosh") == 0)
2652             return QLatin1String("power");
2653 #  endif
2654 #  if defined(Q_PROCESSOR_SPARC) || defined(QT_BUILD_INTERNAL)
2655         // Solaris sysinfo(2) (above) uses "sparcv9", but uname -m says "sun4u";
2656         // Linux says "sparc64"
2657         if (strcmp(u.machine, "sun4u") == 0 || strcmp(u.machine, "sparc64") == 0)
2658             return QStringLiteral("sparcv9");
2659         if (strcmp(u.machine, "sparc32") == 0)
2660             return QStringLiteral("sparc");
2661 #  endif
2662 #  if defined(Q_PROCESSOR_X86) || defined(QT_BUILD_INTERNAL)
2663         // harmonize all "i?86" to "i386"
2664         if (strlen(u.machine) == 4 && u.machine[0] == 'i'
2665                 && u.machine[2] == '8' && u.machine[3] == '6')
2666             return QStringLiteral("i386");
2667         if (strcmp(u.machine, "amd64") == 0) // Solaris
2668             return QStringLiteral("x86_64");
2669 #  endif
2670         return QString::fromLatin1(u.machine);
2671     }
2672 #endif
2673     return buildCpuArchitecture();
2674 }
2675 
2676 /*!
2677     \since 5.4
2678 
2679     Returns the full architecture string that Qt was compiled for. This string
2680     is useful for identifying different, incompatible builds. For example, it
2681     can be used as an identifier to request an upgrade package from a server.
2682 
2683     The values returned from this function are kept stable as follows: the
2684     mandatory components of the result will not change in future versions of
2685     Qt, but optional suffixes may be added.
2686 
2687     The returned value is composed of three or more parts, separated by dashes
2688     ("-"). They are:
2689 
2690     \table
2691     \header \li Component           \li Value
2692     \row    \li CPU Architecture    \li The same as QSysInfo::buildCpuArchitecture(), such as "arm", "i386", "mips" or "x86_64"
2693     \row    \li Endianness          \li "little_endian" or "big_endian"
2694     \row    \li Word size           \li Whether it's a 32- or 64-bit application. Possible values are:
2695                                         "llp64" (Windows 64-bit), "lp64" (Unix 64-bit), "ilp32" (32-bit)
2696     \row    \li (Optional) ABI      \li Zero or more components identifying different ABIs possible in this architecture.
2697                                         Currently, Qt has optional ABI components for ARM and MIPS processors: one
2698                                         component is the main ABI (such as "eabi", "o32", "n32", "o64"); another is
2699                                         whether the calling convention is using hardware floating point registers ("hardfloat"
2700                                         is present).
2701 
2702                                         Additionally, if Qt was configured with \c{-qreal float}, the ABI option tag "qreal_float"
2703                                         will be present. If Qt was configured with another type as qreal, that type is present after
2704                                         "qreal_", with all characters other than letters and digits escaped by an underscore, followed
2705                                         by two hex digits. For example, \c{-qreal long double} becomes "qreal_long_20double".
2706     \endtable
2707 
2708     \sa QSysInfo::buildCpuArchitecture()
2709 */
buildAbi()2710 QString QSysInfo::buildAbi()
2711 {
2712 #ifdef Q_COMPILER_UNICODE_STRINGS
2713     // ARCH_FULL is a concatenation of strings (incl. ARCH_PROCESSOR), which breaks
2714     // QStringLiteral on MSVC. Since the concatenation behavior we want is specified
2715     // the same C++11 paper as the Unicode strings, we'll use that macro and hope
2716     // that Microsoft implements the new behavior when they add support for Unicode strings.
2717     return QStringLiteral(ARCH_FULL);
2718 #else
2719     return QLatin1String(ARCH_FULL);
2720 #endif
2721 }
2722 
unknownText()2723 static QString unknownText()
2724 {
2725     return QStringLiteral("unknown");
2726 }
2727 
2728 /*!
2729     \since 5.4
2730 
2731     Returns the type of the operating system kernel Qt was compiled for. It's
2732     also the kernel the application is running on, unless the host operating
2733     system is running a form of compatibility or virtualization layer.
2734 
2735     Values returned by this function are stable and will not change over time,
2736     so applications can rely on the returned value as an identifier, except
2737     that new OS kernel types may be added over time.
2738 
2739     On Windows, this function returns the type of Windows kernel, like "winnt".
2740     On Unix systems, it returns the same as the output of \c{uname
2741     -s} (lowercased).
2742 
2743     \note This function may return surprising values: it returns "linux"
2744     for all operating systems running Linux (including Android), "qnx" for all
2745     operating systems running QNX, "freebsd" for
2746     Debian/kFreeBSD, and "darwin" for \macos and iOS. For information on the type
2747     of product the application is running on, see productType().
2748 
2749     \sa QFileSelector, kernelVersion(), productType(), productVersion(), prettyProductName()
2750 */
kernelType()2751 QString QSysInfo::kernelType()
2752 {
2753 #if defined(Q_OS_WIN)
2754     return QStringLiteral("winnt");
2755 #elif defined(Q_OS_UNIX)
2756     struct utsname u;
2757     if (uname(&u) == 0)
2758         return QString::fromLatin1(u.sysname).toLower();
2759 #endif
2760     return unknownText();
2761 }
2762 
2763 /*!
2764     \since 5.4
2765 
2766     Returns the release version of the operating system kernel. On Windows, it
2767     returns the version of the NT kernel. On Unix systems, including
2768     Android and \macos, it returns the same as the \c{uname -r}
2769     command would return.
2770 
2771     If the version could not be determined, this function may return an empty
2772     string.
2773 
2774     \sa kernelType(), productType(), productVersion(), prettyProductName()
2775 */
kernelVersion()2776 QString QSysInfo::kernelVersion()
2777 {
2778 #ifdef Q_OS_WIN
2779     const auto osver = QOperatingSystemVersion::current();
2780     return QString::number(osver.majorVersion()) + QLatin1Char('.') + QString::number(osver.minorVersion())
2781             + QLatin1Char('.') + QString::number(osver.microVersion());
2782 #else
2783     struct utsname u;
2784     if (uname(&u) == 0)
2785         return QString::fromLatin1(u.release);
2786     return QString();
2787 #endif
2788 }
2789 
2790 
2791 /*!
2792     \since 5.4
2793 
2794     Returns the product name of the operating system this application is
2795     running in. If the application is running on some sort of emulation or
2796     virtualization layer (such as WINE on a Unix system), this function will
2797     inspect the emulation / virtualization layer.
2798 
2799     Values returned by this function are stable and will not change over time,
2800     so applications can rely on the returned value as an identifier, except
2801     that new OS types may be added over time.
2802 
2803     \b{Linux and Android note}: this function returns "android" for Linux
2804     systems running Android userspace, notably when using the Bionic library.
2805     For all other Linux systems, regardless of C library being used, it tries
2806     to determine the distribution name and returns that. If determining the
2807     distribution name failed, it returns "unknown".
2808 
2809     \b{\macos note}: this function returns "osx" for all \macos systems,
2810     regardless of Apple naming convention. The returned string will be updated
2811     for Qt 6. Note that this function erroneously returned "macos" for \macos
2812     10.12 in Qt versions 5.6.2, 5.7.1, and 5.8.0.
2813 
2814     \b{Darwin, iOS, tvOS, and watchOS note}: this function returns "ios" for
2815     iOS systems, "tvos" for tvOS systems, "watchos" for watchOS systems, and
2816     "darwin" in case the system could not be determined.
2817 
2818     \b{FreeBSD note}: this function returns "debian" for Debian/kFreeBSD and
2819     "unknown" otherwise.
2820 
2821     \b{Windows note}: this function "winrt" for WinRT builds, and "windows"
2822     for normal desktop builds.
2823 
2824     For other Unix-type systems, this function usually returns "unknown".
2825 
2826     \sa QFileSelector, kernelType(), kernelVersion(), productVersion(), prettyProductName()
2827 */
productType()2828 QString QSysInfo::productType()
2829 {
2830     // similar, but not identical to QFileSelectorPrivate::platformSelectors
2831 #if defined(Q_OS_WINRT)
2832     return QStringLiteral("winrt");
2833 #elif defined(Q_OS_WIN)
2834     return QStringLiteral("windows");
2835 
2836 #elif defined(Q_OS_QNX)
2837     return QStringLiteral("qnx");
2838 
2839 #elif defined(Q_OS_ANDROID)
2840     return QStringLiteral("android");
2841 
2842 #elif defined(Q_OS_IOS)
2843     return QStringLiteral("ios");
2844 #elif defined(Q_OS_TVOS)
2845     return QStringLiteral("tvos");
2846 #elif defined(Q_OS_WATCHOS)
2847     return QStringLiteral("watchos");
2848 #elif defined(Q_OS_MACOS)
2849     // ### Qt6: remove fallback
2850 #  if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
2851     return QStringLiteral("macos");
2852 #  else
2853     return QStringLiteral("osx");
2854 #  endif
2855 #elif defined(Q_OS_DARWIN)
2856     return QStringLiteral("darwin");
2857 
2858 #elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX
2859     QUnixOSVersion unixOsVersion;
2860     findUnixOsVersion(unixOsVersion);
2861     if (!unixOsVersion.productType.isEmpty())
2862         return unixOsVersion.productType;
2863 #endif
2864     return unknownText();
2865 }
2866 
2867 /*!
2868     \since 5.4
2869 
2870     Returns the product version of the operating system in string form. If the
2871     version could not be determined, this function returns "unknown".
2872 
2873     It will return the Android, iOS, \macos, Windows full-product
2874     versions on those systems.
2875 
2876     Typical returned values are (note: list not exhaustive):
2877     \list
2878         \li "2016.09" (Amazon Linux AMI 2016.09)
2879         \li "7.1" (Android Nougat)
2880         \li "25" (Fedora 25)
2881         \li "10.1" (iOS 10.1)
2882         \li "10.12" (macOS Sierra)
2883         \li "10.0" (tvOS 10)
2884         \li "16.10" (Ubuntu 16.10)
2885         \li "3.1" (watchOS 3.1)
2886         \li "7 SP 1" (Windows 7 Service Pack 1)
2887         \li "8.1" (Windows 8.1)
2888         \li "10" (Windows 10)
2889         \li "Server 2016" (Windows Server 2016)
2890     \endlist
2891 
2892     On Linux systems, it will try to determine the distribution version and will
2893     return that. This is also done on Debian/kFreeBSD, so this function will
2894     return Debian version in that case.
2895 
2896     In all other Unix-type systems, this function always returns "unknown".
2897 
2898     \note The version string returned from this function is not guaranteed to
2899     be orderable. On Linux, the version of
2900     the distribution may jump unexpectedly, please refer to the distribution's
2901     documentation for versioning practices.
2902 
2903     \sa kernelType(), kernelVersion(), productType(), prettyProductName()
2904 */
productVersion()2905 QString QSysInfo::productVersion()
2906 {
2907 #if defined(Q_OS_ANDROID) || defined(Q_OS_DARWIN)
2908     const auto version = QOperatingSystemVersion::current();
2909     return QString::number(version.majorVersion()) + QLatin1Char('.') + QString::number(version.minorVersion());
2910 #elif defined(Q_OS_WIN)
2911     const char *version = osVer_helper();
2912     if (version) {
2913         const QLatin1Char spaceChar(' ');
2914         return QString::fromLatin1(version).remove(spaceChar).toLower() + winSp_helper().remove(spaceChar).toLower();
2915     }
2916     // fall through
2917 
2918 #elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX
2919     QUnixOSVersion unixOsVersion;
2920     findUnixOsVersion(unixOsVersion);
2921     if (!unixOsVersion.productVersion.isEmpty())
2922         return unixOsVersion.productVersion;
2923 #endif
2924 
2925     // fallback
2926     return unknownText();
2927 }
2928 
2929 /*!
2930     \since 5.4
2931 
2932     Returns a prettier form of productType() and productVersion(), containing
2933     other tokens like the operating system type, codenames and other
2934     information. The result of this function is suitable for displaying to the
2935     user, but not for long-term storage, as the string may change with updates
2936     to Qt.
2937 
2938     If productType() is "unknown", this function will instead use the
2939     kernelType() and kernelVersion() functions.
2940 
2941     \sa kernelType(), kernelVersion(), productType(), productVersion()
2942 */
prettyProductName()2943 QString QSysInfo::prettyProductName()
2944 {
2945 #if (defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)) || defined(Q_OS_DARWIN) || defined(Q_OS_WIN)
2946     const auto version = QOperatingSystemVersion::current();
2947     const int majorVersion = version.majorVersion();
2948     const QString versionString = QString::number(majorVersion) + QLatin1Char('.')
2949         + QString::number(version.minorVersion());
2950     QString result = version.name() + QLatin1Char(' ');
2951     const char *name = osVer_helper(version);
2952     if (!name)
2953         return result + versionString;
2954     result += QLatin1String(name);
2955 #  if !defined(Q_OS_WIN) || defined(Q_OS_WINRT)
2956     return result + QLatin1String(" (") + versionString + QLatin1Char(')');
2957 #  else
2958     // (resembling winver.exe): Windows 10 "Windows 10 Version 1809"
2959     if (majorVersion >= 10) {
2960         const auto releaseId = windows10ReleaseId();
2961         if (!releaseId.isEmpty())
2962             result += QLatin1String(" Version ") + releaseId;
2963         return result;
2964     }
2965     // Windows 7: "Windows 7 Version 6.1 (Build 7601: Service Pack 1)"
2966     result += QLatin1String(" Version ") + versionString + QLatin1String(" (");
2967     const auto build = windows7Build();
2968     if (!build.isEmpty())
2969         result += QLatin1String("Build ") + build;
2970     const auto servicePack = winSp_helper();
2971     if (!servicePack.isEmpty())
2972         result += QLatin1String(": ") + servicePack;
2973     return result + QLatin1Char(')');
2974 #  endif // Windows
2975 #elif defined(Q_OS_HAIKU)
2976     return QLatin1String("Haiku ") + productVersion();
2977 #elif defined(Q_OS_UNIX)
2978 #  ifdef USE_ETC_OS_RELEASE
2979     QUnixOSVersion unixOsVersion;
2980     findUnixOsVersion(unixOsVersion);
2981     if (!unixOsVersion.prettyName.isEmpty())
2982         return unixOsVersion.prettyName;
2983 #  endif
2984     struct utsname u;
2985     if (uname(&u) == 0)
2986         return QString::fromLatin1(u.sysname) + QLatin1Char(' ') + QString::fromLatin1(u.release);
2987 #endif
2988     return unknownText();
2989 }
2990 
2991 #ifndef QT_BOOTSTRAPPED
2992 /*!
2993     \since 5.6
2994 
2995     Returns this machine's host name, if one is configured. Note that hostnames
2996     are not guaranteed to be globally unique, especially if they were
2997     configured automatically.
2998 
2999     This function does not guarantee the returned host name is a Fully
3000     Qualified Domain Name (FQDN). For that, use QHostInfo to resolve the
3001     returned name to an FQDN.
3002 
3003     This function returns the same as QHostInfo::localHostName().
3004 
3005     \sa QHostInfo::localDomainName, machineUniqueId()
3006  */
machineHostName()3007 QString QSysInfo::machineHostName()
3008 {
3009     // the hostname can change, so we can't cache it
3010 #if defined(Q_OS_LINUX)
3011     // gethostname(3) on Linux just calls uname(2), so do it ourselves
3012     // and avoid a memcpy
3013     struct utsname u;
3014     if (uname(&u) == 0)
3015         return QString::fromLocal8Bit(u.nodename);
3016     return QString();
3017 #else
3018 #  ifdef Q_OS_WIN
3019     // Important: QtNetwork depends on machineHostName() initializing ws2_32.dll
3020     winsockInit();
3021 #  endif
3022 
3023     char hostName[512];
3024     if (gethostname(hostName, sizeof(hostName)) == -1)
3025         return QString();
3026     hostName[sizeof(hostName) - 1] = '\0';
3027     return QString::fromLocal8Bit(hostName);
3028 #endif
3029 }
3030 #endif // QT_BOOTSTRAPPED
3031 
3032 enum {
3033     UuidStringLen = sizeof("00000000-0000-0000-0000-000000000000") - 1
3034 };
3035 
3036 /*!
3037     \since 5.11
3038 
3039     Returns a unique ID for this machine, if one can be determined. If no
3040     unique ID could be determined, this function returns an empty byte array.
3041     Unlike machineHostName(), the value returned by this function is likely
3042     globally unique.
3043 
3044     A unique ID is useful in network operations to identify this machine for an
3045     extended period of time, when the IP address could change or if this
3046     machine could have more than one IP address. For example, the ID could be
3047     used when communicating with a server or when storing device-specific data
3048     in shared network storage.
3049 
3050     Note that on some systems, this value will persist across reboots and on
3051     some it will not. Applications should not blindly depend on this fact
3052     without verifying the OS capabilities. In particular, on Linux systems,
3053     this ID is usually permanent and it matches the D-Bus machine ID, except
3054     for nodes without their own storage (replicated nodes).
3055 
3056     \sa machineHostName(), bootUniqueId()
3057 */
machineUniqueId()3058 QByteArray QSysInfo::machineUniqueId()
3059 {
3060 #if defined(Q_OS_DARWIN) && __has_include(<IOKit/IOKitLib.h>)
3061     char uuid[UuidStringLen + 1];
3062     io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
3063     QCFString stringRef = (CFStringRef)IORegistryEntryCreateCFProperty(service, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);
3064     CFStringGetCString(stringRef, uuid, sizeof(uuid), kCFStringEncodingMacRoman);
3065     return QByteArray(uuid);
3066 #elif defined(Q_OS_BSD4) && defined(KERN_HOSTUUID)
3067     char uuid[UuidStringLen + 1];
3068     size_t uuidlen = sizeof(uuid);
3069     int name[] = { CTL_KERN, KERN_HOSTUUID };
3070     if (sysctl(name, sizeof name / sizeof name[0], &uuid, &uuidlen, nullptr, 0) == 0
3071             && uuidlen == sizeof(uuid))
3072         return QByteArray(uuid, uuidlen - 1);
3073 #elif defined(Q_OS_UNIX)
3074     // The modern name on Linux is /etc/machine-id, but that path is
3075     // unlikely to exist on non-Linux (non-systemd) systems. The old
3076     // path is more than enough.
3077     static const char fullfilename[] = "/usr/local/var/lib/dbus/machine-id";
3078     const char *firstfilename = fullfilename + sizeof("/usr/local") - 1;
3079     int fd = qt_safe_open(firstfilename, O_RDONLY);
3080     if (fd == -1 && errno == ENOENT)
3081         fd = qt_safe_open(fullfilename, O_RDONLY);
3082 
3083     if (fd != -1) {
3084         char buffer[32];    // 128 bits, hex-encoded
3085         qint64 len = qt_safe_read(fd, buffer, sizeof(buffer));
3086         qt_safe_close(fd);
3087 
3088         if (len != -1)
3089             return QByteArray(buffer, len);
3090     }
3091 #elif defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
3092     // Let's poke at the registry
3093     // ### Qt 6: Use new helpers from qwinregistry.cpp (once bootstrap builds are obsolete)
3094     HKEY key = NULL;
3095     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ | KEY_WOW64_64KEY, &key)
3096             == ERROR_SUCCESS) {
3097         wchar_t buffer[UuidStringLen + 1];
3098         DWORD size = sizeof(buffer);
3099         bool ok = (RegQueryValueEx(key, L"MachineGuid", NULL, NULL, (LPBYTE)buffer, &size) ==
3100                    ERROR_SUCCESS);
3101         RegCloseKey(key);
3102         if (ok)
3103             return QStringView(buffer, (size - 1) / 2).toLatin1();
3104     }
3105 #endif
3106     return QByteArray();
3107 }
3108 
3109 /*!
3110     \since 5.11
3111 
3112     Returns a unique ID for this machine's boot, if one can be determined. If
3113     no unique ID could be determined, this function returns an empty byte
3114     array. This value is expected to change after every boot and can be
3115     considered globally unique.
3116 
3117     This function is currently only implemented for Linux and Apple operating
3118     systems.
3119 
3120     \sa machineUniqueId()
3121 */
bootUniqueId()3122 QByteArray QSysInfo::bootUniqueId()
3123 {
3124 #ifdef Q_OS_LINUX
3125     // use low-level API here for simplicity
3126     int fd = qt_safe_open("/proc/sys/kernel/random/boot_id", O_RDONLY);
3127     if (fd != -1) {
3128         char uuid[UuidStringLen];
3129         qint64 len = qt_safe_read(fd, uuid, sizeof(uuid));
3130         qt_safe_close(fd);
3131         if (len == UuidStringLen)
3132             return QByteArray(uuid, UuidStringLen);
3133     }
3134 #elif defined(Q_OS_DARWIN)
3135     // "kern.bootsessionuuid" is only available by name
3136     char uuid[UuidStringLen + 1];
3137     size_t uuidlen = sizeof(uuid);
3138     if (sysctlbyname("kern.bootsessionuuid", uuid, &uuidlen, nullptr, 0) == 0
3139             && uuidlen == sizeof(uuid))
3140         return QByteArray(uuid, uuidlen - 1);
3141 #endif
3142     return QByteArray();
3143 };
3144 
3145 /*!
3146     \macro void Q_ASSERT(bool test)
3147     \relates <QtGlobal>
3148 
3149     Prints a warning message containing the source code file name and
3150     line number if \a test is \c false.
3151 
3152     Q_ASSERT() is useful for testing pre- and post-conditions
3153     during development. It does nothing if \c QT_NO_DEBUG was defined
3154     during compilation.
3155 
3156     Example:
3157 
3158     \snippet code/src_corelib_global_qglobal.cpp 17
3159 
3160     If \c b is zero, the Q_ASSERT statement will output the following
3161     message using the qFatal() function:
3162 
3163     \snippet code/src_corelib_global_qglobal.cpp 18
3164 
3165     \sa Q_ASSERT_X(), qFatal(), {Debugging Techniques}
3166 */
3167 
3168 /*!
3169     \macro void Q_ASSERT_X(bool test, const char *where, const char *what)
3170     \relates <QtGlobal>
3171 
3172     Prints the message \a what together with the location \a where,
3173     the source file name and line number if \a test is \c false.
3174 
3175     Q_ASSERT_X is useful for testing pre- and post-conditions during
3176     development. It does nothing if \c QT_NO_DEBUG was defined during
3177     compilation.
3178 
3179     Example:
3180 
3181     \snippet code/src_corelib_global_qglobal.cpp 19
3182 
3183     If \c b is zero, the Q_ASSERT_X statement will output the following
3184     message using the qFatal() function:
3185 
3186     \snippet code/src_corelib_global_qglobal.cpp 20
3187 
3188     \sa Q_ASSERT(), qFatal(), {Debugging Techniques}
3189 */
3190 
3191 /*!
3192     \macro void Q_ASSUME(bool expr)
3193     \relates <QtGlobal>
3194     \since 5.0
3195 
3196     Causes the compiler to assume that \a expr is \c true. This macro is useful
3197     for improving code generation, by providing the compiler with hints about
3198     conditions that it would not otherwise know about. However, there is no
3199     guarantee that the compiler will actually use those hints.
3200 
3201     This macro could be considered a "lighter" version of \l{Q_ASSERT()}. While
3202     Q_ASSERT will abort the program's execution if the condition is \c false,
3203     Q_ASSUME will tell the compiler not to generate code for those conditions.
3204     Therefore, it is important that the assumptions always hold, otherwise
3205     undefined behaviour may occur.
3206 
3207     If \a expr is a constantly \c false condition, Q_ASSUME will tell the compiler
3208     that the current code execution cannot be reached. That is, Q_ASSUME(false)
3209     is equivalent to Q_UNREACHABLE().
3210 
3211     In debug builds the condition is enforced by an assert to facilitate debugging.
3212 
3213     \note Q_LIKELY() tells the compiler that the expression is likely, but not
3214     the only possibility. Q_ASSUME tells the compiler that it is the only
3215     possibility.
3216 
3217     \sa Q_ASSERT(), Q_UNREACHABLE(), Q_LIKELY()
3218 */
3219 
3220 /*!
3221     \macro void Q_UNREACHABLE()
3222     \relates <QtGlobal>
3223     \since 5.0
3224 
3225     Tells the compiler that the current point cannot be reached by any
3226     execution, so it may optimize any code paths leading here as dead code, as
3227     well as code continuing from here.
3228 
3229     This macro is useful to mark impossible conditions. For example, given the
3230     following enum:
3231 
3232     \snippet code/src_corelib_global_qglobal.cpp qunreachable-enum
3233 
3234     One can write a switch table like so:
3235 
3236     \snippet code/src_corelib_global_qglobal.cpp qunreachable-switch
3237 
3238     The advantage of inserting Q_UNREACHABLE() at that point is that the
3239     compiler is told not to generate code for a shape variable containing that
3240     value. If the macro is missing, the compiler will still generate the
3241     necessary comparisons for that value. If the case label were removed, some
3242     compilers could produce a warning that some enum values were not checked.
3243 
3244     By using this macro in impossible conditions, code coverage may be improved
3245     as dead code paths may be eliminated.
3246 
3247     In debug builds the condition is enforced by an assert to facilitate debugging.
3248 
3249     \sa Q_ASSERT(), Q_ASSUME(), qFatal()
3250 */
3251 
3252 /*!
3253     \macro void Q_FALLTHROUGH()
3254     \relates <QtGlobal>
3255     \since 5.8
3256 
3257     Can be used in switch statements at the end of case block to tell the compiler
3258     and other developers that that the lack of a break statement is intentional.
3259 
3260     This is useful since a missing break statement is often a bug, and some
3261     compilers can be configured to emit warnings when one is not found.
3262 
3263     \sa Q_UNREACHABLE()
3264 */
3265 
3266 /*!
3267     \macro void Q_CHECK_PTR(void *pointer)
3268     \relates <QtGlobal>
3269 
3270     If \a pointer is \nullptr, prints a message containing the source
3271     code's file name and line number, saying that the program ran out
3272     of memory and aborts program execution. It throws \c std::bad_alloc instead
3273     if exceptions are enabled.
3274 
3275     Q_CHECK_PTR does nothing if \c QT_NO_DEBUG and \c QT_NO_EXCEPTIONS were
3276     defined during compilation. Therefore you must not use Q_CHECK_PTR to check
3277     for successful memory allocations because the check will be disabled in
3278     some cases.
3279 
3280     Example:
3281 
3282     \snippet code/src_corelib_global_qglobal.cpp 21
3283 
3284     \sa qWarning(), {Debugging Techniques}
3285 */
3286 
3287 /*!
3288     \fn template <typename T> T *q_check_ptr(T *p)
3289     \relates <QtGlobal>
3290 
3291     Uses Q_CHECK_PTR on \a p, then returns \a p.
3292 
3293     This can be used as an inline version of Q_CHECK_PTR.
3294 */
3295 
3296 /*!
3297     \macro const char* Q_FUNC_INFO()
3298     \relates <QtGlobal>
3299 
3300     Expands to a string that describe the function the macro resides in. How this string looks
3301     more specifically is compiler dependent. With GNU GCC it is typically the function signature,
3302     while with other compilers it might be the line and column number.
3303 
3304     Q_FUNC_INFO can be conveniently used with qDebug(). For example, this function:
3305 
3306     \snippet code/src_corelib_global_qglobal.cpp 22
3307 
3308     when instantiated with the integer type, will with the GCC compiler produce:
3309 
3310     \tt{const TInputType& myMin(const TInputType&, const TInputType&) [with TInputType = int] was called with value1: 3 value2: 4}
3311 
3312     If this macro is used outside a function, the behavior is undefined.
3313  */
3314 
3315 /*!
3316     \internal
3317     The Q_CHECK_PTR macro calls this function if an allocation check
3318     fails.
3319 */
qt_check_pointer(const char * n,int l)3320 void qt_check_pointer(const char *n, int l) noexcept
3321 {
3322     // make separate printing calls so that the first one may flush;
3323     // the second one could want to allocate memory (fputs prints a
3324     // newline and stderr auto-flushes).
3325     fputs("Out of memory", stderr);
3326     fprintf(stderr, "  in %s, line %d\n", n, l);
3327 
3328     std::terminate();
3329 }
3330 
3331 /*
3332    \internal
3333    Allows you to throw an exception without including <new>
3334    Called internally from Q_CHECK_PTR on certain OS combinations
3335 */
qBadAlloc()3336 void qBadAlloc()
3337 {
3338     QT_THROW(std::bad_alloc());
3339 }
3340 
3341 #ifndef QT_NO_EXCEPTIONS
3342 /*
3343    \internal
3344    Allows you to call std::terminate() without including <exception>.
3345    Called internally from QT_TERMINATE_ON_EXCEPTION
3346 */
qTerminate()3347 Q_NORETURN void qTerminate() noexcept
3348 {
3349     std::terminate();
3350 }
3351 #endif
3352 
3353 /*
3354   The Q_ASSERT macro calls this function when the test fails.
3355 */
qt_assert(const char * assertion,const char * file,int line)3356 void qt_assert(const char *assertion, const char *file, int line) noexcept
3357 {
3358     QMessageLogger(file, line, nullptr).fatal("ASSERT: \"%s\" in file %s, line %d", assertion, file, line);
3359 }
3360 
3361 /*
3362   The Q_ASSERT_X macro calls this function when the test fails.
3363 */
qt_assert_x(const char * where,const char * what,const char * file,int line)3364 void qt_assert_x(const char *where, const char *what, const char *file, int line) noexcept
3365 {
3366     QMessageLogger(file, line, nullptr).fatal("ASSERT failure in %s: \"%s\", file %s, line %d", where, what, file, line);
3367 }
3368 
3369 
3370 /*
3371     Dijkstra's bisection algorithm to find the square root of an integer.
3372     Deliberately not exported as part of the Qt API, but used in both
3373     qsimplerichtext.cpp and qgfxraster_qws.cpp
3374 */
qt_int_sqrt(unsigned int n)3375 Q_CORE_EXPORT Q_DECL_CONST_FUNCTION unsigned int qt_int_sqrt(unsigned int n)
3376 {
3377     // n must be in the range 0...UINT_MAX/2-1
3378     if (n >= (UINT_MAX>>2)) {
3379         unsigned int r = 2 * qt_int_sqrt(n / 4);
3380         unsigned int r2 = r + 1;
3381         return (n >= r2 * r2) ? r2 : r;
3382     }
3383     uint h, p= 0, q= 1, r= n;
3384     while (q <= n)
3385         q <<= 2;
3386     while (q != 1) {
3387         q >>= 2;
3388         h= p + q;
3389         p >>= 1;
3390         if (r >= h) {
3391             p += q;
3392             r -= h;
3393         }
3394     }
3395     return p;
3396 }
3397 
qMemCopy(void * dest,const void * src,size_t n)3398 void *qMemCopy(void *dest, const void *src, size_t n) { return memcpy(dest, src, n); }
qMemSet(void * dest,int c,size_t n)3399 void *qMemSet(void *dest, int c, size_t n) { return memset(dest, c, n); }
3400 
3401 // In the C runtime on all platforms access to the environment is not thread-safe. We
3402 // add thread-safety for the Qt wrappers.
3403 static QBasicMutex environmentMutex;
3404 
3405 /*
3406   Wraps tzset(), which accesses the environment, so should only be called while
3407   we hold the lock on the environment mutex.
3408 */
qTzSet()3409 void qTzSet()
3410 {
3411     const auto locker = qt_scoped_lock(environmentMutex);
3412 #if defined(Q_OS_WIN)
3413     _tzset();
3414 #else
3415     tzset();
3416 #endif // Q_OS_WIN
3417 }
3418 
3419 /*
3420   Wrap mktime(), which is specified to behave as if it called tzset(), hence
3421   shares its implicit environment-dependence.
3422 */
qMkTime(struct tm * when)3423 time_t qMkTime(struct tm *when)
3424 {
3425     const auto locker = qt_scoped_lock(environmentMutex);
3426     return mktime(when);
3427 }
3428 
3429 // Also specified to behave as if they call tzset():
3430 // localtime() -- but not localtime_r(), which we use when threaded
3431 // strftime() -- not used (except in tests)
3432 
3433 /*!
3434     \relates <QtGlobal>
3435     \threadsafe
3436 
3437     Returns the value of the environment variable with name \a varName as a
3438     QByteArray. If no variable by that name is found in the environment, this
3439     function returns a default-constructed QByteArray.
3440 
3441     The Qt environment manipulation functions are thread-safe, but this
3442     requires that the C library equivalent functions like getenv and putenv are
3443     not directly called.
3444 
3445     To convert the data to a QString use QString::fromLocal8Bit().
3446 
3447     \note on desktop Windows, qgetenv() may produce data loss if the
3448     original string contains Unicode characters not representable in the
3449     ANSI encoding. Use qEnvironmentVariable() instead.
3450     On Unix systems, this function is lossless.
3451 
3452     \sa qputenv(), qEnvironmentVariable(), qEnvironmentVariableIsSet(),
3453     qEnvironmentVariableIsEmpty()
3454 */
qgetenv(const char * varName)3455 QByteArray qgetenv(const char *varName)
3456 {
3457     const auto locker = qt_scoped_lock(environmentMutex);
3458 #ifdef Q_CC_MSVC
3459     size_t requiredSize = 0;
3460     QByteArray buffer;
3461     getenv_s(&requiredSize, 0, 0, varName);
3462     if (requiredSize == 0)
3463         return buffer;
3464     buffer.resize(int(requiredSize));
3465     getenv_s(&requiredSize, buffer.data(), requiredSize, varName);
3466     // requiredSize includes the terminating null, which we don't want.
3467     Q_ASSERT(buffer.endsWith('\0'));
3468     buffer.chop(1);
3469     return buffer;
3470 #else
3471     return QByteArray(::getenv(varName));
3472 #endif
3473 }
3474 
3475 
3476 /*!
3477     \fn QString qEnvironmentVariable(const char *varName, const QString &defaultValue)
3478     \fn QString qEnvironmentVariable(const char *varName)
3479 
3480     \relates <QtGlobal>
3481     \since 5.10
3482 
3483     These functions return the value of the environment variable, \a varName, as a
3484     QString. If no variable \a varName is found in the environment and \a defaultValue
3485     is provided, \a defaultValue is returned. Otherwise QString() is returned.
3486 
3487     The Qt environment manipulation functions are thread-safe, but this
3488     requires that the C library equivalent functions like getenv and putenv are
3489     not directly called.
3490 
3491     The following table describes how to choose between qgetenv() and
3492     qEnvironmentVariable():
3493     \table
3494       \header \li Condition         \li Recommendation
3495       \row
3496         \li Variable contains file paths or user text
3497         \li qEnvironmentVariable()
3498       \row
3499         \li Windows-specific code
3500         \li qEnvironmentVariable()
3501       \row
3502         \li Unix-specific code, destination variable is not QString and/or is
3503             used to interface with non-Qt APIs
3504         \li qgetenv()
3505       \row
3506         \li Destination variable is a QString
3507         \li qEnvironmentVariable()
3508       \row
3509         \li Destination variable is a QByteArray or std::string
3510         \li qgetenv()
3511     \endtable
3512 
3513     \note on Unix systems, this function may produce data loss if the original
3514     string contains arbitrary binary data that cannot be decoded by the locale
3515     codec. Use qgetenv() instead for that case. On Windows, this function is
3516     lossless.
3517 
3518     \note the variable name \a varName must contain only US-ASCII characters.
3519 
3520     \sa qputenv(), qgetenv(), qEnvironmentVariableIsSet(), qEnvironmentVariableIsEmpty()
3521 */
qEnvironmentVariable(const char * varName,const QString & defaultValue)3522 QString qEnvironmentVariable(const char *varName, const QString &defaultValue)
3523 {
3524 #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
3525     const auto locker = qt_scoped_lock(environmentMutex);
3526     QVarLengthArray<wchar_t, 32> wname(int(strlen(varName)) + 1);
3527     for (int i = 0; i < wname.size(); ++i) // wname.size() is correct: will copy terminating null
3528         wname[i] = uchar(varName[i]);
3529     size_t requiredSize = 0;
3530     QString buffer;
3531     _wgetenv_s(&requiredSize, 0, 0, wname.data());
3532     if (requiredSize == 0)
3533         return defaultValue;
3534     buffer.resize(int(requiredSize));
3535     _wgetenv_s(&requiredSize, reinterpret_cast<wchar_t *>(buffer.data()), requiredSize,
3536                wname.data());
3537     // requiredSize includes the terminating null, which we don't want.
3538     Q_ASSERT(buffer.endsWith(QLatin1Char('\0')));
3539     buffer.chop(1);
3540     return buffer;
3541 #else
3542     QByteArray value = qgetenv(varName);
3543     if (value.isNull())
3544         return defaultValue;
3545 // duplicated in qfile.h (QFile::decodeName)
3546 #if defined(Q_OS_DARWIN)
3547     return QString::fromUtf8(value).normalized(QString::NormalizationForm_C);
3548 #else // other Unix
3549     return QString::fromLocal8Bit(value);
3550 #endif
3551 #endif
3552 }
3553 
qEnvironmentVariable(const char * varName)3554 QString qEnvironmentVariable(const char *varName)
3555 {
3556     return qEnvironmentVariable(varName, QString());
3557 }
3558 
3559 /*!
3560     \relates <QtGlobal>
3561     \since 5.1
3562 
3563     Returns whether the environment variable \a varName is empty.
3564 
3565     Equivalent to
3566     \snippet code/src_corelib_global_qglobal.cpp is-empty
3567     except that it's potentially much faster, and can't throw exceptions.
3568 
3569     \sa qgetenv(), qEnvironmentVariable(), qEnvironmentVariableIsSet()
3570 */
qEnvironmentVariableIsEmpty(const char * varName)3571 bool qEnvironmentVariableIsEmpty(const char *varName) noexcept
3572 {
3573     const auto locker = qt_scoped_lock(environmentMutex);
3574 #ifdef Q_CC_MSVC
3575     // we provide a buffer that can only hold the empty string, so
3576     // when the env.var isn't empty, we'll get an ERANGE error (buffer
3577     // too small):
3578     size_t dummy;
3579     char buffer = '\0';
3580     return getenv_s(&dummy, &buffer, 1, varName) != ERANGE;
3581 #else
3582     const char * const value = ::getenv(varName);
3583     return !value || !*value;
3584 #endif
3585 }
3586 
3587 /*!
3588     \relates <QtGlobal>
3589     \since 5.5
3590 
3591     Returns the numerical value of the environment variable \a varName.
3592     If \a ok is not null, sets \c{*ok} to \c true or \c false depending
3593     on the success of the conversion.
3594 
3595     Equivalent to
3596     \snippet code/src_corelib_global_qglobal.cpp to-int
3597     except that it's much faster, and can't throw exceptions.
3598 
3599     \note there's a limit on the length of the value, which is sufficient for
3600     all valid values of int, not counting leading zeroes or spaces. Values that
3601     are too long will either be truncated or this function will set \a ok to \c
3602     false.
3603 
3604     \sa qgetenv(), qEnvironmentVariable(), qEnvironmentVariableIsSet()
3605 */
qEnvironmentVariableIntValue(const char * varName,bool * ok)3606 int qEnvironmentVariableIntValue(const char *varName, bool *ok) noexcept
3607 {
3608     static const int NumBinaryDigitsPerOctalDigit = 3;
3609     static const int MaxDigitsForOctalInt =
3610         (std::numeric_limits<uint>::digits + NumBinaryDigitsPerOctalDigit - 1) / NumBinaryDigitsPerOctalDigit;
3611 
3612     const auto locker = qt_scoped_lock(environmentMutex);
3613 #ifdef Q_CC_MSVC
3614     // we provide a buffer that can hold any int value:
3615     char buffer[MaxDigitsForOctalInt + 2]; // +1 for NUL +1 for optional '-'
3616     size_t dummy;
3617     if (getenv_s(&dummy, buffer, sizeof buffer, varName) != 0) {
3618         if (ok)
3619             *ok = false;
3620         return 0;
3621     }
3622 #else
3623     const char * const buffer = ::getenv(varName);
3624     if (!buffer || strlen(buffer) > MaxDigitsForOctalInt + 2) {
3625         if (ok)
3626             *ok = false;
3627         return 0;
3628     }
3629 #endif
3630     bool ok_ = true;
3631     const char *endptr;
3632     const qlonglong value = qstrtoll(buffer, &endptr, 0, &ok_);
3633 
3634     // Keep the following checks in sync with QByteArray::toInt()
3635     if (!ok_) {
3636         if (ok)
3637             *ok = false;
3638         return 0;
3639     }
3640 
3641     if (*endptr != '\0') {
3642         while (ascii_isspace(*endptr))
3643             ++endptr;
3644     }
3645 
3646     if (*endptr != '\0') {
3647         // we stopped at a non-digit character after converting some digits
3648         if (ok)
3649             *ok = false;
3650         return 0;
3651     }
3652 
3653     if (int(value) != value) {
3654         if (ok)
3655             *ok = false;
3656         return 0;
3657     } else if (ok) {
3658         *ok = ok_;
3659     }
3660     return int(value);
3661 }
3662 
3663 /*!
3664     \relates <QtGlobal>
3665     \since 5.1
3666 
3667     Returns whether the environment variable \a varName is set.
3668 
3669     Equivalent to
3670     \snippet code/src_corelib_global_qglobal.cpp is-null
3671     except that it's potentially much faster, and can't throw exceptions.
3672 
3673     \sa qgetenv(), qEnvironmentVariable(), qEnvironmentVariableIsEmpty()
3674 */
qEnvironmentVariableIsSet(const char * varName)3675 bool qEnvironmentVariableIsSet(const char *varName) noexcept
3676 {
3677     const auto locker = qt_scoped_lock(environmentMutex);
3678 #ifdef Q_CC_MSVC
3679     size_t requiredSize = 0;
3680     (void)getenv_s(&requiredSize, 0, 0, varName);
3681     return requiredSize != 0;
3682 #else
3683     return ::getenv(varName) != nullptr;
3684 #endif
3685 }
3686 
3687 /*!
3688     \relates <QtGlobal>
3689 
3690     This function sets the \a value of the environment variable named
3691     \a varName. It will create the variable if it does not exist. It
3692     returns 0 if the variable could not be set.
3693 
3694     Calling qputenv with an empty value removes the environment variable on
3695     Windows, and makes it set (but empty) on Unix. Prefer using qunsetenv()
3696     for fully portable behavior.
3697 
3698     \note qputenv() was introduced because putenv() from the standard
3699     C library was deprecated in VC2005 (and later versions). qputenv()
3700     uses the replacement function in VC, and calls the standard C
3701     library's implementation on all other platforms.
3702 
3703     \sa qgetenv(), qEnvironmentVariable()
3704 */
qputenv(const char * varName,const QByteArray & value)3705 bool qputenv(const char *varName, const QByteArray& value)
3706 {
3707     const auto locker = qt_scoped_lock(environmentMutex);
3708 #if defined(Q_CC_MSVC)
3709     return _putenv_s(varName, value.constData()) == 0;
3710 #elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0) >= 200112L) || defined(Q_OS_HAIKU)
3711     // POSIX.1-2001 has setenv
3712     return setenv(varName, value.constData(), true) == 0;
3713 #else
3714     QByteArray buffer(varName);
3715     buffer += '=';
3716     buffer += value;
3717     char* envVar = qstrdup(buffer.constData());
3718     int result = putenv(envVar);
3719     if (result != 0) // error. we have to delete the string.
3720         delete[] envVar;
3721     return result == 0;
3722 #endif
3723 }
3724 
3725 /*!
3726     \relates <QtGlobal>
3727 
3728     This function deletes the variable \a varName from the environment.
3729 
3730     Returns \c true on success.
3731 
3732     \since 5.1
3733 
3734     \sa qputenv(), qgetenv(), qEnvironmentVariable()
3735 */
qunsetenv(const char * varName)3736 bool qunsetenv(const char *varName)
3737 {
3738     const auto locker = qt_scoped_lock(environmentMutex);
3739 #if defined(Q_CC_MSVC)
3740     return _putenv_s(varName, "") == 0;
3741 #elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0) >= 200112L) || defined(Q_OS_BSD4) || defined(Q_OS_HAIKU)
3742     // POSIX.1-2001, BSD and Haiku have unsetenv
3743     return unsetenv(varName) == 0;
3744 #elif defined(Q_CC_MINGW)
3745     // On mingw, putenv("var=") removes "var" from the environment
3746     QByteArray buffer(varName);
3747     buffer += '=';
3748     return putenv(buffer.constData()) == 0;
3749 #else
3750     // Fallback to putenv("var=") which will insert an empty var into the
3751     // environment and leak it
3752     QByteArray buffer(varName);
3753     buffer += '=';
3754     char *envVar = qstrdup(buffer.constData());
3755     return putenv(envVar) == 0;
3756 #endif
3757 }
3758 
3759 /*!
3760     \macro forever
3761     \relates <QtGlobal>
3762 
3763     This macro is provided for convenience for writing infinite
3764     loops.
3765 
3766     Example:
3767 
3768     \snippet code/src_corelib_global_qglobal.cpp 31
3769 
3770     It is equivalent to \c{for (;;)}.
3771 
3772     If you're worried about namespace pollution, you can disable this
3773     macro by adding the following line to your \c .pro file:
3774 
3775     \snippet code/src_corelib_global_qglobal.cpp 32
3776 
3777     \sa Q_FOREVER
3778 */
3779 
3780 /*!
3781     \macro Q_FOREVER
3782     \relates <QtGlobal>
3783 
3784     Same as \l{forever}.
3785 
3786     This macro is available even when \c no_keywords is specified
3787     using the \c .pro file's \c CONFIG variable.
3788 
3789     \sa foreach()
3790 */
3791 
3792 /*!
3793     \macro foreach(variable, container)
3794     \relates <QtGlobal>
3795 
3796     This macro is used to implement Qt's \c foreach loop. The \a
3797     variable parameter is a variable name or variable definition; the
3798     \a container parameter is a Qt container whose value type
3799     corresponds to the type of the variable. See \l{The foreach
3800     Keyword} for details.
3801 
3802     If you're worried about namespace pollution, you can disable this
3803     macro by adding the following line to your \c .pro file:
3804 
3805     \snippet code/src_corelib_global_qglobal.cpp 33
3806 
3807     \note Since Qt 5.7, the use of this macro is discouraged. It will
3808     be removed in a future version of Qt. Please use C++11 range-for,
3809     possibly with qAsConst(), as needed.
3810 
3811     \sa qAsConst()
3812 */
3813 
3814 /*!
3815     \macro Q_FOREACH(variable, container)
3816     \relates <QtGlobal>
3817 
3818     Same as foreach(\a variable, \a container).
3819 
3820     This macro is available even when \c no_keywords is specified
3821     using the \c .pro file's \c CONFIG variable.
3822 
3823     \note Since Qt 5.7, the use of this macro is discouraged. It will
3824     be removed in a future version of Qt. Please use C++11 range-for,
3825     possibly with qAsConst(), as needed.
3826 
3827     \sa qAsConst()
3828 */
3829 
3830 /*!
3831     \fn template <typename T> typename std::add_const<T>::type &qAsConst(T &t)
3832     \relates <QtGlobal>
3833     \since 5.7
3834 
3835     Returns \a t cast to \c{const T}.
3836 
3837     This function is a Qt implementation of C++17's std::as_const(),
3838     a cast function like std::move(). But while std::move() turns
3839     lvalues into rvalues, this function turns non-const lvalues into
3840     const lvalues. Like std::as_const(), it doesn't work on rvalues,
3841     because it cannot be efficiently implemented for rvalues without
3842     leaving dangling references.
3843 
3844     Its main use in Qt is to prevent implicitly-shared Qt containers
3845     from detaching:
3846     \snippet code/src_corelib_global_qglobal.cpp as-const-0
3847 
3848     Of course, in this case, you could (and probably should) have declared
3849     \c s as \c const in the first place:
3850     \snippet code/src_corelib_global_qglobal.cpp as-const-1
3851     but often that is not easily possible.
3852 
3853     It is important to note that qAsConst() does not copy its argument,
3854     it just performs a \c{const_cast<const T&>(t)}. This is also the reason
3855     why it is designed to fail for rvalues: The returned reference would go
3856     stale too soon. So while this works (but detaches the returned object):
3857     \snippet code/src_corelib_global_qglobal.cpp as-const-2
3858 
3859     this would not:
3860     \snippet code/src_corelib_global_qglobal.cpp as-const-3
3861 
3862     To prevent this construct from compiling (and failing at runtime), qAsConst() has
3863     a second, deleted, overload which binds to rvalues.
3864 */
3865 
3866 /*!
3867     \fn template <typename T> void qAsConst(const T &&t)
3868     \relates <QtGlobal>
3869     \since 5.7
3870     \overload
3871 
3872     This overload is deleted to prevent a dangling reference in code like
3873     \snippet code/src_corelib_global_qglobal.cpp as-const-4
3874 */
3875 
3876 /*!
3877     \fn template <typename T, typename U = T> T qExchange(T &obj, U &&newValue)
3878     \relates <QtGlobal>
3879     \since 5.14
3880 
3881     Replaces the value of \a obj with \a newValue and returns the old value of \a obj.
3882 
3883     This is Qt's implementation of std::exchange(). It differs from std::exchange()
3884     only in that it is \c constexpr already in C++14, and available on all supported
3885     compilers.
3886 
3887     Here is how to use qExchange() to implement move constructors:
3888     \code
3889     MyClass(MyClass &&other)
3890       : m_pointer{qExchange(other.m_pointer, nullptr)},
3891         m_int{qExchange(other.m_int, 0)},
3892         m_vector{std::move(other.m_vector)},
3893         ...
3894     \endcode
3895 
3896     For members of class type, we can use std::move(), as their move-constructor will
3897     do the right thing. But for scalar types such as raw pointers or integer type, move
3898     is the same as copy, which, particularly for pointers, is not what we expect. So, we
3899     cannot use std::move() for such types, but we can use std::exchange()/qExchange() to
3900     make sure the source object's member is already reset by the time we get to the
3901     initialization of our next data member, which might come in handy if the constructor
3902     exits with an exception.
3903 
3904     Here is how to use qExchange() to write a loop that consumes the collection it
3905     iterates over:
3906     \code
3907     for (auto &e : qExchange(collection, {})
3908         doSomethingWith(e);
3909     \endcode
3910 
3911     Which is equivalent to the following, much more verbose code:
3912     \code
3913     {
3914         auto tmp = std::move(collection);
3915         collection = {};                    // or collection.clear()
3916         for (auto &e : tmp)
3917             doSomethingWith(e);
3918     }                                       // destroys 'tmp'
3919     \endcode
3920 
3921     This is perfectly safe, as the for-loop keeps the result of qExchange() alive for as
3922     long as the loop runs, saving the declaration of a temporary variable. Be aware, though,
3923     that qExchange() returns a non-const object, so Qt containers may detach.
3924 */
3925 
3926 /*!
3927     \macro QT_TR_NOOP(sourceText)
3928     \relates <QtGlobal>
3929 
3930     Marks the UTF-8 encoded string literal \a sourceText for delayed
3931     translation in the current context (class).
3932 
3933     The macro tells lupdate to collect the string, and expands to
3934     \a sourceText itself.
3935 
3936     Example:
3937 
3938     \snippet code/src_corelib_global_qglobal.cpp 34
3939 
3940     The macro QT_TR_NOOP_UTF8() is identical and obsolete; this applies
3941     to all other _UTF8 macros as well.
3942 
3943     \sa QT_TRANSLATE_NOOP(), {Internationalization with Qt}
3944 */
3945 
3946 /*!
3947     \macro QT_TRANSLATE_NOOP(context, sourceText)
3948     \relates <QtGlobal>
3949 
3950     Marks the UTF-8 encoded string literal \a sourceText for delayed
3951     translation in the given \a context. The \a context is typically
3952     a class name and also needs to be specified as a string literal.
3953 
3954     The macro tells lupdate to collect the string, and expands to
3955     \a sourceText itself.
3956 
3957     Example:
3958 
3959     \snippet code/src_corelib_global_qglobal.cpp 35
3960 
3961     \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP3(), {Internationalization with Qt}
3962 */
3963 
3964 /*!
3965     \macro QT_TRANSLATE_NOOP3(context, sourceText, disambiguation)
3966     \relates <QtGlobal>
3967     \since 4.4
3968 
3969     Marks the UTF-8 encoded string literal \a sourceText for delayed
3970     translation in the given \a context with the given \a disambiguation.
3971     The \a context is typically a class and also needs to be specified
3972     as a string literal. The string literal \a disambiguation should be
3973     a short semantic tag to tell apart otherwise identical strings.
3974 
3975     The macro tells lupdate to collect the string, and expands to an
3976     anonymous struct of the two string literals passed as \a sourceText
3977     and \a disambiguation.
3978 
3979     Example:
3980 
3981     \snippet code/src_corelib_global_qglobal.cpp 36
3982 
3983     \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP(), {Internationalization with Qt}
3984 */
3985 
3986 /*!
3987     \macro QT_TR_N_NOOP(sourceText)
3988     \relates <QtGlobal>
3989     \since 5.12
3990 
3991     Marks the UTF-8 encoded string literal \a sourceText for numerator
3992     dependent delayed translation in the current context (class).
3993 
3994     The macro tells lupdate to collect the string, and expands to
3995     \a sourceText itself.
3996 
3997     The macro expands to \a sourceText.
3998 
3999     Example:
4000 
4001     \snippet code/src_corelib_global_qglobal.cpp qttrnnoop
4002 
4003     \sa QT_TR_NOOP, {Internationalization with Qt}
4004 */
4005 
4006 /*!
4007     \macro QT_TRANSLATE_N_NOOP(context, sourceText)
4008     \relates <QtGlobal>
4009     \since 5.12
4010 
4011     Marks the UTF-8 encoded string literal \a sourceText for numerator
4012     dependent delayed translation in the given \a context.
4013     The \a context is typically a class name and also needs to be
4014     specified as a string literal.
4015 
4016     The macro tells lupdate to collect the string, and expands to
4017     \a sourceText itself.
4018 
4019     Example:
4020 
4021     \snippet code/src_corelib_global_qglobal.cpp qttranslatennoop
4022 
4023     \sa QT_TRANSLATE_NOOP(), QT_TRANSLATE_N_NOOP3(),
4024     {Internationalization with Qt}
4025 */
4026 
4027 /*!
4028     \macro QT_TRANSLATE_N_NOOP3(context, sourceText, comment)
4029     \relates <QtGlobal>
4030     \since 5.12
4031 
4032     Marks the UTF-8 encoded string literal \a sourceText for numerator
4033     dependent delayed translation in the given \a context with the given
4034     \a comment.
4035     The \a context is typically a class and also needs to be specified
4036     as a string literal. The string literal \a comment should be
4037     a short semantic tag to tell apart otherwise identical strings.
4038 
4039     The macro tells lupdate to collect the string, and expands to an
4040     anonymous struct of the two string literals passed as \a sourceText
4041     and \a comment.
4042 
4043     Example:
4044 
4045     \snippet code/src_corelib_global_qglobal.cpp qttranslatennoop3
4046 
4047     \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP(), QT_TRANSLATE_NOOP3(),
4048     {Internationalization with Qt}
4049 */
4050 
4051 /*!
4052     \fn QString qtTrId(const char *id, int n = -1)
4053     \relates <QtGlobal>
4054     \reentrant
4055     \since 4.6
4056 
4057     \brief The qtTrId function finds and returns a translated string.
4058 
4059     Returns a translated string identified by \a id.
4060     If no matching string is found, the id itself is returned. This
4061     should not happen under normal conditions.
4062 
4063     If \a n >= 0, all occurrences of \c %n in the resulting string
4064     are replaced with a decimal representation of \a n. In addition,
4065     depending on \a n's value, the translation text may vary.
4066 
4067     Meta data and comments can be passed as documented for QObject::tr().
4068     In addition, it is possible to supply a source string template like that:
4069 
4070     \tt{//% <C string>}
4071 
4072     or
4073 
4074     \tt{\\begincomment% <C string> \\endcomment}
4075 
4076     Example:
4077 
4078     \snippet code/src_corelib_global_qglobal.cpp qttrid
4079 
4080     Creating QM files suitable for use with this function requires passing
4081     the \c -idbased option to the \c lrelease tool.
4082 
4083     \warning This method is reentrant only if all translators are
4084     installed \e before calling this method. Installing or removing
4085     translators while performing translations is not supported. Doing
4086     so will probably result in crashes or other undesirable behavior.
4087 
4088     \sa QObject::tr(), QCoreApplication::translate(), {Internationalization with Qt}
4089 */
4090 
4091 /*!
4092     \macro QT_TRID_NOOP(id)
4093     \relates <QtGlobal>
4094     \since 4.6
4095 
4096     \brief The QT_TRID_NOOP macro marks an id for dynamic translation.
4097 
4098     The only purpose of this macro is to provide an anchor for attaching
4099     meta data like to qtTrId().
4100 
4101     The macro expands to \a id.
4102 
4103     Example:
4104 
4105     \snippet code/src_corelib_global_qglobal.cpp qttrid_noop
4106 
4107     \sa qtTrId(), {Internationalization with Qt}
4108 */
4109 
4110 /*!
4111     \macro Q_LIKELY(expr)
4112     \relates <QtGlobal>
4113     \since 4.8
4114 
4115     \brief Hints to the compiler that the enclosed condition, \a expr, is
4116     likely to evaluate to \c true.
4117 
4118     Use of this macro can help the compiler to optimize the code.
4119 
4120     Example:
4121 
4122     \snippet code/src_corelib_global_qglobal.cpp qlikely
4123 
4124     \sa Q_UNLIKELY()
4125 */
4126 
4127 /*!
4128     \macro Q_UNLIKELY(expr)
4129     \relates <QtGlobal>
4130     \since 4.8
4131 
4132     \brief Hints to the compiler that the enclosed condition, \a expr, is
4133     likely to evaluate to \c false.
4134 
4135     Use of this macro can help the compiler to optimize the code.
4136 
4137     Example:
4138 
4139     \snippet code/src_corelib_global_qglobal.cpp qunlikely
4140 
4141     \sa Q_LIKELY()
4142 */
4143 
4144 /*!
4145     \macro QT_POINTER_SIZE
4146     \relates <QtGlobal>
4147 
4148     Expands to the size of a pointer in bytes (4 or 8). This is
4149     equivalent to \c sizeof(void *) but can be used in a preprocessor
4150     directive.
4151 */
4152 
4153 /*!
4154     \macro const char *qPrintable(const QString &str)
4155     \relates <QtGlobal>
4156 
4157     Returns \a str as a \c{const char *}. This is equivalent to
4158     \a{str}.toLocal8Bit().constData().
4159 
4160     The char pointer will be invalid after the statement in which
4161     qPrintable() is used. This is because the array returned by
4162     QString::toLocal8Bit() will fall out of scope.
4163 
4164     \note qDebug(), qInfo(), qWarning(), qCritical(), qFatal() expect
4165     %s arguments to be UTF-8 encoded, while qPrintable() converts to
4166     local 8-bit encoding. Therefore qUtf8Printable() should be used
4167     for logging strings instead of qPrintable().
4168 
4169     \sa qUtf8Printable()
4170 */
4171 
4172 /*!
4173     \macro const char *qUtf8Printable(const QString &str)
4174     \relates <QtGlobal>
4175     \since 5.4
4176 
4177     Returns \a str as a \c{const char *}. This is equivalent to
4178     \a{str}.toUtf8().constData().
4179 
4180     The char pointer will be invalid after the statement in which
4181     qUtf8Printable() is used. This is because the array returned by
4182     QString::toUtf8() will fall out of scope.
4183 
4184     Example:
4185 
4186     \snippet code/src_corelib_global_qglobal.cpp 37
4187 
4188     \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
4189 */
4190 
4191 /*!
4192     \macro const wchar_t *qUtf16Printable(const QString &str)
4193     \relates <QtGlobal>
4194     \since 5.7
4195 
4196     Returns \a str as a \c{const ushort *}, but cast to a \c{const wchar_t *}
4197     to avoid warnings. This is equivalent to \a{str}.utf16() plus some casting.
4198 
4199     The only useful thing you can do with the return value of this macro is to
4200     pass it to QString::asprintf() for use in a \c{%ls} conversion. In particular,
4201     the return value is \e{not} a valid \c{const wchar_t*}!
4202 
4203     In general, the pointer will be invalid after the statement in which
4204     qUtf16Printable() is used. This is because the pointer may have been
4205     obtained from a temporary expression, which will fall out of scope.
4206 
4207     Example:
4208 
4209     \snippet code/src_corelib_global_qglobal.cpp qUtf16Printable
4210 
4211     \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal()
4212 */
4213 
4214 /*!
4215     \macro Q_DECLARE_TYPEINFO(Type, Flags)
4216     \relates <QtGlobal>
4217 
4218     You can use this macro to specify information about a custom type
4219     \a Type. With accurate type information, Qt's \l{Container Classes}
4220     {generic containers} can choose appropriate storage methods and
4221     algorithms.
4222 
4223     \a Flags can be one of the following:
4224 
4225     \list
4226     \li \c Q_PRIMITIVE_TYPE specifies that \a Type is a POD (plain old
4227        data) type with no constructor or destructor, and for which memcpy()ing
4228        creates a valid independent copy of the object.
4229     \li \c Q_MOVABLE_TYPE specifies that \a Type has a constructor
4230        and/or a destructor but can be moved in memory using \c
4231        memcpy(). Note: despite the name, this has nothing to do with move
4232        constructors or C++ move semantics.
4233     \li \c Q_COMPLEX_TYPE (the default) specifies that \a Type has
4234        constructors and/or a destructor and that it may not be moved
4235        in memory.
4236     \endlist
4237 
4238     Example of a "primitive" type:
4239 
4240     \snippet code/src_corelib_global_qglobal.cpp 38
4241 
4242     An example of a non-POD "primitive" type is QUuid: Even though
4243     QUuid has constructors (and therefore isn't POD), every bit
4244     pattern still represents a valid object, and memcpy() can be used
4245     to create a valid independent copy of a QUuid object.
4246 
4247     Example of a movable type:
4248 
4249     \snippet code/src_corelib_global_qglobal.cpp 39
4250 
4251     Qt will try to detect the class of a type using std::is_trivial or
4252     std::is_trivially_copyable. Use this macro to tune the behavior.
4253     For instance many types would be candidates for Q_MOVABLE_TYPE despite
4254     not being trivially-copyable. For binary compatibility reasons, QList
4255     optimizations are only enabled if there is an explicit
4256     Q_DECLARE_TYPEINFO even for trivially-copyable types.
4257 */
4258 
4259 /*!
4260     \macro Q_UNUSED(name)
4261     \relates <QtGlobal>
4262 
4263     Indicates to the compiler that the parameter with the specified
4264     \a name is not used in the body of a function. This can be used to
4265     suppress compiler warnings while allowing functions to be defined
4266     with meaningful parameter names in their signatures.
4267 */
4268 
4269 struct QInternal_CallBackTable {
4270     QVector<QList<qInternalCallback> > callbacks;
4271 };
4272 
Q_GLOBAL_STATIC(QInternal_CallBackTable,global_callback_table)4273 Q_GLOBAL_STATIC(QInternal_CallBackTable, global_callback_table)
4274 
4275 bool QInternal::registerCallback(Callback cb, qInternalCallback callback)
4276 {
4277     if (unsigned(cb) < unsigned(QInternal::LastCallback)) {
4278         QInternal_CallBackTable *cbt = global_callback_table();
4279         cbt->callbacks.resize(cb + 1);
4280         cbt->callbacks[cb].append(callback);
4281         return true;
4282     }
4283     return false;
4284 }
4285 
unregisterCallback(Callback cb,qInternalCallback callback)4286 bool QInternal::unregisterCallback(Callback cb, qInternalCallback callback)
4287 {
4288     if (unsigned(cb) < unsigned(QInternal::LastCallback)) {
4289         if (global_callback_table.exists()) {
4290             QInternal_CallBackTable *cbt = global_callback_table();
4291             return (bool) cbt->callbacks[cb].removeAll(callback);
4292         }
4293     }
4294     return false;
4295 }
4296 
activateCallbacks(Callback cb,void ** parameters)4297 bool QInternal::activateCallbacks(Callback cb, void **parameters)
4298 {
4299     Q_ASSERT_X(cb >= 0, "QInternal::activateCallback()", "Callback id must be a valid id");
4300 
4301     if (!global_callback_table.exists())
4302         return false;
4303 
4304     QInternal_CallBackTable *cbt = &(*global_callback_table);
4305     if (cbt && cb < cbt->callbacks.size()) {
4306         QList<qInternalCallback> callbacks = cbt->callbacks[cb];
4307         bool ret = false;
4308         for (int i=0; i<callbacks.size(); ++i)
4309             ret |= (callbacks.at(i))(parameters);
4310         return ret;
4311     }
4312     return false;
4313 }
4314 
4315 /*!
4316     \macro Q_BYTE_ORDER
4317     \relates <QtGlobal>
4318 
4319     This macro can be used to determine the byte order your system
4320     uses for storing data in memory. i.e., whether your system is
4321     little-endian or big-endian. It is set by Qt to one of the macros
4322     Q_LITTLE_ENDIAN or Q_BIG_ENDIAN. You normally won't need to worry
4323     about endian-ness, but you might, for example if you need to know
4324     which byte of an integer or UTF-16 character is stored in the
4325     lowest address. Endian-ness is important in networking, where
4326     computers with different values for Q_BYTE_ORDER must pass data
4327     back and forth.
4328 
4329     Use this macro as in the following examples.
4330 
4331     \snippet code/src_corelib_global_qglobal.cpp 40
4332 
4333     \sa Q_BIG_ENDIAN, Q_LITTLE_ENDIAN
4334 */
4335 
4336 /*!
4337     \macro Q_LITTLE_ENDIAN
4338     \relates <QtGlobal>
4339 
4340     This macro represents a value you can compare to the macro
4341     Q_BYTE_ORDER to determine the endian-ness of your system.  In a
4342     little-endian system, the least significant byte is stored at the
4343     lowest address. The other bytes follow in increasing order of
4344     significance.
4345 
4346     \snippet code/src_corelib_global_qglobal.cpp 41
4347 
4348     \sa Q_BYTE_ORDER, Q_BIG_ENDIAN
4349 */
4350 
4351 /*!
4352     \macro Q_BIG_ENDIAN
4353     \relates <QtGlobal>
4354 
4355     This macro represents a value you can compare to the macro
4356     Q_BYTE_ORDER to determine the endian-ness of your system.  In a
4357     big-endian system, the most significant byte is stored at the
4358     lowest address. The other bytes follow in decreasing order of
4359     significance.
4360 
4361     \snippet code/src_corelib_global_qglobal.cpp 42
4362 
4363     \sa Q_BYTE_ORDER, Q_LITTLE_ENDIAN
4364 */
4365 
4366 /*!
4367     \macro QT_NAMESPACE
4368     \internal
4369 
4370     If this macro is defined to \c ns all Qt classes are put in a namespace
4371     called \c ns. Also, moc will output code putting metaobjects etc.
4372     into namespace \c ns.
4373 
4374     \sa QT_BEGIN_NAMESPACE, QT_END_NAMESPACE,
4375     QT_PREPEND_NAMESPACE, QT_USE_NAMESPACE,
4376     QT_BEGIN_INCLUDE_NAMESPACE, QT_END_INCLUDE_NAMESPACE,
4377     QT_BEGIN_MOC_NAMESPACE, QT_END_MOC_NAMESPACE,
4378 */
4379 
4380 /*!
4381     \macro QT_PREPEND_NAMESPACE(identifier)
4382     \internal
4383 
4384     This macro qualifies \a identifier with the full namespace.
4385     It expands to \c{::QT_NAMESPACE::identifier} if \c QT_NAMESPACE is defined
4386     and only \a identifier otherwise.
4387 
4388     \sa QT_NAMESPACE
4389 */
4390 
4391 /*!
4392     \macro QT_USE_NAMESPACE
4393     \internal
4394 
4395     This macro expands to using QT_NAMESPACE if QT_NAMESPACE is defined
4396     and nothing otherwise.
4397 
4398     \sa QT_NAMESPACE
4399 */
4400 
4401 /*!
4402     \macro QT_BEGIN_NAMESPACE
4403     \internal
4404 
4405     This macro expands to
4406 
4407     \snippet code/src_corelib_global_qglobal.cpp begin namespace macro
4408 
4409     if \c QT_NAMESPACE is defined and nothing otherwise. If should always
4410     appear in the file-level scope and be followed by \c QT_END_NAMESPACE
4411     at the same logical level with respect to preprocessor conditionals
4412     in the same file.
4413 
4414     As a rule of thumb, \c QT_BEGIN_NAMESPACE should appear in all Qt header
4415     and Qt source files after the last \c{#include} line and before the first
4416     declaration.
4417 
4418     If that rule can't be followed because, e.g., \c{#include} lines and
4419     declarations are wildly mixed, place \c QT_BEGIN_NAMESPACE before
4420     the first declaration and wrap the \c{#include} lines in
4421     \c QT_BEGIN_INCLUDE_NAMESPACE and \c QT_END_INCLUDE_NAMESPACE.
4422 
4423     When using the \c QT_NAMESPACE feature in user code
4424     (e.g., when building plugins statically linked to Qt) where
4425     the user code is not intended to go into the \c QT_NAMESPACE
4426     namespace, all forward declarations of Qt classes need to
4427     be wrapped in \c QT_BEGIN_NAMESPACE and \c QT_END_NAMESPACE.
4428     After that, a \c QT_USE_NAMESPACE should follow.
4429     No further changes should be needed.
4430 
4431     \sa QT_NAMESPACE
4432 */
4433 
4434 /*!
4435     \macro QT_END_NAMESPACE
4436     \internal
4437 
4438     This macro expands to
4439 
4440     \snippet code/src_corelib_global_qglobal.cpp end namespace macro
4441 
4442     if \c QT_NAMESPACE is defined and nothing otherwise. It is used to cancel
4443     the effect of \c QT_BEGIN_NAMESPACE.
4444 
4445     If a source file ends with a \c{#include} directive that includes a moc file,
4446     \c QT_END_NAMESPACE should be placed before that \c{#include}.
4447 
4448     \sa QT_NAMESPACE
4449 */
4450 
4451 /*!
4452     \macro QT_BEGIN_INCLUDE_NAMESPACE
4453     \internal
4454 
4455     This macro is equivalent to \c QT_END_NAMESPACE.
4456     It only serves as syntactic sugar and is intended
4457     to be used before #include lines within a
4458     \c QT_BEGIN_NAMESPACE ... \c QT_END_NAMESPACE block.
4459 
4460     \sa QT_NAMESPACE
4461 */
4462 
4463 /*!
4464     \macro QT_END_INCLUDE_NAMESPACE
4465     \internal
4466 
4467     This macro is equivalent to \c QT_BEGIN_NAMESPACE.
4468     It only serves as syntactic sugar and is intended
4469     to be used after #include lines within a
4470     \c QT_BEGIN_NAMESPACE ... \c QT_END_NAMESPACE block.
4471 
4472     \sa QT_NAMESPACE
4473 */
4474 
4475 /*!
4476     \macro QT_BEGIN_MOC_NAMESPACE
4477     \internal
4478 
4479     This macro is output by moc at the beginning of
4480     moc files. It is equivalent to \c QT_USE_NAMESPACE.
4481 
4482     \sa QT_NAMESPACE
4483 */
4484 
4485 /*!
4486     \macro QT_END_MOC_NAMESPACE
4487     \internal
4488 
4489     This macro is output by moc at the beginning of
4490     moc files. It expands to nothing.
4491 
4492     \sa QT_NAMESPACE
4493 */
4494 
4495 /*!
4496  \fn bool qFuzzyCompare(double p1, double p2)
4497  \relates <QtGlobal>
4498  \since 4.4
4499  \threadsafe
4500 
4501  Compares the floating point value \a p1 and \a p2 and
4502  returns \c true if they are considered equal, otherwise \c false.
4503 
4504  Note that comparing values where either \a p1 or \a p2 is 0.0 will not work,
4505  nor does comparing values where one of the values is NaN or infinity.
4506  If one of the values is always 0.0, use qFuzzyIsNull instead. If one of the
4507  values is likely to be 0.0, one solution is to add 1.0 to both values.
4508 
4509  \snippet code/src_corelib_global_qglobal.cpp 46
4510 
4511  The two numbers are compared in a relative way, where the
4512  exactness is stronger the smaller the numbers are.
4513  */
4514 
4515 /*!
4516  \fn bool qFuzzyCompare(float p1, float p2)
4517  \relates <QtGlobal>
4518  \since 4.4
4519  \threadsafe
4520 
4521  Compares the floating point value \a p1 and \a p2 and
4522  returns \c true if they are considered equal, otherwise \c false.
4523 
4524  The two numbers are compared in a relative way, where the
4525  exactness is stronger the smaller the numbers are.
4526  */
4527 
4528 /*!
4529  \fn bool qFuzzyIsNull(double d)
4530  \relates <QtGlobal>
4531  \since 4.4
4532  \threadsafe
4533 
4534  Returns true if the absolute value of \a d is within 0.000000000001 of 0.0.
4535 */
4536 
4537 /*!
4538  \fn bool qFuzzyIsNull(float f)
4539  \relates <QtGlobal>
4540  \since 4.4
4541  \threadsafe
4542 
4543  Returns true if the absolute value of \a f is within 0.00001f of 0.0.
4544 */
4545 
4546 /*!
4547     \macro QT_REQUIRE_VERSION(int argc, char **argv, const char *version)
4548     \relates <QtGlobal>
4549 
4550     This macro can be used to ensure that the application is run
4551     against a recent enough version of Qt. This is especially useful
4552     if your application depends on a specific bug fix introduced in a
4553     bug-fix release (e.g., 4.0.2).
4554 
4555     The \a argc and \a argv parameters are the \c main() function's
4556     \c argc and \c argv parameters. The \a version parameter is a
4557     string literal that specifies which version of Qt the application
4558     requires (e.g., "4.0.2").
4559 
4560     Example:
4561 
4562     \snippet code/src_gui_dialogs_qmessagebox.cpp 4
4563 */
4564 
4565 /*!
4566     \macro Q_DECL_EXPORT
4567     \relates <QtGlobal>
4568 
4569     This macro marks a symbol for shared library export (see
4570      \l{sharedlibrary.html}{Creating Shared Libraries}).
4571 
4572     \sa Q_DECL_IMPORT
4573 */
4574 
4575 /*!
4576     \macro Q_DECL_IMPORT
4577     \relates <QtGlobal>
4578 
4579     This macro declares a symbol to be an import from a shared library (see
4580     \l{sharedlibrary.html}{Creating Shared Libraries}).
4581 
4582     \sa Q_DECL_EXPORT
4583 */
4584 
4585 /*!
4586     \macro Q_DECL_CONSTEXPR
4587     \relates <QtGlobal>
4588 
4589     This macro can be used to declare variable that should be constructed at compile-time,
4590     or an inline function that can be computed at compile-time.
4591 
4592     It expands to "constexpr" if your compiler supports that C++11 keyword, or to nothing
4593     otherwise.
4594 
4595     \sa Q_DECL_RELAXED_CONSTEXPR
4596 */
4597 
4598 /*!
4599     \macro Q_DECL_RELAXED_CONSTEXPR
4600     \relates <QtGlobal>
4601 
4602     This macro can be used to declare an inline function that can be computed
4603     at compile-time according to the relaxed rules from C++14.
4604 
4605     It expands to "constexpr" if your compiler supports C++14 relaxed constant
4606     expressions, or to nothing otherwise.
4607 
4608     \sa Q_DECL_CONSTEXPR
4609 */
4610 
4611 /*!
4612     \macro qDebug(const char *message, ...)
4613     \relates <QtGlobal>
4614     \threadsafe
4615 
4616     Calls the message handler with the debug message \a message. If no
4617     message handler has been installed, the message is printed to
4618     stderr. Under Windows the message is sent to the console, if it is a
4619     console application; otherwise, it is sent to the debugger. On QNX, the
4620     message is sent to slogger2. This function does nothing if \c QT_NO_DEBUG_OUTPUT
4621     was defined during compilation.
4622 
4623     If you pass the function a format string and a list of arguments,
4624     it works in similar way to the C printf() function. The format
4625     should be a Latin-1 string.
4626 
4627     Example:
4628 
4629     \snippet code/src_corelib_global_qglobal.cpp 24
4630 
4631     If you include \c <QtDebug>, a more convenient syntax is also
4632     available:
4633 
4634     \snippet code/src_corelib_global_qglobal.cpp 25
4635 
4636     With this syntax, the function returns a QDebug object that is
4637     configured to use the QtDebugMsg message type. It automatically
4638     puts a single space between each item, and outputs a newline at
4639     the end. It supports many C++ and Qt types.
4640 
4641     To suppress the output at run-time, install your own message handler
4642     with qInstallMessageHandler().
4643 
4644     \sa qInfo(), qWarning(), qCritical(), qFatal(), qInstallMessageHandler(),
4645         {Debugging Techniques}
4646 */
4647 
4648 /*!
4649     \macro qInfo(const char *message, ...)
4650     \relates <QtGlobal>
4651     \threadsafe
4652     \since 5.5
4653 
4654     Calls the message handler with the informational message \a message. If no
4655     message handler has been installed, the message is printed to
4656     stderr. Under Windows, the message is sent to the console, if it is a
4657     console application; otherwise, it is sent to the debugger. On QNX the
4658     message is sent to slogger2. This function does nothing if \c QT_NO_INFO_OUTPUT
4659     was defined during compilation.
4660 
4661     If you pass the function a format string and a list of arguments,
4662     it works in similar way to the C printf() function. The format
4663     should be a Latin-1 string.
4664 
4665     Example:
4666 
4667     \snippet code/src_corelib_global_qglobal.cpp qInfo_printf
4668 
4669     If you include \c <QtDebug>, a more convenient syntax is also
4670     available:
4671 
4672     \snippet code/src_corelib_global_qglobal.cpp qInfo_stream
4673 
4674     With this syntax, the function returns a QDebug object that is
4675     configured to use the QtInfoMsg message type. It automatically
4676     puts a single space between each item, and outputs a newline at
4677     the end. It supports many C++ and Qt types.
4678 
4679     To suppress the output at run-time, install your own message handler
4680     with qInstallMessageHandler().
4681 
4682     \sa qDebug(), qWarning(), qCritical(), qFatal(), qInstallMessageHandler(),
4683         {Debugging Techniques}
4684 */
4685 
4686 /*!
4687     \macro qWarning(const char *message, ...)
4688     \relates <QtGlobal>
4689     \threadsafe
4690 
4691     Calls the message handler with the warning message \a message. If no
4692     message handler has been installed, the message is printed to
4693     stderr. Under Windows, the message is sent to the debugger.
4694     On QNX the message is sent to slogger2. This
4695     function does nothing if \c QT_NO_WARNING_OUTPUT was defined
4696     during compilation; it exits if at the nth warning corresponding to the
4697     counter in environment variable \c QT_FATAL_WARNINGS. That is, if the
4698     environment variable contains the value 1, it will exit on the 1st message;
4699     if it contains the value 10, it will exit on the 10th message. Any
4700     non-numeric value is equivalent to 1.
4701 
4702     This function takes a format string and a list of arguments,
4703     similar to the C printf() function. The format should be a Latin-1
4704     string.
4705 
4706     Example:
4707     \snippet code/src_corelib_global_qglobal.cpp 26
4708 
4709     If you include <QtDebug>, a more convenient syntax is
4710     also available:
4711 
4712     \snippet code/src_corelib_global_qglobal.cpp 27
4713 
4714     This syntax inserts a space between each item, and
4715     appends a newline at the end.
4716 
4717     To suppress the output at runtime, install your own message handler
4718     with qInstallMessageHandler().
4719 
4720     \sa qDebug(), qInfo(), qCritical(), qFatal(), qInstallMessageHandler(),
4721         {Debugging Techniques}
4722 */
4723 
4724 /*!
4725     \macro qCritical(const char *message, ...)
4726     \relates <QtGlobal>
4727     \threadsafe
4728 
4729     Calls the message handler with the critical message \a message. If no
4730     message handler has been installed, the message is printed to
4731     stderr. Under Windows, the message is sent to the debugger.
4732     On QNX the message is sent to slogger2.
4733 
4734     It exits if the environment variable QT_FATAL_CRITICALS is not empty.
4735 
4736     This function takes a format string and a list of arguments,
4737     similar to the C printf() function. The format should be a Latin-1
4738     string.
4739 
4740     Example:
4741     \snippet code/src_corelib_global_qglobal.cpp 28
4742 
4743     If you include <QtDebug>, a more convenient syntax is
4744     also available:
4745 
4746     \snippet code/src_corelib_global_qglobal.cpp 29
4747 
4748     A space is inserted between the items, and a newline is
4749     appended at the end.
4750 
4751     To suppress the output at runtime, install your own message handler
4752     with qInstallMessageHandler().
4753 
4754     \sa qDebug(), qInfo(), qWarning(), qFatal(), qInstallMessageHandler(),
4755         {Debugging Techniques}
4756 */
4757 
4758 /*!
4759     \macro qFatal(const char *message, ...)
4760     \relates <QtGlobal>
4761 
4762     Calls the message handler with the fatal message \a message. If no
4763     message handler has been installed, the message is printed to
4764     stderr. Under Windows, the message is sent to the debugger.
4765     On QNX the message is sent to slogger2.
4766 
4767     If you are using the \b{default message handler} this function will
4768     abort to create a core dump. On Windows, for debug builds,
4769     this function will report a _CRT_ERROR enabling you to connect a debugger
4770     to the application.
4771 
4772     This function takes a format string and a list of arguments,
4773     similar to the C printf() function.
4774 
4775     Example:
4776     \snippet code/src_corelib_global_qglobal.cpp 30
4777 
4778     To suppress the output at runtime, install your own message handler
4779     with qInstallMessageHandler().
4780 
4781     \sa qDebug(), qInfo(), qWarning(), qCritical(), qInstallMessageHandler(),
4782         {Debugging Techniques}
4783 */
4784 
4785 /*!
4786     \macro qMove(x)
4787     \relates <QtGlobal>
4788     \obsolete
4789 
4790     Use \c std::move instead.
4791 
4792     It expands to "std::move".
4793 
4794     qMove takes an rvalue reference to its parameter \a x, and converts it to an xvalue.
4795 */
4796 
4797 /*!
4798     \macro Q_DECL_NOTHROW
4799     \relates <QtGlobal>
4800     \since 5.0
4801 
4802     This macro marks a function as never throwing, under no
4803     circumstances. If the function does nevertheless throw, the
4804     behaviour is undefined.
4805 
4806     The macro expands to either "throw()", if that has some benefit on
4807     the compiler, or to C++11 noexcept, if available, or to nothing
4808     otherwise.
4809 
4810     If you need C++11 noexcept semantics, don't use this macro, use
4811     Q_DECL_NOEXCEPT/Q_DECL_NOEXCEPT_EXPR instead.
4812 
4813     \sa Q_DECL_NOEXCEPT, Q_DECL_NOEXCEPT_EXPR()
4814 */
4815 
4816 /*!
4817     \macro QT_TERMINATE_ON_EXCEPTION(expr)
4818     \relates <QtGlobal>
4819     \internal
4820 
4821     In general, use of the Q_DECL_NOEXCEPT macro is preferred over
4822     Q_DECL_NOTHROW, because it exhibits well-defined behavior and
4823     supports the more powerful Q_DECL_NOEXCEPT_EXPR variant. However,
4824     use of Q_DECL_NOTHROW has the advantage that Windows builds
4825     benefit on a wide range or compiler versions that do not yet
4826     support the C++11 noexcept feature.
4827 
4828     It may therefore be beneficial to use Q_DECL_NOTHROW and emulate
4829     the C++11 behavior manually with an embedded try/catch.
4830 
4831     Qt provides the QT_TERMINATE_ON_EXCEPTION(expr) macro for this
4832     purpose. It either expands to \c expr (if Qt is compiled without
4833     exception support or the compiler supports C++11 noexcept
4834     semantics) or to
4835     \snippet code/src_corelib_global_qglobal.cpp qterminate
4836     otherwise.
4837 
4838     Since this macro expands to just \c expr if the compiler supports
4839     C++11 noexcept, expecting the compiler to take over responsibility
4840     of calling std::terminate() in that case, it should not be used
4841     outside Q_DECL_NOTHROW functions.
4842 
4843     \sa Q_DECL_NOEXCEPT, Q_DECL_NOTHROW, qTerminate()
4844 */
4845 
4846 /*!
4847     \macro Q_DECL_NOEXCEPT
4848     \relates <QtGlobal>
4849     \since 5.0
4850 
4851     This macro marks a function as never throwing. If the function
4852     does nevertheless throw, the behaviour is defined:
4853     std::terminate() is called.
4854 
4855     The macro expands to C++11 noexcept, if available, or to nothing
4856     otherwise.
4857 
4858     If you need the operator version of C++11 noexcept, use
4859     Q_DECL_NOEXCEPT_EXPR(x).
4860 
4861     If you don't need C++11 noexcept semantics, e.g. because your
4862     function can't possibly throw, don't use this macro, use
4863     Q_DECL_NOTHROW instead.
4864 
4865     \sa Q_DECL_NOTHROW, Q_DECL_NOEXCEPT_EXPR()
4866 */
4867 
4868 /*!
4869     \macro Q_DECL_NOEXCEPT_EXPR(x)
4870     \relates <QtGlobal>
4871     \since 5.0
4872 
4873     This macro marks a function as non-throwing if \a x is \c true. If
4874     the function does nevertheless throw, the behaviour is defined:
4875     std::terminate() is called.
4876 
4877     The macro expands to C++11 noexcept(x), if available, or to
4878     nothing otherwise.
4879 
4880     If you need the always-true version of C++11 noexcept, use
4881     Q_DECL_NOEXCEPT.
4882 
4883     If you don't need C++11 noexcept semantics, e.g. because your
4884     function can't possibly throw, don't use this macro, use
4885     Q_DECL_NOTHROW instead.
4886 
4887     \sa Q_DECL_NOTHROW, Q_DECL_NOEXCEPT
4888 */
4889 
4890 /*!
4891     \macro Q_DECL_OVERRIDE
4892     \since 5.0
4893     \obsolete
4894     \relates <QtGlobal>
4895 
4896     This macro can be used to declare an overriding virtual
4897     function. Use of this markup will allow the compiler to generate
4898     an error if the overriding virtual function does not in fact
4899     override anything.
4900 
4901     It expands to "override".
4902 
4903     The macro goes at the end of the function, usually after the
4904     \c{const}, if any:
4905     \snippet code/src_corelib_global_qglobal.cpp qdecloverride
4906 
4907     \sa Q_DECL_FINAL
4908 */
4909 
4910 /*!
4911     \macro Q_DECL_FINAL
4912     \since 5.0
4913     \obsolete
4914     \relates <QtGlobal>
4915 
4916     This macro can be used to declare an overriding virtual or a class
4917     as "final", with Java semantics. Further-derived classes can then
4918     no longer override this virtual function, or inherit from this
4919     class, respectively.
4920 
4921     It expands to "final".
4922 
4923     The macro goes at the end of the function, usually after the
4924     \c{const}, if any:
4925     \snippet code/src_corelib_global_qglobal.cpp qdeclfinal-1
4926 
4927     For classes, it goes in front of the \c{:} in the class
4928     definition, if any:
4929     \snippet code/src_corelib_global_qglobal.cpp qdeclfinal-2
4930 
4931     \sa Q_DECL_OVERRIDE
4932 */
4933 
4934 /*!
4935     \macro Q_FORWARD_DECLARE_OBJC_CLASS(classname)
4936     \since 5.2
4937     \relates <QtGlobal>
4938 
4939     Forward-declares an Objective-C \a classname in a manner such that it can be
4940     compiled as either Objective-C or C++.
4941 
4942     This is primarily intended for use in header files that may be included by
4943     both Objective-C and C++ source files.
4944 */
4945 
4946 /*!
4947     \macro Q_FORWARD_DECLARE_CF_TYPE(type)
4948     \since 5.2
4949     \relates <QtGlobal>
4950 
4951     Forward-declares a Core Foundation \a type. This includes the actual
4952     type and the ref type. For example, Q_FORWARD_DECLARE_CF_TYPE(CFString)
4953     declares __CFString and CFStringRef.
4954 */
4955 
4956 /*!
4957     \macro Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(type)
4958     \since 5.2
4959     \relates <QtGlobal>
4960 
4961     Forward-declares a mutable Core Foundation \a type. This includes the actual
4962     type and the ref type. For example, Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(CFMutableString)
4963     declares __CFMutableString and CFMutableStringRef.
4964 */
4965 
4966 QT_END_NAMESPACE
4967