summaryrefslogtreecommitdiffstats
path: root/src/corelib/global/qglobal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/global/qglobal.cpp')
-rw-r--r--src/corelib/global/qglobal.cpp2964
1 files changed, 2964 insertions, 0 deletions
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
new file mode 100644
index 0000000..b9c2bee
--- /dev/null
+++ b/src/corelib/global/qglobal.cpp
@@ -0,0 +1,2964 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qplatformdefs.h"
+#include "qstring.h"
+#include "qvector.h"
+#include "qlist.h"
+#include "qthreadstorage.h"
+
+#ifndef QT_NO_QOBJECT
+#include <private/qthread_p.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <string.h>
+
+#if !defined(Q_OS_WINCE)
+# include <errno.h>
+# if defined(Q_CC_MSVC)
+# include <crtdbg.h>
+# endif
+#endif
+
+#ifdef Q_CC_MWERKS
+#include <CoreServices/CoreServices.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+
+/*!
+ \class QFlag
+ \brief The QFlag class is a helper data type for QFlags.
+
+ It is equivalent to a plain \c int, except with respect to
+ function overloading and type conversions. You should never need
+ to use this class in your applications.
+
+ \sa QFlags
+*/
+
+/*!
+ \fn QFlag::QFlag(int value)
+
+ Constructs a QFlag object that stores the given \a value.
+*/
+
+/*!
+ \fn QFlag::operator int() const
+
+ Returns the value stored by the QFlag object.
+*/
+
+/*!
+ \class QFlags
+ \brief The QFlags class provides a type-safe way of storing
+ OR-combinations of enum values.
+
+ \mainclass
+ \ingroup tools
+
+ The QFlags<Enum> class is a template class, where Enum is an enum
+ type. QFlags is used throughout Qt for storing combinations of
+ enum values.
+
+ The traditional C++ approach for storing OR-combinations of enum
+ values is to use an \c int or \c uint variable. The inconvenience
+ with this approach is that there's no type checking at all; any
+ enum value can be OR'd with any other enum value and passed on to
+ a function that takes an \c int or \c uint.
+
+ Qt uses QFlags to provide type safety. For example, the
+ Qt::Alignment type is simply a typedef for
+ QFlags<Qt::AlignmentFlag>. QLabel::setAlignment() takes a
+ Qt::Alignment parameter, which means that any combination of
+ Qt::AlignmentFlag values,or 0, is legal:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 0
+
+ If you try to pass a value from another enum or just a plain
+ integer other than 0, the compiler will report an error. If you
+ need to cast integer values to flags in a untyped fashion, you can
+ use the explicit QFlags constructor as cast operator.
+
+ If you want to use QFlags for your own enum types, use
+ the Q_DECLARE_FLAGS() and Q_DECLARE_OPERATORS_FOR_FLAGS().
+ For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 1
+
+ You can then use the \c MyClass::Options type to store
+ combinations of \c MyClass::Option values.
+
+ \section1 Flags and the Meta-Object System
+
+ The Q_DECLARE_FLAGS() macro does not expose the flags to the meta-object
+ system, so they cannot be used by Qt Script or edited in Qt Designer.
+ To make the flags available for these purposes, the Q_FLAGS() macro must
+ be used:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp meta-object flags
+
+ \section1 Naming Convention
+
+ A sensible naming convention for enum types and associated QFlags
+ types is to give a singular name to the enum type (e.g., \c
+ Option) and a plural name to the QFlags type (e.g., \c Options).
+ When a singular name is desired for the QFlags type (e.g., \c
+ Alignment), you can use \c Flag as the suffix for the enum type
+ (e.g., \c AlignmentFlag).
+
+ \sa QFlag
+*/
+
+/*!
+ \typedef QFlags::enum_type
+
+ Typedef for the Enum template type.
+*/
+
+/*!
+ \fn QFlags::QFlags(const QFlags &other)
+
+ Constructs a copy of \a other.
+*/
+
+/*!
+ \fn QFlags::QFlags(Enum flag)
+
+ Constructs a QFlags object storing the given \a flag.
+*/
+
+/*!
+ \fn QFlags::QFlags(Zero zero)
+
+ Constructs a QFlags object with no flags set. \a zero must be a
+ literal 0 value.
+*/
+
+/*!
+ \fn QFlags::QFlags(QFlag value)
+
+ Constructs a QFlags object initialized with the given integer \a
+ value.
+
+ The QFlag type is a helper type. By using it here instead of \c
+ int, we effectively ensure that arbitrary enum values cannot be
+ cast to a QFlags, whereas untyped enum values (i.e., \c int
+ values) can.
+*/
+
+/*!
+ \fn QFlags &QFlags::operator=(const QFlags &other)
+
+ Assigns \a other to this object and returns a reference to this
+ object.
+*/
+
+/*!
+ \fn QFlags &QFlags::operator&=(int mask)
+
+ Performs a bitwise AND operation with \a mask and stores the
+ result in this QFlags object. Returns a reference to this object.
+
+ \sa operator&(), operator|=(), operator^=()
+*/
+
+/*!
+ \fn QFlags &QFlags::operator&=(uint mask)
+
+ \overload
+*/
+
+/*!
+ \fn QFlags &QFlags::operator|=(QFlags other)
+
+ Performs a bitwise OR operation with \a other and stores the
+ result in this QFlags object. Returns a reference to this object.
+
+ \sa operator|(), operator&=(), operator^=()
+*/
+
+/*!
+ \fn QFlags &QFlags::operator|=(Enum other)
+
+ \overload
+*/
+
+/*!
+ \fn QFlags &QFlags::operator^=(QFlags other)
+
+ Performs a bitwise XOR operation with \a other and stores the
+ result in this QFlags object. Returns a reference to this object.
+
+ \sa operator^(), operator&=(), operator|=()
+*/
+
+/*!
+ \fn QFlags &QFlags::operator^=(Enum other)
+
+ \overload
+*/
+
+/*!
+ \fn QFlags::operator int() const
+
+ Returns the value stored in the QFlags object as an integer.
+*/
+
+/*!
+ \fn QFlags QFlags::operator|(QFlags other) const
+
+ Returns a QFlags object containing the result of the bitwise OR
+ operation on this object and \a other.
+
+ \sa operator|=(), operator^(), operator&(), operator~()
+*/
+
+/*!
+ \fn QFlags QFlags::operator|(Enum other) const
+
+ \overload
+*/
+
+/*!
+ \fn QFlags QFlags::operator^(QFlags other) const
+
+ Returns a QFlags object containing the result of the bitwise XOR
+ operation on this object and \a other.
+
+ \sa operator^=(), operator&(), operator|(), operator~()
+*/
+
+/*!
+ \fn QFlags QFlags::operator^(Enum other) const
+
+ \overload
+*/
+
+/*!
+ \fn QFlags QFlags::operator&(int mask) const
+
+ Returns a QFlags object containing the result of the bitwise AND
+ operation on this object and \a mask.
+
+ \sa operator&=(), operator|(), operator^(), operator~()
+*/
+
+/*!
+ \fn QFlags QFlags::operator&(uint mask) const
+
+ \overload
+*/
+
+/*!
+ \fn QFlags QFlags::operator&(Enum mask) const
+
+ \overload
+*/
+
+/*!
+ \fn QFlags QFlags::operator~() const
+
+ Returns a QFlags object that contains the bitwise negation of
+ this object.
+
+ \sa operator&(), operator|(), operator^()
+*/
+
+/*!
+ \fn bool QFlags::operator!() const
+
+ Returns true if no flag is set (i.e., if the value stored by the
+ QFlags object is 0); otherwise returns false.
+*/
+
+/*!
+ \fn bool QFlags::testFlag(Enum flag) const
+ \since 4.2
+
+ Returns true if the \a flag is set, otherwise false.
+*/
+
+/*!
+ \macro Q_DISABLE_COPY(Class)
+ \relates QObject
+
+ Disables the use of copy constructors and assignment operators
+ for the given \a Class.
+
+ Instances of subclasses of QObject should not be thought of as
+ values that can be copied or assigned, but as unique identities.
+ This means that when you create your own subclass of QObject
+ (director or indirect), you should \e not give it a copy constructor
+ or an assignment operator. However, it may not enough to simply
+ omit them from your class, because, if you mistakenly write some code
+ that requires a copy constructor or an assignment operator (it's easy
+ to do), your compiler will thoughtfully create it for you. You must
+ do more.
+
+ The curious user will have seen that the Qt classes derived
+ from QObject typically include this macro in a private section:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 43
+
+ It declares a copy constructor and an assignment operator in the
+ private section, so that if you use them by mistake, the compiler
+ will report an error.
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 44
+
+ But even this might not catch absolutely every case. You might be
+ tempted to do something like this:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 45
+
+ First of all, don't do that. Most compilers will generate code that
+ uses the copy constructor, so the privacy violation error will be
+ reported, but your C++ compiler is not required to generate code for
+ this statement in a specific way. It could generate code using
+ \e{neither} the copy constructor \e{nor} the assignment operator we
+ made private. In that case, no error would be reported, but your
+ application would probably crash when you called a member function
+ of \c{w}.
+*/
+
+/*!
+ \macro Q_DECLARE_FLAGS(Flags, Enum)
+ \relates QFlags
+
+ The Q_DECLARE_FLAGS() macro expands to
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 2
+
+ \a Enum is the name of an existing enum type, whereas \a Flags is
+ the name of the QFlags<\e{Enum}> typedef.
+
+ See the QFlags documentation for details.
+
+ \sa Q_DECLARE_OPERATORS_FOR_FLAGS()
+*/
+
+/*!
+ \macro Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
+ \relates QFlags
+
+ The Q_DECLARE_OPERATORS_FOR_FLAGS() macro declares global \c
+ operator|() functions for \a Flags, which is of type QFlags<T>.
+
+ See the QFlags documentation for details.
+
+ \sa Q_DECLARE_FLAGS()
+*/
+
+/*!
+ \headerfile <QtGlobal>
+ \title Global Qt Declarations
+ \ingroup architecture
+
+ \brief The <QtGlobal> header provides basic declarations and
+ is included by all other Qt headers.
+
+ The declarations include \l {types}, \l functions and
+ \l macros.
+
+ The type definitions are partly convenience definitions for basic
+ types (some of which guarantee certain bit-sizes on all platforms
+ supported by Qt), partly types related to Qt message handling. The
+ functions are related to generating messages, Qt version handling
+ and comparing and adjusting object values. And finally, some of
+ the declared macros enable programmers to add compiler or platform
+ specific code to their applications, while others are convenience
+ macros for larger operations.
+
+ \section1 Types
+
+ The header file declares several type definitions that guarantee a
+ specified bit-size on all platforms supported by Qt for various
+ basic types, for example \l qint8 which is a signed char
+ guaranteed to be 8-bit on all platforms supported by Qt. The
+ header file also declares the \l qlonglong type definition for \c
+ {long long int } (\c __int64 on Windows).
+
+ Several convenience type definitions are declared: \l qreal for \c
+ double, \l uchar for \c unsigned char, \l uint for \c unsigned
+ int, \l ulong for \c unsigned long and \l ushort for \c unsigned
+ short.
+
+ Finally, the QtMsgType definition identifies the various messages
+ that can be generated and sent to a Qt message handler;
+ QtMsgHandler is a type definition for a pointer to a function with
+ the signature \c {void myMsgHandler(QtMsgType, const char *)}.
+
+ \section1 Functions
+
+ The <QtGlobal> header file contains several functions comparing
+ and adjusting an object's value. These functions take a template
+ type as argument: You can retrieve the absolute value of an object
+ using the qAbs() function, and you can bound a given object's
+ value by given minimum and maximum values using the qBound()
+ function. You can retrieve the minimum and maximum of two given
+ objects using qMin() and qMax() respectively. All these functions
+ return a corresponding template type; the template types can be
+ replaced by any other type. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 3
+
+ <QtGlobal> also contains functions that generate messages from the
+ given string argument: qCritical(), qDebug(), qFatal() and
+ qWarning(). These functions call the message handler with the
+ given message. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 4
+
+ The remaining functions are qRound() and qRound64(), which both
+ accept a \l qreal value as their argument returning the value
+ rounded up to the nearest integer and 64-bit integer respectively,
+ the qInstallMsgHandler() function which installs the given
+ QtMsgHandler, and the qVersion() function which returns the
+ version number of Qt at run-time as a string.
+
+ \section1 Macros
+
+ The <QtGlobal> header file provides a range of macros (Q_CC_*)
+ that are defined if the application is compiled using the
+ specified platforms. For example, the Q_CC_SUN macro is defined if
+ the application is compiled using Forte Developer, or Sun Studio
+ C++. The header file also declares a range of macros (Q_OS_*)
+ that are defined for the specified platforms. For example,
+ Q_OS_X11 which is defined for the X Window System.
+
+ The purpose of these macros is to enable programmers to add
+ compiler or platform specific code to their application.
+
+ The remaining macros are convenience macros for larger operations:
+ The QT_TRANSLATE_NOOP() and QT_TR_NOOP() macros provide the
+ possibility of marking text for dynamic translation,
+ i.e. translation without changing the stored source text. The
+ Q_ASSERT() and Q_ASSERT_X() enables warning messages of various
+ level of refinement. The Q_FOREACH() and foreach() macros
+ implement Qt's foreach loop.
+
+ The Q_INT64_C() and Q_UINT64_C() macros wrap signed and unsigned
+ 64-bit integer literals in a platform-independent way. The
+ Q_CHECK_PTR() macro prints a warning containing the source code's
+ file name and line number, saying that the program ran out of
+ memory, if the pointer is 0. The qPrintable() macro represent an
+ easy way of printing text.
+
+ Finally, the QT_POINTER_SIZE macro expands to the size of a
+ pointer in bytes, and the QT_VERSION and QT_VERSION_STR macros
+ expand to a numeric value or a string, respectively, specifying
+ Qt's version number, i.e the version the application is compiled
+ against.
+
+ \sa <QtAlgorithms>, QSysInfo
+*/
+
+/*!
+ \typedef qreal
+ \relates <QtGlobal>
+
+ Typedef for \c double on all platforms except for those using CPUs with
+ ARM architectures.
+ On ARM-based platforms, \c qreal is a typedef for \c float for performance
+ reasons.
+*/
+
+/*! \typedef uchar
+ \relates <QtGlobal>
+
+ Convenience typedef for \c{unsigned char}.
+*/
+
+/*!
+ \fn qt_set_sequence_auto_mnemonic(bool on)
+ \relates <QtGlobal>
+
+ Enables automatic mnemonics on Mac if \a on is true; otherwise
+ this feature is disabled.
+
+ Note that this function is only available on Mac where mnemonics
+ are disabled by default.
+
+ To access to this function, use an extern declaration:
+ extern void qt_set_sequence_auto_mnemonic(bool b);
+
+ \sa {QShortcut#mnemonic}{QShortcut}
+*/
+
+/*! \typedef ushort
+ \relates <QtGlobal>
+
+ Convenience typedef for \c{unsigned short}.
+*/
+
+/*! \typedef uint
+ \relates <QtGlobal>
+
+ Convenience typedef for \c{unsigned int}.
+*/
+
+/*! \typedef ulong
+ \relates <QtGlobal>
+
+ Convenience typedef for \c{unsigned long}.
+*/
+
+/*! \typedef qint8
+ \relates <QtGlobal>
+
+ Typedef for \c{signed char}. This type is guaranteed to be 8-bit
+ on all platforms supported by Qt.
+*/
+
+/*!
+ \typedef quint8
+ \relates <QtGlobal>
+
+ Typedef for \c{unsigned char}. This type is guaranteed to
+ be 8-bit on all platforms supported by Qt.
+*/
+
+/*! \typedef qint16
+ \relates <QtGlobal>
+
+ Typedef for \c{signed short}. This type is guaranteed to be
+ 16-bit on all platforms supported by Qt.
+*/
+
+/*!
+ \typedef quint16
+ \relates <QtGlobal>
+
+ Typedef for \c{unsigned short}. This type is guaranteed to
+ be 16-bit on all platforms supported by Qt.
+*/
+
+/*! \typedef qint32
+ \relates <QtGlobal>
+
+ Typedef for \c{signed int}. This type is guaranteed to be 32-bit
+ on all platforms supported by Qt.
+*/
+
+/*!
+ \typedef quint32
+ \relates <QtGlobal>
+
+ Typedef for \c{unsigned int}. This type is guaranteed to
+ be 32-bit on all platforms supported by Qt.
+*/
+
+/*! \typedef qint64
+ \relates <QtGlobal>
+
+ Typedef for \c{long long int} (\c __int64 on Windows). This type
+ is guaranteed to be 64-bit on all platforms supported by Qt.
+
+ Literals of this type can be created using the Q_INT64_C() macro:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 5
+
+ \sa Q_INT64_C(), quint64, qlonglong
+*/
+
+/*!
+ \typedef quint64
+ \relates <QtGlobal>
+
+ Typedef for \c{unsigned long long int} (\c{unsigned __int64} on
+ Windows). This type is guaranteed to be 64-bit on all platforms
+ supported by Qt.
+
+ Literals of this type can be created using the Q_UINT64_C()
+ macro:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 6
+
+ \sa Q_UINT64_C(), qint64, qulonglong
+*/
+
+/*!
+ \typedef quintptr
+ \relates <QtGlobal>
+
+ Integral type for representing a pointers (useful for hashing,
+ etc.).
+
+ Typedef for either quint32 or quint64. This type is guaranteed to
+ be the same size as a pointer on all platforms supported by Qt. On
+ a system with 32-bit pointers, quintptr is a typedef for quint32;
+ on a system with 64-bit pointers, quintptr is a typedef for
+ quint64.
+
+ Note that quintptr is unsigned. Use qptrdiff for signed values.
+
+ \sa qptrdiff, quint32, quint64
+*/
+
+/*!
+ \typedef qptrdiff
+ \relates <QtGlobal>
+
+ Integral type for representing pointer differences.
+
+ Typedef for either qint32 or qint64. This type is guaranteed to be
+ the same size as a pointer on all platforms supported by Qt. On a
+ system with 32-bit pointers, quintptr is a typedef for quint32; on
+ a system with 64-bit pointers, quintptr is a typedef for quint64.
+
+ Note that qptrdiff is signed. Use quintptr for unsigned values.
+
+ \sa quintptr, qint32, qint64
+*/
+
+/*!
+ \typedef QtMsgHandler
+ \relates <QtGlobal>
+
+ This is a typedef for a pointer to a function with the following
+ signature:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 7
+
+ \sa QtMsgType, qInstallMsgHandler()
+*/
+
+/*!
+ \enum QtMsgType
+ \relates <QtGlobal>
+
+ This enum describes the messages that can be sent to a message
+ handler (QtMsgHandler). You can use the enum to identify and
+ associate the various message types with the appropriate
+ actions.
+
+ \value QtDebugMsg
+ A message generated by the qDebug() function.
+ \value QtWarningMsg
+ A message generated by the qWarning() function.
+ \value QtCriticalMsg
+ A message generated by the qCritical() function.
+ \value QtFatalMsg
+ A message generated by the qFatal() function.
+ \value QtSystemMsg
+
+
+ \sa QtMsgHandler, qInstallMsgHandler()
+*/
+
+/*! \macro qint64 Q_INT64_C(literal)
+ \relates <QtGlobal>
+
+ Wraps the signed 64-bit integer \a literal in a
+ platform-independent way. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 8
+
+ \sa qint64, Q_UINT64_C()
+*/
+
+/*! \macro quint64 Q_UINT64_C(literal)
+ \relates <QtGlobal>
+
+ Wraps the unsigned 64-bit integer \a literal in a
+ platform-independent way. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 9
+
+ \sa quint64, Q_INT64_C()
+*/
+
+/*! \typedef qlonglong
+ \relates <QtGlobal>
+
+ Typedef for \c{long long int} (\c __int64 on Windows). This is
+ the same as \l qint64.
+
+ \sa qulonglong, qint64
+*/
+
+/*!
+ \typedef qulonglong
+ \relates <QtGlobal>
+
+ Typedef for \c{unsigned long long int} (\c{unsigned __int64} on
+ Windows). This is the same as \l quint64.
+
+ \sa quint64, qlonglong
+*/
+
+/*! \fn const T &qAbs(const T &value)
+ \relates <QtGlobal>
+
+ Returns the absolute value of \a value. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 10
+*/
+
+/*! \fn int qRound(qreal value)
+ \relates <QtGlobal>
+
+ Rounds \a value to the nearest integer. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 11
+*/
+
+/*! \fn qint64 qRound64(qreal value)
+ \relates <QtGlobal>
+
+ Rounds \a value to the nearest 64-bit integer. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 12
+*/
+
+/*! \fn const T &qMin(const T &value1, const T &value2)
+ \relates <QtGlobal>
+
+ Returns the minimum of \a value1 and \a value2. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 13
+
+ \sa qMax(), qBound()
+*/
+
+/*! \fn const T &qMax(const T &value1, const T &value2)
+ \relates <QtGlobal>
+
+ Returns the maximum of \a value1 and \a value2. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 14
+
+ \sa qMin(), qBound()
+*/
+
+/*! \fn const T &qBound(const T &min, const T &value, const T &max)
+ \relates <QtGlobal>
+
+ Returns \a value bounded by \a min and \a max. This is equivalent
+ to qMax(\a min, qMin(\a value, \a max)). For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 15
+
+ \sa qMin(), qMax()
+*/
+
+/*!
+ \typedef Q_INT8
+ \relates <QtGlobal>
+ \compat
+
+ Use \l qint8 instead.
+*/
+
+/*!
+ \typedef Q_UINT8
+ \relates <QtGlobal>
+ \compat
+
+ Use \l quint8 instead.
+*/
+
+/*!
+ \typedef Q_INT16
+ \relates <QtGlobal>
+ \compat
+
+ Use \l qint16 instead.
+*/
+
+/*!
+ \typedef Q_UINT16
+ \relates <QtGlobal>
+ \compat
+
+ Use \l quint16 instead.
+*/
+
+/*!
+ \typedef Q_INT32
+ \relates <QtGlobal>
+ \compat
+
+ Use \l qint32 instead.
+*/
+
+/*!
+ \typedef Q_UINT32
+ \relates <QtGlobal>
+ \compat
+
+ Use \l quint32 instead.
+*/
+
+/*!
+ \typedef Q_INT64
+ \relates <QtGlobal>
+ \compat
+
+ Use \l qint64 instead.
+*/
+
+/*!
+ \typedef Q_UINT64
+ \relates <QtGlobal>
+ \compat
+
+ Use \l quint64 instead.
+*/
+
+/*!
+ \typedef Q_LLONG
+ \relates <QtGlobal>
+ \compat
+
+ Use \l qint64 instead.
+*/
+
+/*!
+ \typedef Q_ULLONG
+ \relates <QtGlobal>
+ \compat
+
+ Use \l quint64 instead.
+*/
+
+/*!
+ \typedef Q_LONG
+ \relates <QtGlobal>
+ \compat
+
+ Use \c{void *} instead.
+*/
+
+/*!
+ \typedef Q_ULONG
+ \relates <QtGlobal>
+ \compat
+
+ Use \c{void *} instead.
+*/
+
+/*! \fn bool qSysInfo(int *wordSize, bool *bigEndian)
+ \relates <QtGlobal>
+
+ Use QSysInfo::WordSize and QSysInfo::ByteOrder instead.
+*/
+
+/*!
+ \fn bool qt_winUnicode()
+ \relates <QtGlobal>
+
+ Use QSysInfo::WindowsVersion and QSysInfo::WV_DOS_based instead.
+
+ \sa QSysInfo
+*/
+
+/*!
+ \fn int qWinVersion()
+ \relates <QtGlobal>
+
+ Use QSysInfo::WindowsVersion instead.
+
+ \sa QSysInfo
+*/
+
+/*!
+ \fn int qMacVersion()
+ \relates <QtGlobal>
+
+ Use QSysInfo::MacintoshVersion instead.
+
+ \sa QSysInfo
+*/
+
+/*!
+ \macro QT_VERSION
+ \relates <QtGlobal>
+
+ This macro expands a numeric value of the form 0xMMNNPP (MM =
+ major, NN = minor, PP = patch) that specifies Qt's version
+ number. For example, if you compile your application against Qt
+ 4.1.2, the QT_VERSION macro will expand to 0x040102.
+
+ You can use QT_VERSION to use the latest Qt features where
+ available. For example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 16
+
+ \sa QT_VERSION_STR, qVersion()
+*/
+
+/*!
+ \macro QT_VERSION_STR
+ \relates <QtGlobal>
+
+ This macro expands to a string that specifies Qt's version number
+ (for example, "4.1.2"). This is the version against which the
+ application is compiled.
+
+ \sa qVersion(), QT_VERSION
+*/
+
+/*!
+ \relates <QtGlobal>
+
+ Returns the version number of Qt at run-time as a string (for
+ example, "4.1.2"). This may be a different version than the
+ version the application was compiled against.
+
+ \sa QT_VERSION_STR
+*/
+
+const char *qVersion()
+{
+ return QT_VERSION_STR;
+}
+
+bool qSharedBuild()
+{
+#ifdef QT_SHARED
+ return true;
+#else
+ return false;
+#endif
+}
+
+/*****************************************************************************
+ System detection routines
+ *****************************************************************************/
+
+/*!
+ \class QSysInfo
+ \brief The QSysInfo class provides information about the system.
+
+ \list
+ \o \l WordSize specifies the size of a pointer for the platform
+ on which the application is compiled.
+ \o \l ByteOrder specifies whether the platform is big-endian or
+ little-endian.
+ \o \l WindowsVersion specifies the version of the Windows operating
+ system on which the application is run (Windows only)
+ \o \l MacintoshVersion specifies the version of the Macintosh
+ operating system on which the application is run (Mac only).
+ \endlist
+
+ Some constants are defined only on certain platforms. You can use
+ the preprocessor symbols Q_WS_WIN and Q_WS_MAC to test that
+ the application is compiled under Windows or Mac.
+
+ \sa QLibraryInfo
+*/
+
+/*!
+ \enum QSysInfo::Sizes
+
+ This enum provides platform-specific information about the sizes of data
+ structures used by the underlying architecture.
+
+ \value WordSize The size in bits of a pointer for the platform on which
+ the application is compiled (32 or 64).
+*/
+
+/*!
+ \variable QSysInfo::WindowsVersion
+ \brief the version of the Windows operating system on which the
+ application is run (Windows only)
+*/
+
+/*!
+ \fn QSysInfo::WindowsVersion QSysInfo::windowsVersion()
+ \since 4.4
+
+ Returns the version of the Windows operating system on which the
+ application is run (Windows only).
+*/
+
+/*!
+ \variable QSysInfo::MacintoshVersion
+ \brief the version of the Macintosh operating system on which
+ the application is run (Mac only).
+*/
+
+/*!
+ \enum QSysInfo::Endian
+
+ \value BigEndian Big-endian byte order (also called Network byte order)
+ \value LittleEndian Little-endian byte order
+ \value ByteOrder Equals BigEndian or LittleEndian, depending on
+ the platform's byte order.
+*/
+
+/*!
+ \enum QSysInfo::WinVersion
+
+ This enum provides symbolic names for the various versions of the
+ Windows operating system. On Windows, the
+ QSysInfo::WindowsVersion variable gives the version of the system
+ on which the application is run.
+
+ MS-DOS-based versions:
+
+ \value WV_32s Windows 3.1 with Win 32s
+ \value WV_95 Windows 95
+ \value WV_98 Windows 98
+ \value WV_Me Windows Me
+
+ NT-based versions (note that each operating system version is only represented once rather than each Windows edition):
+
+ \value WV_NT Windows NT (operating system version 4.0)
+ \value WV_2000 Windows 2000 (operating system version 5.0)
+ \value WV_XP Windows XP (operating system version 5.1)
+ \value WV_2003 Windows Server 2003, Windows Server 2003 R2, Windows Home Server, Windows XP Professional x64 Edition (operating system version 5.2)
+ \value WV_VISTA Windows Vista, Windows Server 2008 (operating system version 6.0)
+
+ Alternatively, you may use the following macros which correspond directly to the Windows operating system version number:
+
+ \value WV_4_0 Operating system version 4.0, corresponds to Windows NT
+ \value WV_5_0 Operating system version 5.0, corresponds to Windows 2000
+ \value WV_5_1 Operating system version 5.1, corresponds to Windows XP
+ \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
+ \value WV_6_0 Operating system version 6.0, corresponds to Windows Vista and Windows Server 2008
+
+ CE-based versions:
+
+ \value WV_CE Windows CE
+ \value WV_CENET Windows CE .NET
+ \value WV_CE_5 Windows CE 5.x
+ \value WV_CE_6 Windows CE 6.x
+
+ The following masks can be used for testing whether a Windows
+ version is MS-DOS-based, NT-based, or CE-based:
+
+ \value WV_DOS_based MS-DOS-based version of Windows
+ \value WV_NT_based NT-based version of Windows
+ \value WV_CE_based CE-based version of Windows
+
+ \sa MacVersion
+*/
+
+/*!
+ \enum QSysInfo::MacVersion
+
+ This enum provides symbolic names for the various versions of the
+ Macintosh operating system. On Mac, the
+ QSysInfo::MacintoshVersion variable gives the version of the
+ system on which the application is run.
+
+ \value MV_9 Mac OS 9 (unsupported)
+ \value MV_10_0 Mac OS X 10.0 (unsupported)
+ \value MV_10_1 Mac OS X 10.1 (unsupported)
+ \value MV_10_2 Mac OS X 10.2 (unsupported)
+ \value MV_10_3 Mac OS X 10.3
+ \value MV_10_4 Mac OS X 10.4
+ \value MV_10_5 Mac OS X 10.5
+ \value MV_Unknown An unknown and currently unsupported platform
+
+ \value MV_CHEETAH Apple codename for MV_10_0
+ \value MV_PUMA Apple codename for MV_10_1
+ \value MV_JAGUAR Apple codename for MV_10_2
+ \value MV_PANTHER Apple codename for MV_10_3
+ \value MV_TIGER Apple codename for MV_10_4
+ \value MV_LEOPARD Apple codename for MV_10_5
+
+ \sa WinVersion
+*/
+
+/*!
+ \macro Q_WS_MAC
+ \relates <QtGlobal>
+
+ Defined on Mac OS X.
+
+ \sa Q_WS_WIN, Q_WS_X11, Q_WS_QWS
+*/
+
+/*!
+ \macro Q_WS_WIN
+ \relates <QtGlobal>
+
+ Defined on Windows.
+
+ \sa Q_WS_MAC, Q_WS_X11, Q_WS_QWS
+*/
+
+/*!
+ \macro Q_WS_X11
+ \relates <QtGlobal>
+
+ Defined on X11.
+
+ \sa Q_WS_MAC, Q_WS_WIN, Q_WS_QWS
+*/
+
+/*!
+ \macro Q_WS_QWS
+ \relates <QtGlobal>
+
+ Defined on Qt for Embedded Linux.
+
+ \sa Q_WS_MAC, Q_WS_WIN, Q_WS_X11
+*/
+
+/*!
+ \macro Q_OS_DARWIN
+ \relates <QtGlobal>
+
+ Defined on Darwin OS (synonym for Q_OS_MAC).
+*/
+
+/*!
+ \macro Q_OS_MSDOS
+ \relates <QtGlobal>
+
+ Defined on MS-DOS and Windows.
+*/
+
+/*!
+ \macro Q_OS_OS2
+ \relates <QtGlobal>
+
+ Defined on OS/2.
+*/
+
+/*!
+ \macro Q_OS_OS2EMX
+ \relates <QtGlobal>
+
+ Defined on XFree86 on OS/2 (not PM).
+*/
+
+/*!
+ \macro Q_OS_WIN32
+ \relates <QtGlobal>
+
+ Defined on all supported versions of Windows.
+*/
+
+/*!
+ \macro Q_OS_WINCE
+ \relates <QtGlobal>
+
+ Defined on Windows CE.
+*/
+
+/*!
+ \macro Q_OS_CYGWIN
+ \relates <QtGlobal>
+
+ Defined on Cygwin.
+*/
+
+/*!
+ \macro Q_OS_SOLARIS
+ \relates <QtGlobal>
+
+ Defined on Sun Solaris.
+*/
+
+/*!
+ \macro Q_OS_HPUX
+ \relates <QtGlobal>
+
+ Defined on HP-UX.
+*/
+
+/*!
+ \macro Q_OS_ULTRIX
+ \relates <QtGlobal>
+
+ Defined on DEC Ultrix.
+*/
+
+/*!
+ \macro Q_OS_LINUX
+ \relates <QtGlobal>
+
+ Defined on Linux.
+*/
+
+/*!
+ \macro Q_OS_FREEBSD
+ \relates <QtGlobal>
+
+ Defined on FreeBSD.
+*/
+
+/*!
+ \macro Q_OS_NETBSD
+ \relates <QtGlobal>
+
+ Defined on NetBSD.
+*/
+
+/*!
+ \macro Q_OS_OPENBSD
+ \relates <QtGlobal>
+
+ Defined on OpenBSD.
+*/
+
+/*!
+ \macro Q_OS_BSDI
+ \relates <QtGlobal>
+
+ Defined on BSD/OS.
+*/
+
+/*!
+ \macro Q_OS_IRIX
+ \relates <QtGlobal>
+
+ Defined on SGI Irix.
+*/
+
+/*!
+ \macro Q_OS_OSF
+ \relates <QtGlobal>
+
+ Defined on HP Tru64 UNIX.
+*/
+
+/*!
+ \macro Q_OS_SCO
+ \relates <QtGlobal>
+
+ Defined on SCO OpenServer 5.
+*/
+
+/*!
+ \macro Q_OS_UNIXWARE
+ \relates <QtGlobal>
+
+ Defined on UnixWare 7, Open UNIX 8.
+*/
+
+/*!
+ \macro Q_OS_AIX
+ \relates <QtGlobal>
+
+ Defined on AIX.
+*/
+
+/*!
+ \macro Q_OS_HURD
+ \relates <QtGlobal>
+
+ Defined on GNU Hurd.
+*/
+
+/*!
+ \macro Q_OS_DGUX
+ \relates <QtGlobal>
+
+ Defined on DG/UX.
+*/
+
+/*!
+ \macro Q_OS_RELIANT
+ \relates <QtGlobal>
+
+ Defined on Reliant UNIX.
+*/
+
+/*!
+ \macro Q_OS_DYNIX
+ \relates <QtGlobal>
+
+ Defined on DYNIX/ptx.
+*/
+
+/*!
+ \macro Q_OS_QNX
+ \relates <QtGlobal>
+
+ Defined on QNX.
+*/
+
+/*!
+ \macro Q_OS_QNX6
+ \relates <QtGlobal>
+
+ Defined on QNX RTP 6.1.
+*/
+
+/*!
+ \macro Q_OS_LYNX
+ \relates <QtGlobal>
+
+ Defined on LynxOS.
+*/
+
+/*!
+ \macro Q_OS_BSD4
+ \relates <QtGlobal>
+
+ Defined on Any BSD 4.4 system.
+*/
+
+/*!
+ \macro Q_OS_UNIX
+ \relates <QtGlobal>
+
+ Defined on Any UNIX BSD/SYSV system.
+*/
+
+/*!
+ \macro Q_CC_SYM
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Digital Mars C/C++
+ (used to be Symantec C++).
+*/
+
+/*!
+ \macro Q_CC_MWERKS
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Metrowerks
+ CodeWarrior.
+*/
+
+/*!
+ \macro Q_CC_MSVC
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Microsoft Visual
+ C/C++, Intel C++ for Windows.
+*/
+
+/*!
+ \macro Q_CC_BOR
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Borland/Turbo C++.
+*/
+
+/*!
+ \macro Q_CC_WAT
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Watcom C++.
+*/
+
+/*!
+ \macro Q_CC_GNU
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using GNU C++.
+*/
+
+/*!
+ \macro Q_CC_COMEAU
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Comeau C++.
+*/
+
+/*!
+ \macro Q_CC_EDG
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Edison Design Group
+ C++.
+*/
+
+/*!
+ \macro Q_CC_OC
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using CenterLine C++.
+*/
+
+/*!
+ \macro Q_CC_SUN
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Forte Developer, or
+ Sun Studio C++.
+*/
+
+/*!
+ \macro Q_CC_MIPS
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using MIPSpro C++.
+*/
+
+/*!
+ \macro Q_CC_DEC
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using DEC C++.
+*/
+
+/*!
+ \macro Q_CC_HPACC
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using HP aC++.
+*/
+
+/*!
+ \macro Q_CC_USLC
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using SCO OUDK and UDK.
+*/
+
+/*!
+ \macro Q_CC_CDS
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Reliant C++.
+*/
+
+/*!
+ \macro Q_CC_KAI
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using KAI C++.
+*/
+
+/*!
+ \macro Q_CC_INTEL
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Intel C++ for Linux,
+ Intel C++ for Windows.
+*/
+
+/*!
+ \macro Q_CC_HIGHC
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using MetaWare High C/C++.
+*/
+
+/*!
+ \macro Q_CC_PGI
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Portland Group C++.
+*/
+
+/*!
+ \macro Q_CC_GHS
+ \relates <QtGlobal>
+
+ Defined if the application is compiled using Green Hills
+ Optimizing C++ Compilers.
+*/
+
+#if defined(QT_BUILD_QMAKE)
+// needed to bootstrap qmake
+static const unsigned int qt_one = 1;
+const int QSysInfo::ByteOrder = ((*((unsigned char *) &qt_one) == 0) ? BigEndian : LittleEndian);
+#endif
+
+#if !defined(QWS) && defined(Q_OS_MAC)
+
+QT_BEGIN_INCLUDE_NAMESPACE
+#include "private/qcore_mac_p.h"
+#include "qnamespace.h"
+QT_END_INCLUDE_NAMESPACE
+
+Q_CORE_EXPORT OSErr qt_mac_create_fsref(const QString &file, FSRef *fsref)
+{
+ return FSPathMakeRef(reinterpret_cast<const UInt8 *>(file.toUtf8().constData()), fsref, 0);
+}
+
+// Don't use this function, it won't work in 10.5 (Leopard) and up
+Q_CORE_EXPORT OSErr qt_mac_create_fsspec(const QString &file, FSSpec *spec)
+{
+ FSRef fsref;
+ OSErr ret = qt_mac_create_fsref(file, &fsref);
+ if (ret == noErr)
+ ret = FSGetCatalogInfo(&fsref, kFSCatInfoNone, 0, 0, spec, 0);
+ return ret;
+}
+
+Q_CORE_EXPORT void qt_mac_to_pascal_string(QString s, Str255 str, TextEncoding encoding=0, int len=-1)
+{
+ if(len == -1)
+ len = s.length();
+#if 0
+ UnicodeMapping mapping;
+ mapping.unicodeEncoding = CreateTextEncoding(kTextEncodingUnicodeDefault,
+ kTextEncodingDefaultVariant,
+ kUnicode16BitFormat);
+ mapping.otherEncoding = (encoding ? encoding : );
+ mapping.mappingVersion = kUnicodeUseLatestMapping;
+
+ UnicodeToTextInfo info;
+ OSStatus err = CreateUnicodeToTextInfo(&mapping, &info);
+ if(err != noErr) {
+ qDebug("Qt: internal: Unable to create pascal string '%s'::%d [%ld]",
+ s.left(len).latin1(), (int)encoding, err);
+ return;
+ }
+ const int unilen = len * 2;
+ const UniChar *unibuf = (UniChar *)s.unicode();
+ ConvertFromUnicodeToPString(info, unilen, unibuf, str);
+ DisposeUnicodeToTextInfo(&info);
+#else
+ Q_UNUSED(encoding);
+ CFStringGetPascalString(QCFString(s), str, 256, CFStringGetSystemEncoding());
+#endif
+}
+
+Q_CORE_EXPORT QString qt_mac_from_pascal_string(const Str255 pstr) {
+ return QCFString(CFStringCreateWithPascalString(0, pstr, CFStringGetSystemEncoding()));
+}
+
+
+
+static QSysInfo::MacVersion macVersion()
+{
+ SInt32 gestalt_version;
+ if (Gestalt(gestaltSystemVersion, &gestalt_version) == noErr) {
+ return QSysInfo::MacVersion(((gestalt_version & 0x00F0) >> 4) + 2);
+ }
+ return QSysInfo::MV_Unknown;
+}
+const QSysInfo::MacVersion QSysInfo::MacintoshVersion = macVersion();
+
+#elif defined(Q_OS_WIN32) || defined(Q_OS_CYGWIN) || defined(Q_OS_WINCE)
+
+QT_BEGIN_INCLUDE_NAMESPACE
+#include "qt_windows.h"
+QT_END_INCLUDE_NAMESPACE
+
+QSysInfo::WinVersion QSysInfo::windowsVersion()
+{
+#ifndef VER_PLATFORM_WIN32s
+#define VER_PLATFORM_WIN32s 0
+#endif
+#ifndef VER_PLATFORM_WIN32_WINDOWS
+#define VER_PLATFORM_WIN32_WINDOWS 1
+#endif
+#ifndef VER_PLATFORM_WIN32_NT
+#define VER_PLATFORM_WIN32_NT 2
+#endif
+#ifndef VER_PLATFORM_WIN32_CE
+#define VER_PLATFORM_WIN32_CE 3
+#endif
+
+ static QSysInfo::WinVersion winver;
+ if (winver)
+ return winver;
+ winver = QSysInfo::WV_NT;
+#ifndef Q_OS_WINCE
+ OSVERSIONINFOA osver;
+ osver.dwOSVersionInfoSize = sizeof(osver);
+ GetVersionExA(&osver);
+#else
+ DWORD qt_cever = 0;
+ OSVERSIONINFOW osver;
+ osver.dwOSVersionInfoSize = sizeof(osver);
+ GetVersionEx(&osver);
+ qt_cever = osver.dwMajorVersion * 100;
+ qt_cever += osver.dwMinorVersion * 10;
+#endif
+ switch (osver.dwPlatformId) {
+ case VER_PLATFORM_WIN32s:
+ winver = QSysInfo::WV_32s;
+ break;
+ case VER_PLATFORM_WIN32_WINDOWS:
+ // We treat Windows Me (minor 90) the same as Windows 98
+ if (osver.dwMinorVersion == 90)
+ winver = QSysInfo::WV_Me;
+ else if (osver.dwMinorVersion == 10)
+ winver = QSysInfo::WV_98;
+ else
+ winver = QSysInfo::WV_95;
+ break;
+#ifdef Q_OS_WINCE
+ case VER_PLATFORM_WIN32_CE:
+ if (qt_cever >= 600)
+ winver = QSysInfo::WV_CE_6;
+ if (qt_cever >= 500)
+ winver = QSysInfo::WV_CE_5;
+ else if (qt_cever >= 400)
+ winver = QSysInfo::WV_CENET;
+ else
+ winver = QSysInfo::WV_CE;
+ break;
+#endif
+ default: // VER_PLATFORM_WIN32_NT
+ if (osver.dwMajorVersion < 5) {
+ winver = QSysInfo::WV_NT;
+ } else if (osver.dwMajorVersion == 6) {
+ winver = QSysInfo::WV_VISTA;
+ } else if (osver.dwMinorVersion == 0) {
+ winver = QSysInfo::WV_2000;
+ } else if (osver.dwMinorVersion == 1) {
+ winver = QSysInfo::WV_XP;
+ } else if (osver.dwMinorVersion == 2) {
+ winver = QSysInfo::WV_2003;
+ } else {
+ qWarning("Qt: Untested Windows version detected!");
+ winver = QSysInfo::WV_NT_based;
+ }
+ }
+
+#ifdef QT_DEBUG
+ {
+ QByteArray override = qgetenv("QT_WINVER_OVERRIDE");
+ if (override.isEmpty())
+ return winver;
+
+ if (override == "Me")
+ winver = QSysInfo::WV_Me;
+ if (override == "95")
+ winver = QSysInfo::WV_95;
+ else if (override == "98")
+ winver = QSysInfo::WV_98;
+ else if (override == "NT")
+ winver = QSysInfo::WV_NT;
+ else if (override == "2000")
+ winver = QSysInfo::WV_2000;
+ else if (override == "2003")
+ winver = QSysInfo::WV_2003;
+ else if (override == "XP")
+ winver = QSysInfo::WV_XP;
+ else if (override == "VISTA")
+ winver = QSysInfo::WV_VISTA;
+ }
+#endif
+
+ return winver;
+}
+
+const QSysInfo::WinVersion QSysInfo::WindowsVersion = QSysInfo::windowsVersion();
+
+#endif
+
+/*!
+ \macro void Q_ASSERT(bool test)
+ \relates <QtGlobal>
+
+ Prints a warning message containing the source code file name and
+ line number if \a test is false.
+
+ Q_ASSERT() is useful for testing pre- and post-conditions
+ during development. It does nothing if \c QT_NO_DEBUG was defined
+ during compilation.
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 17
+
+ If \c b is zero, the Q_ASSERT statement will output the following
+ message using the qFatal() function:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 18
+
+ \sa Q_ASSERT_X(), qFatal(), {Debugging Techniques}
+*/
+
+/*!
+ \macro void Q_ASSERT_X(bool test, const char *where, const char *what)
+ \relates <QtGlobal>
+
+ Prints the message \a what together with the location \a where,
+ the source file name and line number if \a test is false.
+
+ Q_ASSERT_X is useful for testing pre- and post-conditions during
+ development. It does nothing if \c QT_NO_DEBUG was defined during
+ compilation.
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 19
+
+ If \c b is zero, the Q_ASSERT_X statement will output the following
+ message using the qFatal() function:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 20
+
+ \sa Q_ASSERT(), qFatal(), {Debugging Techniques}
+*/
+
+/*!
+ \macro void Q_CHECK_PTR(void *pointer)
+ \relates <QtGlobal>
+
+ If \a pointer is 0, prints a warning message containing the source
+ code's file name and line number, saying that the program ran out
+ of memory.
+
+ Q_CHECK_PTR does nothing if \c QT_NO_DEBUG was defined during
+ compilation.
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 21
+
+ \sa qWarning(), {Debugging Techniques}
+*/
+
+/*!
+ \macro const char* Q_FUNC_INFO()
+ \relates <QtGlobal>
+
+ Expands to a string that describe the function the macro resides in. How this string looks
+ more specifically is compiler dependent. With GNU GCC it is typically the function signature,
+ while with other compilers it might be the line and column number.
+
+ Q_FUNC_INFO can be conveniently used with qDebug(). For example, this function:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 22
+
+ when instantiated with the integer type, will with the GCC compiler produce:
+
+ \tt{const TInputType& myMin(const TInputType&, const TInputType&) [with TInputType = int] was called with value1: 3 value2: 4}
+
+ If this macro is used outside a function, the behavior is undefined.
+ */
+
+/*
+ The Q_CHECK_PTR macro calls this function if an allocation check
+ fails.
+*/
+void qt_check_pointer(const char *n, int l)
+{
+ qWarning("In file %s, line %d: Out of memory", n, l);
+}
+
+/*
+ The Q_ASSERT macro calls this function when the test fails.
+*/
+void qt_assert(const char *assertion, const char *file, int line)
+{
+ qFatal("ASSERT: \"%s\" in file %s, line %d", assertion, file, line);
+}
+
+/*
+ The Q_ASSERT_X macro calls this function when the test fails.
+*/
+void qt_assert_x(const char *where, const char *what, const char *file, int line)
+{
+ qFatal("ASSERT failure in %s: \"%s\", file %s, line %d", where, what, file, line);
+}
+
+
+/*
+ Dijkstra's bisection algorithm to find the square root of an integer.
+ Deliberately not exported as part of the Qt API, but used in both
+ qsimplerichtext.cpp and qgfxraster_qws.cpp
+*/
+Q_CORE_EXPORT unsigned int qt_int_sqrt(unsigned int n)
+{
+ // n must be in the range 0...UINT_MAX/2-1
+ if (n >= (UINT_MAX>>2)) {
+ unsigned int r = 2 * qt_int_sqrt(n / 4);
+ unsigned int r2 = r + 1;
+ return (n >= r2 * r2) ? r2 : r;
+ }
+ uint h, p= 0, q= 1, r= n;
+ while (q <= n)
+ q <<= 2;
+ while (q != 1) {
+ q >>= 2;
+ h= p + q;
+ p >>= 1;
+ if (r >= h) {
+ p += q;
+ r -= h;
+ }
+ }
+ return p;
+}
+
+#if defined(qMemCopy)
+# undef qMemCopy
+#endif
+#if defined(qMemSet)
+# undef qMemSet
+#endif
+
+void *qMemCopy(void *dest, const void *src, size_t n) { return memcpy(dest, src, n); }
+void *qMemSet(void *dest, int c, size_t n) { return memset(dest, c, n); }
+
+static QtMsgHandler handler = 0; // pointer to debug handler
+
+#ifdef Q_CC_MWERKS
+extern bool qt_is_gui_used;
+static void mac_default_handler(const char *msg)
+{
+ if (qt_is_gui_used) {
+ Str255 pmsg;
+ qt_mac_to_pascal_string(msg, pmsg);
+ DebugStr(pmsg);
+ } else {
+ fprintf(stderr, msg);
+ }
+}
+#endif // Q_CC_MWERKS
+
+
+
+QString qt_error_string(int errorCode)
+{
+ const char *s = 0;
+ QString ret;
+ if (errorCode == -1) {
+#if defined(Q_OS_WIN)
+ errorCode = GetLastError();
+#else
+ errorCode = errno;
+#endif
+ }
+ switch (errorCode) {
+ case 0:
+ break;
+ case EACCES:
+ s = QT_TRANSLATE_NOOP("QIODevice", "Permission denied");
+ break;
+ case EMFILE:
+ s = QT_TRANSLATE_NOOP("QIODevice", "Too many open files");
+ break;
+ case ENOENT:
+ s = QT_TRANSLATE_NOOP("QIODevice", "No such file or directory");
+ break;
+ case ENOSPC:
+ s = QT_TRANSLATE_NOOP("QIODevice", "No space left on device");
+ break;
+ default: {
+#ifdef Q_OS_WIN
+ QT_WA({
+ unsigned short *string = 0;
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ errorCode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR)&string,
+ 0,
+ NULL);
+ ret = QString::fromUtf16(string);
+ LocalFree((HLOCAL)string);
+ }, {
+ char *string = 0;
+ FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ errorCode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPSTR)&string,
+ 0,
+ NULL);
+ ret = QString::fromLocal8Bit(string);
+ LocalFree((HLOCAL)string);
+ });
+
+ if (ret.isEmpty() && errorCode == ERROR_MOD_NOT_FOUND)
+ ret = QString::fromLatin1("The specified module could not be found.");
+
+#elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L && !defined(Q_OS_INTEGRITY)
+
+ QByteArray buf(1024, '\0');
+ strerror_r(errorCode, buf.data(), buf.size());
+ ret = QString::fromLocal8Bit(buf.constData());
+#else
+ ret = QString::fromLocal8Bit(strerror(errorCode));
+#endif
+ break; }
+ }
+ if (s)
+ // ######## this breaks moc build currently
+// ret = QCoreApplication::translate("QIODevice", s);
+ ret = QString::fromLatin1(s);
+ return ret.trimmed();
+}
+
+
+/*!
+ \fn QtMsgHandler qInstallMsgHandler(QtMsgHandler handler)
+ \relates <QtGlobal>
+
+ Installs a Qt message \a handler which has been defined
+ previously. Returns a pointer to the previous message handler
+ (which may be 0).
+
+ The message handler is a function that prints out debug messages,
+ warnings, critical and fatal error messages. The Qt library (debug
+ version) contains hundreds of warning messages that are printed
+ when internal errors (usually invalid function arguments)
+ occur. If you implement your own message handler, you get total
+ control of these messages.
+
+ The default message handler prints the message to the standard
+ output under X11 or to the debugger under Windows. If it is a
+ fatal message, the application aborts immediately.
+
+ Only one message handler can be defined, since this is usually
+ done on an application-wide basis to control debug output.
+
+ To restore the message handler, call \c qInstallMsgHandler(0).
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 23
+
+ \sa qDebug(), qWarning(), qCritical(), qFatal(), QtMsgType,
+ {Debugging Techniques}
+*/
+#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
+extern bool usingWinMain;
+extern Q_CORE_EXPORT void qWinMsgHandler(QtMsgType t, const char* str);
+#endif
+
+QtMsgHandler qInstallMsgHandler(QtMsgHandler h)
+{
+ QtMsgHandler old = handler;
+ handler = h;
+#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
+ if (!handler && usingWinMain)
+ handler = qWinMsgHandler;
+#endif
+ return old;
+}
+
+/*!
+ \internal
+*/
+void qt_message_output(QtMsgType msgType, const char *buf)
+{
+ if (handler) {
+ (*handler)(msgType, buf);
+ } else {
+#if defined(Q_CC_MWERKS)
+ mac_default_handler(buf);
+#elif defined(Q_OS_WINCE)
+ QString fstr = QString::fromLatin1(buf);
+ fstr += QLatin1String("\n");
+ OutputDebugString(reinterpret_cast<const wchar_t *> (fstr.utf16()));
+#else
+ fprintf(stderr, "%s\n", buf);
+ fflush(stderr);
+#endif
+ }
+
+ if (msgType == QtFatalMsg
+ || (msgType == QtWarningMsg
+ && (!qgetenv("QT_FATAL_WARNINGS").isNull())) ) {
+
+#if defined(Q_CC_MSVC) && defined(QT_DEBUG) && defined(_DEBUG) && defined(_CRT_ERROR)
+ // get the current report mode
+ int reportMode = _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_WNDW);
+ _CrtSetReportMode(_CRT_ERROR, reportMode);
+#if !defined(Q_OS_WINCE)
+ int ret = _CrtDbgReport(_CRT_ERROR, __FILE__, __LINE__, QT_VERSION_STR, buf);
+#else
+ int ret = _CrtDbgReportW(_CRT_ERROR, _CRT_WIDE(__FILE__),
+ __LINE__, _CRT_WIDE(QT_VERSION_STR), reinterpret_cast<const wchar_t *> (QString::fromLatin1(buf).utf16()));
+#endif
+ if (ret == 0 && reportMode & _CRTDBG_MODE_WNDW)
+ return; // ignore
+ else if (ret == 1)
+ _CrtDbgBreak();
+#endif
+
+#if (defined(Q_OS_UNIX) || defined(Q_CC_MINGW))
+ abort(); // trap; generates core dump
+#else
+ exit(1); // goodbye cruel world
+#endif
+ }
+}
+
+#undef qDebug
+/*!
+ \relates <QtGlobal>
+
+ Calls the message handler with the debug message \a msg. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the console, if it is a
+ console application; otherwise, it is sent to the debugger. This
+ function does nothing if \c QT_NO_DEBUG_OUTPUT was defined
+ during compilation.
+
+ If you pass the function a format string and a list of arguments,
+ it works in similar way to the C printf() function.
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 24
+
+ If you include \c <QtDebug>, a more convenient syntax is also
+ available:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 25
+
+ This syntax automatically puts a single space between each item,
+ and outputs a newline at the end. It supports many C++ and Qt
+ types.
+
+ To supress the output at runtime, install your own message handler
+ with qInstallMsgHandler().
+
+ \sa qWarning(), qCritical(), qFatal(), qInstallMsgHandler(),
+ {Debugging Techniques}
+*/
+void qDebug(const char *msg, ...)
+{
+ QString buf;
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ if (msg)
+ buf.vsprintf(msg, ap);
+ va_end(ap);
+
+ qt_message_output(QtDebugMsg, buf.toLocal8Bit().constData());
+}
+
+#undef qWarning
+/*!
+ \relates <QtGlobal>
+
+ Calls the message handler with the warning message \a msg. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the debugger. This
+ function does nothing if \c QT_NO_WARNING_OUTPUT was defined
+ during compilation; it exits if the environment variable \c
+ QT_FATAL_WARNINGS is defined.
+
+ This function takes a format string and a list of arguments,
+ similar to the C printf() function.
+
+ Example:
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 26
+
+ If you include <QtDebug>, a more convenient syntax is
+ also available:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 27
+
+ This syntax inserts a space between each item, and
+ appends a newline at the end.
+
+ To supress the output at runtime, install your own message handler
+ with qInstallMsgHandler().
+
+ \sa qDebug(), qCritical(), qFatal(), qInstallMsgHandler(),
+ {Debugging Techniques}
+*/
+void qWarning(const char *msg, ...)
+{
+ QString buf;
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ if (msg)
+ buf.vsprintf(msg, ap);
+ va_end(ap);
+
+ qt_message_output(QtWarningMsg, buf.toLocal8Bit().constData());
+}
+
+/*!
+ \relates <QtGlobal>
+
+ Calls the message handler with the critical message \a msg. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the debugger.
+
+ This function takes a format string and a list of arguments, similar
+ to the C printf() function.
+
+ Example:
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 28
+
+ If you include <QtDebug>, a more convenient syntax is
+ also available:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 29
+
+ A space is inserted between the items, and a newline is
+ appended at the end.
+
+ To supress the output at runtime, install your own message handler
+ with qInstallMsgHandler().
+
+ \sa qDebug(), qWarning(), qFatal(), qInstallMsgHandler(),
+ {Debugging Techniques}
+*/
+void qCritical(const char *msg, ...)
+{
+ QString buf;
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ if (msg)
+ buf.vsprintf(msg, ap);
+ va_end(ap);
+
+ qt_message_output(QtCriticalMsg, buf.toLocal8Bit().constData());
+}
+#ifdef QT3_SUPPORT
+void qSystemWarning(const char *msg, int code)
+ { qCritical("%s (%s)", msg, qt_error_string(code).toLocal8Bit().constData()); }
+#endif // QT3_SUPPORT
+
+void qErrnoWarning(const char *msg, ...)
+{
+ QString buf;
+ va_list ap;
+ va_start(ap, msg);
+ if (msg)
+ buf.vsprintf(msg, ap);
+ va_end(ap);
+
+ qCritical("%s (%s)", buf.toLocal8Bit().constData(), qt_error_string(-1).toLocal8Bit().constData());
+}
+
+void qErrnoWarning(int code, const char *msg, ...)
+{
+ QString buf;
+ va_list ap;
+ va_start(ap, msg);
+ if (msg)
+ buf.vsprintf(msg, ap);
+ va_end(ap);
+
+ qCritical("%s (%s)", buf.toLocal8Bit().constData(), qt_error_string(code).toLocal8Bit().constData());
+}
+
+/*!
+ \relates <QtGlobal>
+
+ Calls the message handler with the fatal message \a msg. If no
+ message handler has been installed, the message is printed to
+ stderr. Under Windows, the message is sent to the debugger.
+
+ If you are using the \bold{default message handler} this function will
+ abort on Unix systems to create a core dump. On Windows, for debug builds,
+ this function will report a _CRT_ERROR enabling you to connect a debugger
+ to the application.
+
+ This function takes a format string and a list of arguments,
+ similar to the C printf() function.
+
+ Example:
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 30
+
+ To supress the output at runtime, install your own message handler
+ with qInstallMsgHandler().
+
+ \sa qDebug(), qCritical(), qWarning(), qInstallMsgHandler(),
+ {Debugging Techniques}
+*/
+void qFatal(const char *msg, ...)
+{
+ QString buf;
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ if (msg)
+ buf.vsprintf(msg, ap);
+ va_end(ap);
+
+ qt_message_output(QtFatalMsg, buf.toLocal8Bit().constData());
+}
+
+// getenv is declared as deprecated in VS2005. This function
+// makes use of the new secure getenv function.
+QByteArray qgetenv(const char *varName)
+{
+#if defined(_MSC_VER) && _MSC_VER >= 1400
+ size_t requiredSize = 0;
+ QByteArray buffer;
+ getenv_s(&requiredSize, 0, 0, varName);
+ if (requiredSize == 0)
+ return buffer;
+ buffer.resize(int(requiredSize));
+ getenv_s(&requiredSize, buffer.data(), requiredSize, varName);
+ // requiredSize includes the terminating null, which we don't want.
+ Q_ASSERT(buffer.endsWith('\0'));
+ buffer.chop(1);
+ return buffer;
+#else
+ return QByteArray(::getenv(varName));
+#endif
+}
+
+bool qputenv(const char *varName, const QByteArray& value)
+{
+#if defined(_MSC_VER) && _MSC_VER >= 1400
+ return _putenv_s(varName, value.constData()) == 0;
+#else
+ QByteArray buffer(varName);
+ buffer += "=";
+ buffer += value;
+ return putenv(qstrdup(buffer.constData())) == 0;
+#endif
+}
+
+#if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD)
+
+# if defined(Q_OS_INTEGRITY) && defined(__GHS_VERSION_NUMBER) && (__GHS_VERSION_NUMBER < 500)
+// older versions of INTEGRITY used a long instead of a uint for the seed.
+typedef long SeedStorageType;
+# else
+typedef uint SeedStorageType;
+# endif
+
+typedef QThreadStorage<SeedStorageType *> SeedStorage;
+Q_GLOBAL_STATIC(SeedStorage, randTLS) // Thread Local Storage for seed value
+
+#endif
+
+/*!
+ \relates <QtGlobal>
+ \since 4.2
+
+ Thread-safe version of the standard C++ \c srand() function.
+
+ Sets the argument \a seed to be used to generate a new random number sequence of
+ pseudo random integers to be returned by qrand().
+
+ If no seed value is provided, qrand() is automatically seeded with a value of 1.
+
+ The sequence of random numbers generated is deterministic per thread. For example,
+ if two threads call qsrand(1) and subsequently calls qrand(), the threads will get
+ the same random number sequence.
+
+ \sa qrand()
+*/
+void qsrand(uint seed)
+{
+#if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD)
+ SeedStorageType *pseed = randTLS()->localData();
+ if (!pseed)
+ randTLS()->setLocalData(pseed = new SeedStorageType);
+ *pseed = seed;
+#else
+ // On Windows srand() and rand() already use Thread-Local-Storage
+ // to store the seed between calls
+ srand(seed);
+#endif
+}
+
+/*!
+ \relates <QtGlobal>
+ \since 4.2
+
+ Thread-safe version of the standard C++ \c rand() function.
+
+ Returns a value between 0 and \c RAND_MAX (defined in \c <cstdlib> and
+ \c <stdlib.h>), the next number in the current sequence of pseudo-random
+ integers.
+
+ Use \c qsrand() to initialize the pseudo-random number generator with
+ a seed value.
+
+ \sa qsrand()
+*/
+int qrand()
+{
+#if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD)
+ SeedStorageType *pseed = randTLS()->localData();
+ if (!pseed) {
+ randTLS()->setLocalData(pseed = new SeedStorageType);
+ *pseed = 1;
+ }
+ return rand_r(pseed);
+#else
+ // On Windows srand() and rand() already use Thread-Local-Storage
+ // to store the seed between calls
+ return rand();
+#endif
+}
+
+/*!
+ \macro forever
+ \relates <QtGlobal>
+
+ This macro is provided for convenience for writing infinite
+ loops.
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 31
+
+ It is equivalent to \c{for (;;)}.
+
+ If you're worried about namespace pollution, you can disable this
+ macro by adding the following line to your \c .pro file:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 32
+
+ \sa Q_FOREVER
+*/
+
+/*!
+ \macro Q_FOREVER
+ \relates <QtGlobal>
+
+ Same as \l{forever}.
+
+ This macro is available even when \c no_keywords is specified
+ using the \c .pro file's \c CONFIG variable.
+
+ \sa foreach()
+*/
+
+/*!
+ \macro foreach(variable, container)
+ \relates <QtGlobal>
+
+ This macro is used to implement Qt's \c foreach loop. The \a
+ variable parameter is a variable name or variable definition; the
+ \a container parameter is a Qt container whose value type
+ corresponds to the type of the variable. See \l{The foreach
+ Keyword} for details.
+
+ If you're worried about namespace pollution, you can disable this
+ macro by adding the following line to your \c .pro file:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 33
+
+ \sa Q_FOREACH()
+*/
+
+/*!
+ \macro Q_FOREACH(variable, container)
+ \relates <QtGlobal>
+
+ Same as foreach(\a variable, \a container).
+
+ This macro is available even when \c no_keywords is specified
+ using the \c .pro file's \c CONFIG variable.
+
+ \sa foreach()
+*/
+
+/*!
+ \macro QT_TR_NOOP(sourceText)
+ \relates <QtGlobal>
+
+ Marks the string literal \a sourceText for dynamic translation in
+ the current context (class), i.e the stored \a sourceText will not
+ be altered.
+
+ The macro expands to \a sourceText.
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 34
+
+ The macro QT_TR_NOOP_UTF8() is identical except that it tells lupdate
+ that the source string is encoded in UTF-8. Corresponding variants
+ exist in the QT_TRANSLATE_NOOP() family of macros, too. Note that
+ using these macros is not required if \c CODECFORTR is already set to
+ UTF-8 in the qmake project file.
+
+ \sa QT_TRANSLATE_NOOP(), {Internationalization with Qt}
+*/
+
+/*!
+ \macro QT_TRANSLATE_NOOP(context, sourceText)
+ \relates <QtGlobal>
+
+ Marks the string literal \a sourceText for dynamic translation in
+ the given \a context, i.e the stored \a sourceText will not be
+ altered. The \a context is typically a class and also needs to
+ be specified as string literal.
+
+ The macro expands to \a sourceText.
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 35
+
+ \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP3(), {Internationalization with Qt}
+*/
+
+/*!
+ \macro QT_TRANSLATE_NOOP3(context, sourceText, comment)
+ \relates <QtGlobal>
+ \since 4.4
+
+ Marks the string literal \a sourceText for dynamic translation in the
+ given \a context and with \a comment, i.e the stored \a sourceText will
+ not be altered. The \a context is typically a class and also needs to
+ be specified as string literal. The string literal \a comment
+ will be available for translators using e.g. Qt Linguist.
+
+ The macro expands to anonymous struct of the two string
+ literals passed as \a sourceText and \a comment.
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 36
+
+ \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP(), {Internationalization with Qt}
+*/
+
+/*!
+ \macro QT_POINTER_SIZE
+ \relates <QtGlobal>
+
+ Expands to the size of a pointer in bytes (4 or 8). This is
+ equivalent to \c sizeof(void *) but can be used in a preprocessor
+ directive.
+*/
+
+/*!
+ \macro TRUE
+ \relates <QtGlobal>
+ \obsolete
+
+ Synonym for \c true.
+
+ \sa FALSE
+*/
+
+/*!
+ \macro FALSE
+ \relates <QtGlobal>
+ \obsolete
+
+ Synonym for \c false.
+
+ \sa TRUE
+*/
+
+/*!
+ \macro QABS(n)
+ \relates <QtGlobal>
+ \obsolete
+
+ Use qAbs(\a n) instead.
+
+ \sa QMIN(), QMAX()
+*/
+
+/*!
+ \macro QMIN(x, y)
+ \relates <QtGlobal>
+ \obsolete
+
+ Use qMin(\a x, \a y) instead.
+
+ \sa QMAX(), QABS()
+*/
+
+/*!
+ \macro QMAX(x, y)
+ \relates <QtGlobal>
+ \obsolete
+
+ Use qMax(\a x, \a y) instead.
+
+ \sa QMIN(), QABS()
+*/
+
+/*!
+ \macro const char *qPrintable(const QString &str)
+ \relates <QtGlobal>
+
+ Returns \a str as a \c{const char *}. This is equivalent to
+ \a{str}.toLocal8Bit().constData().
+
+ The char pointer will be invalid after the statement in which
+ qPrintable() is used. This is because the array returned by
+ toLocal8Bit() will fall out of scope.
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 37
+
+
+ \sa qDebug(), qWarning(), qCritical(), qFatal()
+*/
+
+/*!
+ \macro Q_DECLARE_TYPEINFO(Type, Flags)
+ \relates <QtGlobal>
+
+ You can use this macro to specify information about a custom type
+ \a Type. With accurate type information, Qt's \l{generic
+ containers} can choose appropriate storage methods and algorithms.
+
+ \a Flags can be one of the following:
+
+ \list
+ \o \c Q_PRIMITIVE_TYPE specifies that \a Type is a POD (plain old
+ data) type with no constructor or destructor.
+ \o \c Q_MOVABLE_TYPE specifies that \a Type has a constructor
+ and/or a destructor but can be moved in memory using \c
+ memcpy().
+ \o \c Q_COMPLEX_TYPE (the default) specifies that \a Type has
+ constructors and/or a destructor and that it may not be moved
+ in memory.
+ \endlist
+
+ Example of a "primitive" type:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 38
+
+ Example of a movable type:
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 39
+*/
+
+/*!
+ \macro Q_UNUSED(name)
+ \relates <QtGlobal>
+
+ Indicates to the compiler that the parameter with the specified
+ \a name is not used in the body of a function. This can be used to
+ suppress compiler warnings while allowing functions to be defined
+ with meaningful parameter names in their signatures.
+*/
+
+#if defined(QT3_SUPPORT) && !defined(QT_NO_SETTINGS)
+QT_BEGIN_INCLUDE_NAMESPACE
+#include <qlibraryinfo.h>
+QT_END_INCLUDE_NAMESPACE
+
+static const char *qInstallLocation(QLibraryInfo::LibraryLocation loc)
+{
+ static QByteArray ret;
+ ret = QLibraryInfo::location(loc).toLatin1();
+ return ret.constData();
+}
+const char *qInstallPath()
+{
+ return qInstallLocation(QLibraryInfo::PrefixPath);
+}
+const char *qInstallPathDocs()
+{
+ return qInstallLocation(QLibraryInfo::DocumentationPath);
+}
+const char *qInstallPathHeaders()
+{
+ return qInstallLocation(QLibraryInfo::HeadersPath);
+}
+const char *qInstallPathLibs()
+{
+ return qInstallLocation(QLibraryInfo::LibrariesPath);
+}
+const char *qInstallPathBins()
+{
+ return qInstallLocation(QLibraryInfo::BinariesPath);
+}
+const char *qInstallPathPlugins()
+{
+ return qInstallLocation(QLibraryInfo::PluginsPath);
+}
+const char *qInstallPathData()
+{
+ return qInstallLocation(QLibraryInfo::DataPath);
+}
+const char *qInstallPathTranslations()
+{
+ return qInstallLocation(QLibraryInfo::TranslationsPath);
+}
+const char *qInstallPathSysconf()
+{
+ return qInstallLocation(QLibraryInfo::SettingsPath);
+}
+#endif
+
+struct QInternal_CallBackTable {
+ QVector<QList<qInternalCallback> > callbacks;
+};
+
+Q_GLOBAL_STATIC(QInternal_CallBackTable, global_callback_table)
+
+bool QInternal::registerCallback(Callback cb, qInternalCallback callback)
+{
+ if (cb >= 0 && cb < QInternal::LastCallback) {
+ QInternal_CallBackTable *cbt = global_callback_table();
+ cbt->callbacks.resize(cb + 1);
+ cbt->callbacks[cb].append(callback);
+ return true;
+ }
+ return false;
+}
+
+bool QInternal::unregisterCallback(Callback cb, qInternalCallback callback)
+{
+ if (cb >= 0 && cb < QInternal::LastCallback) {
+ QInternal_CallBackTable *cbt = global_callback_table();
+ return (bool) cbt->callbacks[cb].removeAll(callback);
+ }
+ return false;
+}
+
+bool QInternal::activateCallbacks(Callback cb, void **parameters)
+{
+ Q_ASSERT_X(cb >= 0, "QInternal::activateCallback()", "Callback id must be a valid id");
+
+ QInternal_CallBackTable *cbt = global_callback_table();
+ if (cbt && cb < cbt->callbacks.size()) {
+ QList<qInternalCallback> callbacks = cbt->callbacks[cb];
+ bool ret = false;
+ for (int i=0; i<callbacks.size(); ++i)
+ ret |= (callbacks.at(i))(parameters);
+ return ret;
+ }
+ return false;
+}
+
+extern void qt_set_current_thread_to_main_thread();
+
+bool QInternal::callFunction(InternalFunction func, void **args)
+{
+ Q_ASSERT_X(func >= 0,
+ "QInternal::callFunction()", "Callback id must be a valid id");
+#ifndef QT_NO_QOBJECT
+ switch (func) {
+#ifndef QT_NO_THREAD
+ case QInternal::CreateThreadForAdoption:
+ *args = QAdoptedThread::createThreadForAdoption();
+ return true;
+#endif
+ case QInternal::RefAdoptedThread:
+ QThreadData::get2((QThread *) *args)->ref();
+ return true;
+ case QInternal::DerefAdoptedThread:
+ QThreadData::get2((QThread *) *args)->deref();
+ return true;
+ case QInternal::SetCurrentThreadToMainThread:
+ qt_set_current_thread_to_main_thread();
+ return true;
+ case QInternal::SetQObjectSender: {
+ QObject *receiver = (QObject *) args[0];
+ QObjectPrivate::Sender *sender = new QObjectPrivate::Sender;
+ sender->sender = (QObject *) args[1];
+ sender->signal = *(int *) args[2];
+ sender->ref = 1;
+
+ // Store the old sender as "return value"
+ args[3] = QObjectPrivate::setCurrentSender(receiver, sender);
+ args[4] = sender;
+ return true;
+ }
+ case QInternal::GetQObjectSender: {
+ QObject *receiver = (QObject *) args[0];
+ QObjectPrivate *d = QObjectPrivate::get(receiver);
+ args[1] = d->currentSender ? d->currentSender->sender : 0;
+ return true;
+ }
+ case QInternal::ResetQObjectSender: {
+ QObject *receiver = (QObject *) args[0];
+ QObjectPrivate::Sender *oldSender = (QObjectPrivate::Sender *) args[1];
+ QObjectPrivate::Sender *sender = (QObjectPrivate::Sender *) args[2];
+ QObjectPrivate::resetCurrentSender(receiver, sender, oldSender);
+ delete sender;
+ return true;
+ }
+
+ default:
+ break;
+ }
+#else
+ Q_UNUSED(args);
+ Q_UNUSED(func);
+#endif
+
+ return false;
+}
+
+/*!
+ \macro Q_BYTE_ORDER
+ \relates <QtGlobal>
+
+ This macro can be used to determine the byte order your system
+ uses for storing data in memory. i.e., whether your system is
+ little-endian or big-endian. It is set by Qt to one of the macros
+ Q_LITTLE_ENDIAN or Q_BIG_ENDIAN. You normally won't need to worry
+ about endian-ness, but you might, for example if you need to know
+ which byte of an integer or UTF-16 character is stored in the
+ lowest address. Endian-ness is important in networking, where
+ computers with different values for Q_BYTE_ORDER must pass data
+ back and forth.
+
+ Use this macro as in the following examples.
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 40
+
+ \sa Q_BIG_ENDIAN, Q_LITTLE_ENDIAN
+*/
+
+/*!
+ \macro Q_LITTLE_ENDIAN
+ \relates <QtGlobal>
+
+ This macro represents a value you can compare to the macro
+ Q_BYTE_ORDER to determine the endian-ness of your system. In a
+ little-endian system, the least significant byte is stored at the
+ lowest address. The other bytes follow in increasing order of
+ significance.
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 41
+
+ \sa Q_BYTE_ORDER, Q_BIG_ENDIAN
+*/
+
+/*!
+ \macro Q_BIG_ENDIAN
+ \relates <QtGlobal>
+
+ This macro represents a value you can compare to the macro
+ Q_BYTE_ORDER to determine the endian-ness of your system. In a
+ big-endian system, the most significant byte is stored at the
+ lowest address. The other bytes follow in decreasing order of
+ significance.
+
+ \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 42
+
+ \sa Q_BYTE_ORDER, Q_LITTLE_ENDIAN
+*/
+
+/*!
+ \macro Q_GLOBAL_STATIC(type, name)
+ \internal
+
+ Declares a global static variable with the given \a type and \a name.
+
+ Use this macro to instantiate an object in a thread-safe way, creating
+ a global pointer that can be used to refer to it.
+
+ \warning This macro is subject to a race condition that can cause the object
+ to be constructed twice. However, if this occurs, the second instance will
+ be immediately deleted.
+
+ See also
+ \l{http://www.aristeia.com/publications.html}{"C++ and the perils of Double-Checked Locking"}
+ by Scott Meyers and Andrei Alexandrescu.
+*/
+
+/*!
+ \macro Q_GLOBAL_STATIC_WITH_ARGS(type, name, arguments)
+ \internal
+
+ Declares a global static variable with the specified \a type and \a name.
+
+ Use this macro to instantiate an object using the \a arguments specified
+ in a thread-safe way, creating a global pointer that can be used to refer
+ to it.
+
+ \warning This macro is subject to a race condition that can cause the object
+ to be constructed twice. However, if this occurs, the second instance will
+ be immediately deleted.
+
+ See also
+ \l{http://www.aristeia.com/publications.html}{"C++ and the perils of Double-Checked Locking"}
+ by Scott Meyers and Andrei Alexandrescu.
+*/
+
+/*!
+ \macro QT_NAMESPACE
+ \internal
+
+ If this macro is defined to \c ns all Qt classes are put in a namespace
+ called \c ns. Also, moc will output code putting metaobjects etc.
+ into namespace \c ns.
+
+ \sa QT_BEGIN_NAMESPACE, QT_END_NAMESPACE,
+ QT_PREPEND_NAMESPACE, QT_USE_NAMESPACE,
+ QT_BEGIN_INCLUDE_NAMESPACE, QT_END_INCLUDE_NAMESPACE,
+ QT_BEGIN_MOC_NAMESPACE, QT_END_MOC_NAMESPACE,
+*/
+
+/*!
+ \macro QT_PREPEND_NAMESPACE(identifier)
+ \internal
+
+ This macro qualifies \a identifier with the full namespace.
+ It expands to \c{::QT_NAMESPACE::identifier} if \c QT_NAMESPACE is defined
+ and only \a identifier otherwise.
+
+ \sa QT_NAMESPACE
+*/
+
+/*!
+ \macro QT_USE_NAMESPACE
+ \internal
+
+ This macro expands to using QT_NAMESPACE if QT_NAMESPACE is defined
+ and nothing otherwise.
+
+ \sa QT_NAMESPACE
+*/
+
+/*!
+ \macro QT_BEGIN_NAMESPACE
+ \internal
+
+ This macro expands to
+
+ \snippet snippets/code/src_corelib_global_qglobal.cpp begin namespace macro
+
+ if \c QT_NAMESPACE is defined and nothing otherwise. If should always
+ appear in the file-level scope and be followed by \c QT_END_NAMESPACE
+ at the same logical level with respect to preprocessor conditionals
+ in the same file.
+
+ As a rule of thumb, \c QT_BEGIN_NAMESPACE should appear in all Qt header
+ and Qt source files after the last \c{#include} line and before the first
+ declaration. In Qt headers using \c QT_BEGIN_HEADER, \c QT_BEGIN_NAMESPACE
+ follows \c QT_BEGIN_HEADER immediately.
+
+ If that rule can't be followed because, e.g., \c{#include} lines and
+ declarations are wildly mixed, place \c QT_BEGIN_NAMESPACE before
+ the first declaration and wrap the \c{#include} lines in
+ \c QT_BEGIN_INCLUDE_NAMESPACE and \c QT_END_INCLUDE_NAMESPACE.
+
+ When using the \c QT_NAMESPACE feature in user code
+ (e.g., when building plugins statically linked to Qt) where
+ the user code is not intended to go into the \c QT_NAMESPACE
+ namespace, all forward declarations of Qt classes need to
+ be wrapped in \c QT_BEGIN_NAMESPACE and \c QT_END_NAMESPACE.
+ After that, a \c QT_USE_NAMESPACE should follow.
+ No further changes should be needed.
+
+ \sa QT_NAMESPACE
+*/
+
+/*!
+ \macro QT_END_NAMESPACE
+ \internal
+
+ This macro expands to
+
+ \snippet snippets/code/src_corelib_global_qglobal.cpp end namespace macro
+
+ if \c QT_NAMESPACE is defined and nothing otherwise. It is used to cancel
+ the effect of \c QT_BEGIN_NAMESPACE.
+
+ If a source file ends with a \c{#include} directive that includes a moc file,
+ \c QT_END_NAMESPACE should be placed before that \c{#include}.
+
+ \sa QT_NAMESPACE
+*/
+
+/*!
+ \macro QT_BEGIN_INCLUDE_NAMESPACE
+ \internal
+
+ This macro is equivalent to \c QT_END_NAMESPACE.
+ It only serves as syntactic sugar and is intended
+ to be used before #include lines within a
+ \c QT_BEGIN_NAMESPACE ... \c QT_END_NAMESPACE block.
+
+ \sa QT_NAMESPACE
+*/
+
+/*!
+ \macro QT_END_INCLUDE_NAMESPACE
+ \internal
+
+ This macro is equivalent to \c QT_BEGIN_NAMESPACE.
+ It only serves as syntactic sugar and is intended
+ to be used after #include lines within a
+ \c QT_BEGIN_NAMESPACE ... \c QT_END_NAMESPACE block.
+
+ \sa QT_NAMESPACE
+*/
+
+/*!
+ \macro QT_BEGIN_MOC_NAMESPACE
+ \internal
+
+ This macro is output by moc at the beginning of
+ moc files. It is equivalent to \c QT_USE_NAMESPACE.
+
+ \sa QT_NAMESPACE
+*/
+
+/*!
+ \macro QT_END_MOC_NAMESPACE
+ \internal
+
+ This macro is output by moc at the beginning of
+ moc files. It expands to nothing.
+
+ \sa QT_NAMESPACE
+*/
+
+/*!
+ \fn bool qFuzzyCompare(double p1, double p2)
+ \relates <QtGlobal>
+ \since 4.4
+ \threadsafe
+
+ Compares the floating point value \a p1 and \a p2 and
+ returns \c true if they are considered equal, otherwise \c false.
+
+ The two numbers are compared in a relative way, where the
+ exactness is stronger the smaller the numbers are.
+ */
+
+/*!
+ \fn bool qFuzzyCompare(float p1, float p2)
+ \relates <QtGlobal>
+ \since 4.4
+ \threadsafe
+ \overload
+ */
+
+/*!
+ \macro QT_REQUIRE_VERSION(int argc, char **argv, const char *version)
+ \relates <QtGlobal>
+
+ This macro can be used to ensure that the application is run
+ against a recent enough version of Qt. This is especially useful
+ if your application depends on a specific bug fix introduced in a
+ bug-fix release (e.g., 4.0.2).
+
+ The \a argc and \a argv parameters are the \c main() function's
+ \c argc and \c argv parameters. The \a version parameter is a
+ string literal that specifies which version of Qt the application
+ requires (e.g., "4.0.2").
+
+ Example:
+
+ \snippet doc/src/snippets/code/src_gui_dialogs_qmessagebox.cpp 4
+*/
+
+QT_END_NAMESPACE