Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/global/qglobal.cpp |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /**************************************************************************** | - | ||||||||||||
2 | ** | - | ||||||||||||
3 | ** Copyright (C) 2016 The Qt Company Ltd. | - | ||||||||||||
4 | ** Copyright (C) 2016 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 "qthreadstorage.h" | - | ||||||||||||
46 | #include "qdir.h" | - | ||||||||||||
47 | #include "qdatetime.h" | - | ||||||||||||
48 | #include <private/qlocale_tools_p.h> | - | ||||||||||||
49 | - | |||||||||||||
50 | #include <private/qsystemlibrary_p.h> | - | ||||||||||||
51 | #include <qmutex.h> | - | ||||||||||||
52 | - | |||||||||||||
53 | #ifndef QT_NO_QOBJECT | - | ||||||||||||
54 | #include <private/qthread_p.h> | - | ||||||||||||
55 | #endif | - | ||||||||||||
56 | - | |||||||||||||
57 | #include <stdlib.h> | - | ||||||||||||
58 | #include <limits.h> | - | ||||||||||||
59 | #include <stdarg.h> | - | ||||||||||||
60 | #include <string.h> | - | ||||||||||||
61 | - | |||||||||||||
62 | #ifndef QT_NO_EXCEPTIONS | - | ||||||||||||
63 | # include <string> | - | ||||||||||||
64 | # include <exception> | - | ||||||||||||
65 | #endif | - | ||||||||||||
66 | - | |||||||||||||
67 | #if !defined(Q_OS_WINCE) | - | ||||||||||||
68 | # include <errno.h> | - | ||||||||||||
69 | # if defined(Q_CC_MSVC) | - | ||||||||||||
70 | # include <crtdbg.h> | - | ||||||||||||
71 | # endif | - | ||||||||||||
72 | #endif | - | ||||||||||||
73 | - | |||||||||||||
74 | #ifdef Q_OS_WINRT | - | ||||||||||||
75 | #include <Ws2tcpip.h> | - | ||||||||||||
76 | #endif // Q_OS_WINRT | - | ||||||||||||
77 | - | |||||||||||||
78 | #if defined(Q_OS_VXWORKS) && defined(_WRS_KERNEL) | - | ||||||||||||
79 | # include <envLib.h> | - | ||||||||||||
80 | #endif | - | ||||||||||||
81 | - | |||||||||||||
82 | #if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK) | - | ||||||||||||
83 | #include <private/qjni_p.h> | - | ||||||||||||
#endif | ||||||||||||||
#if defined(Q_OS_BLACKBERRY) | ||||||||||||||
# include <bps/deviceinfo.h> | ||||||||||||||
84 | #endif | - | ||||||||||||
85 | - | |||||||||||||
86 | #if defined(Q_OS_SOLARIS) | - | ||||||||||||
87 | # include <sys/systeminfo.h> | - | ||||||||||||
88 | #endif | - | ||||||||||||
89 | - | |||||||||||||
90 | #ifdef Q_OS_UNIX | - | ||||||||||||
91 | #include <sys/utsname.h> | - | ||||||||||||
92 | #include <private/qcore_unix_p.h> | - | ||||||||||||
93 | #endif | - | ||||||||||||
94 | - | |||||||||||||
95 | #ifdef Q_OS_BSD4 | - | ||||||||||||
96 | #include <sys/sysctl.h> | - | ||||||||||||
97 | #endif | - | ||||||||||||
98 | - | |||||||||||||
99 | #include "archdetect.cpp" | - | ||||||||||||
100 | - | |||||||||||||
101 | QT_BEGIN_NAMESPACE | - | ||||||||||||
102 | - | |||||||||||||
103 | #if !QT_DEPRECATED_SINCE(5, 0) | - | ||||||||||||
104 | // Make sure they're defined to be exported | - | ||||||||||||
105 | Q_CORE_EXPORT void *qMemCopy(void *dest, const void *src, size_t n); | - | ||||||||||||
106 | Q_CORE_EXPORT void *qMemSet(void *dest, int c, size_t n); | - | ||||||||||||
107 | #endif | - | ||||||||||||
108 | - | |||||||||||||
109 | // Statically check assumptions about the environment we're running | - | ||||||||||||
110 | // in. The idea here is to error or warn if otherwise implicit Qt | - | ||||||||||||
111 | // assumptions are not fulfilled on new hardware or compilers | - | ||||||||||||
112 | // (if this list becomes too long, consider factoring into a separate file) | - | ||||||||||||
113 | Q_STATIC_ASSERT_X(sizeof(int) == 4, "Qt assumes that int is 32 bits"); | - | ||||||||||||
114 | Q_STATIC_ASSERT_X(UCHAR_MAX == 255, "Qt assumes that char is 8 bits"); | - | ||||||||||||
115 | Q_STATIC_ASSERT_X(QT_POINTER_SIZE == sizeof(void *), "QT_POINTER_SIZE defined incorrectly"); | - | ||||||||||||
116 | - | |||||||||||||
117 | /*! | - | ||||||||||||
118 | \class QFlag | - | ||||||||||||
119 | \inmodule QtCore | - | ||||||||||||
120 | \brief The QFlag class is a helper data type for QFlags. | - | ||||||||||||
121 | - | |||||||||||||
122 | It is equivalent to a plain \c int, except with respect to | - | ||||||||||||
123 | function overloading and type conversions. You should never need | - | ||||||||||||
124 | to use this class in your applications. | - | ||||||||||||
125 | - | |||||||||||||
126 | \sa QFlags | - | ||||||||||||
127 | */ | - | ||||||||||||
128 | - | |||||||||||||
129 | /*! | - | ||||||||||||
130 | \fn QFlag::QFlag(int value) | - | ||||||||||||
131 | - | |||||||||||||
132 | Constructs a QFlag object that stores the given \a value. | - | ||||||||||||
133 | */ | - | ||||||||||||
134 | - | |||||||||||||
135 | /*! | - | ||||||||||||
136 | \fn QFlag::QFlag(uint value) | - | ||||||||||||
137 | \since Qt 5.3 | - | ||||||||||||
138 | - | |||||||||||||
139 | Constructs a QFlag object that stores the given \a value. | - | ||||||||||||
140 | */ | - | ||||||||||||
141 | - | |||||||||||||
142 | /*! | - | ||||||||||||
143 | \fn QFlag::QFlag(short value) | - | ||||||||||||
144 | \since 5.3 | - | ||||||||||||
145 | - | |||||||||||||
146 | Constructs a QFlag object that stores the given \a value. | - | ||||||||||||
147 | */ | - | ||||||||||||
148 | - | |||||||||||||
149 | /*! | - | ||||||||||||
150 | \fn QFlag::QFlag(ushort value) | - | ||||||||||||
151 | \since Qt 5.3 | - | ||||||||||||
152 | - | |||||||||||||
153 | Constructs a QFlag object that stores the given \a value. | - | ||||||||||||
154 | */ | - | ||||||||||||
155 | - | |||||||||||||
156 | /*! | - | ||||||||||||
157 | \fn QFlag::operator int() const | - | ||||||||||||
158 | - | |||||||||||||
159 | Returns the value stored by the QFlag object. | - | ||||||||||||
160 | */ | - | ||||||||||||
161 | - | |||||||||||||
162 | /*! | - | ||||||||||||
163 | \fn QFlag::operator uint() const | - | ||||||||||||
164 | \since Qt 5.3 | - | ||||||||||||
165 | - | |||||||||||||
166 | Returns the value stored by the QFlag object. | - | ||||||||||||
167 | */ | - | ||||||||||||
168 | - | |||||||||||||
169 | /*! | - | ||||||||||||
170 | \class QFlags | - | ||||||||||||
171 | \inmodule QtCore | - | ||||||||||||
172 | \brief The QFlags class provides a type-safe way of storing | - | ||||||||||||
173 | OR-combinations of enum values. | - | ||||||||||||
174 | - | |||||||||||||
175 | - | |||||||||||||
176 | \ingroup tools | - | ||||||||||||
177 | - | |||||||||||||
178 | The QFlags<Enum> class is a template class, where Enum is an enum | - | ||||||||||||
179 | type. QFlags is used throughout Qt for storing combinations of | - | ||||||||||||
180 | enum values. | - | ||||||||||||
181 | - | |||||||||||||
182 | The traditional C++ approach for storing OR-combinations of enum | - | ||||||||||||
183 | values is to use an \c int or \c uint variable. The inconvenience | - | ||||||||||||
184 | with this approach is that there's no type checking at all; any | - | ||||||||||||
185 | enum value can be OR'd with any other enum value and passed on to | - | ||||||||||||
186 | a function that takes an \c int or \c uint. | - | ||||||||||||
187 | - | |||||||||||||
188 | Qt uses QFlags to provide type safety. For example, the | - | ||||||||||||
189 | Qt::Alignment type is simply a typedef for | - | ||||||||||||
190 | QFlags<Qt::AlignmentFlag>. QLabel::setAlignment() takes a | - | ||||||||||||
191 | Qt::Alignment parameter, which means that any combination of | - | ||||||||||||
192 | Qt::AlignmentFlag values, or 0, is legal: | - | ||||||||||||
193 | - | |||||||||||||
194 | \snippet code/src_corelib_global_qglobal.cpp 0 | - | ||||||||||||
195 | - | |||||||||||||
196 | If you try to pass a value from another enum or just a plain | - | ||||||||||||
197 | integer other than 0, the compiler will report an error. If you | - | ||||||||||||
198 | need to cast integer values to flags in a untyped fashion, you can | - | ||||||||||||
199 | use the explicit QFlags constructor as cast operator. | - | ||||||||||||
200 | - | |||||||||||||
201 | If you want to use QFlags for your own enum types, use | - | ||||||||||||
202 | the Q_DECLARE_FLAGS() and Q_DECLARE_OPERATORS_FOR_FLAGS(). | - | ||||||||||||
203 | - | |||||||||||||
204 | Example: | - | ||||||||||||
205 | - | |||||||||||||
206 | \snippet code/src_corelib_global_qglobal.cpp 1 | - | ||||||||||||
207 | - | |||||||||||||
208 | You can then use the \c MyClass::Options type to store | - | ||||||||||||
209 | combinations of \c MyClass::Option values. | - | ||||||||||||
210 | - | |||||||||||||
211 | \section1 Flags and the Meta-Object System | - | ||||||||||||
212 | - | |||||||||||||
213 | The Q_DECLARE_FLAGS() macro does not expose the flags to the meta-object | - | ||||||||||||
214 | system, so they cannot be used by Qt Script or edited in Qt Designer. | - | ||||||||||||
215 | To make the flags available for these purposes, the Q_FLAG() macro must | - | ||||||||||||
216 | be used: | - | ||||||||||||
217 | - | |||||||||||||
218 | \snippet code/src_corelib_global_qglobal.cpp meta-object flags | - | ||||||||||||
219 | - | |||||||||||||
220 | \section1 Naming Convention | - | ||||||||||||
221 | - | |||||||||||||
222 | A sensible naming convention for enum types and associated QFlags | - | ||||||||||||
223 | types is to give a singular name to the enum type (e.g., \c | - | ||||||||||||
224 | Option) and a plural name to the QFlags type (e.g., \c Options). | - | ||||||||||||
225 | When a singular name is desired for the QFlags type (e.g., \c | - | ||||||||||||
226 | Alignment), you can use \c Flag as the suffix for the enum type | - | ||||||||||||
227 | (e.g., \c AlignmentFlag). | - | ||||||||||||
228 | - | |||||||||||||
229 | \sa QFlag | - | ||||||||||||
230 | */ | - | ||||||||||||
231 | - | |||||||||||||
232 | /*! | - | ||||||||||||
233 | \typedef QFlags::Int | - | ||||||||||||
234 | \since 5.0 | - | ||||||||||||
235 | - | |||||||||||||
236 | Typedef for the integer type used for storage as well as for | - | ||||||||||||
237 | implicit conversion. Either \c int or \c{unsigned int}, depending | - | ||||||||||||
238 | on whether the enum's underlying type is signed or unsigned. | - | ||||||||||||
239 | */ | - | ||||||||||||
240 | - | |||||||||||||
241 | /*! | - | ||||||||||||
242 | \typedef QFlags::enum_type | - | ||||||||||||
243 | - | |||||||||||||
244 | Typedef for the Enum template type. | - | ||||||||||||
245 | */ | - | ||||||||||||
246 | - | |||||||||||||
247 | /*! | - | ||||||||||||
248 | \fn QFlags::QFlags(const QFlags &other) | - | ||||||||||||
249 | - | |||||||||||||
250 | Constructs a copy of \a other. | - | ||||||||||||
251 | */ | - | ||||||||||||
252 | - | |||||||||||||
253 | /*! | - | ||||||||||||
254 | \fn QFlags::QFlags(Enum flag) | - | ||||||||||||
255 | - | |||||||||||||
256 | Constructs a QFlags object storing the given \a flag. | - | ||||||||||||
257 | */ | - | ||||||||||||
258 | - | |||||||||||||
259 | /*! | - | ||||||||||||
260 | \fn QFlags::QFlags(Zero zero) | - | ||||||||||||
261 | - | |||||||||||||
262 | Constructs a QFlags object with no flags set. \a zero must be a | - | ||||||||||||
263 | literal 0 value. | - | ||||||||||||
264 | */ | - | ||||||||||||
265 | - | |||||||||||||
266 | /*! | - | ||||||||||||
267 | \fn QFlags::QFlags(QFlag value) | - | ||||||||||||
268 | - | |||||||||||||
269 | Constructs a QFlags object initialized with the given integer \a | - | ||||||||||||
270 | value. | - | ||||||||||||
271 | - | |||||||||||||
272 | The QFlag type is a helper type. By using it here instead of \c | - | ||||||||||||
273 | int, we effectively ensure that arbitrary enum values cannot be | - | ||||||||||||
274 | cast to a QFlags, whereas untyped enum values (i.e., \c int | - | ||||||||||||
275 | values) can. | - | ||||||||||||
276 | */ | - | ||||||||||||
277 | - | |||||||||||||
278 | /*! | - | ||||||||||||
279 | \fn QFlags::QFlags(std::initializer_list<Enum> flags) | - | ||||||||||||
280 | \since 5.4 | - | ||||||||||||
281 | - | |||||||||||||
282 | Constructs a QFlags object initialized with all \a flags | - | ||||||||||||
283 | combined using the bitwise OR operator. | - | ||||||||||||
284 | - | |||||||||||||
285 | \sa operator|=(), operator|() | - | ||||||||||||
286 | */ | - | ||||||||||||
287 | - | |||||||||||||
288 | /*! | - | ||||||||||||
289 | \fn QFlags &QFlags::operator=(const QFlags &other) | - | ||||||||||||
290 | - | |||||||||||||
291 | Assigns \a other to this object and returns a reference to this | - | ||||||||||||
292 | object. | - | ||||||||||||
293 | */ | - | ||||||||||||
294 | - | |||||||||||||
295 | /*! | - | ||||||||||||
296 | \fn QFlags &QFlags::operator&=(int mask) | - | ||||||||||||
297 | - | |||||||||||||
298 | Performs a bitwise AND operation with \a mask and stores the | - | ||||||||||||
299 | result in this QFlags object. Returns a reference to this object. | - | ||||||||||||
300 | - | |||||||||||||
301 | \sa operator&(), operator|=(), operator^=() | - | ||||||||||||
302 | */ | - | ||||||||||||
303 | - | |||||||||||||
304 | /*! | - | ||||||||||||
305 | \fn QFlags &QFlags::operator&=(uint mask) | - | ||||||||||||
306 | - | |||||||||||||
307 | \overload | - | ||||||||||||
308 | */ | - | ||||||||||||
309 | - | |||||||||||||
310 | /*! | - | ||||||||||||
311 | \fn QFlags &QFlags::operator&=(Enum mask) | - | ||||||||||||
312 | - | |||||||||||||
313 | \overload | - | ||||||||||||
314 | */ | - | ||||||||||||
315 | - | |||||||||||||
316 | /*! | - | ||||||||||||
317 | \fn QFlags &QFlags::operator|=(QFlags other) | - | ||||||||||||
318 | - | |||||||||||||
319 | Performs a bitwise OR operation with \a other and stores the | - | ||||||||||||
320 | result in this QFlags object. Returns a reference to this object. | - | ||||||||||||
321 | - | |||||||||||||
322 | \sa operator|(), operator&=(), operator^=() | - | ||||||||||||
323 | */ | - | ||||||||||||
324 | - | |||||||||||||
325 | /*! | - | ||||||||||||
326 | \fn QFlags &QFlags::operator|=(Enum other) | - | ||||||||||||
327 | - | |||||||||||||
328 | \overload | - | ||||||||||||
329 | */ | - | ||||||||||||
330 | - | |||||||||||||
331 | /*! | - | ||||||||||||
332 | \fn QFlags &QFlags::operator^=(QFlags other) | - | ||||||||||||
333 | - | |||||||||||||
334 | Performs a bitwise XOR operation with \a other and stores the | - | ||||||||||||
335 | result in this QFlags object. Returns a reference to this object. | - | ||||||||||||
336 | - | |||||||||||||
337 | \sa operator^(), operator&=(), operator|=() | - | ||||||||||||
338 | */ | - | ||||||||||||
339 | - | |||||||||||||
340 | /*! | - | ||||||||||||
341 | \fn QFlags &QFlags::operator^=(Enum other) | - | ||||||||||||
342 | - | |||||||||||||
343 | \overload | - | ||||||||||||
344 | */ | - | ||||||||||||
345 | - | |||||||||||||
346 | /*! | - | ||||||||||||
347 | \fn QFlags::operator Int() const | - | ||||||||||||
348 | - | |||||||||||||
349 | Returns the value stored in the QFlags object as an integer. | - | ||||||||||||
350 | - | |||||||||||||
351 | \sa Int | - | ||||||||||||
352 | */ | - | ||||||||||||
353 | - | |||||||||||||
354 | /*! | - | ||||||||||||
355 | \fn QFlags QFlags::operator|(QFlags other) const | - | ||||||||||||
356 | - | |||||||||||||
357 | Returns a QFlags object containing the result of the bitwise OR | - | ||||||||||||
358 | operation on this object and \a other. | - | ||||||||||||
359 | - | |||||||||||||
360 | \sa operator|=(), operator^(), operator&(), operator~() | - | ||||||||||||
361 | */ | - | ||||||||||||
362 | - | |||||||||||||
363 | /*! | - | ||||||||||||
364 | \fn QFlags QFlags::operator|(Enum other) const | - | ||||||||||||
365 | - | |||||||||||||
366 | \overload | - | ||||||||||||
367 | */ | - | ||||||||||||
368 | - | |||||||||||||
369 | /*! | - | ||||||||||||
370 | \fn QFlags QFlags::operator^(QFlags other) const | - | ||||||||||||
371 | - | |||||||||||||
372 | Returns a QFlags object containing the result of the bitwise XOR | - | ||||||||||||
373 | operation on this object and \a other. | - | ||||||||||||
374 | - | |||||||||||||
375 | \sa operator^=(), operator&(), operator|(), operator~() | - | ||||||||||||
376 | */ | - | ||||||||||||
377 | - | |||||||||||||
378 | /*! | - | ||||||||||||
379 | \fn QFlags QFlags::operator^(Enum other) const | - | ||||||||||||
380 | - | |||||||||||||
381 | \overload | - | ||||||||||||
382 | */ | - | ||||||||||||
383 | - | |||||||||||||
384 | /*! | - | ||||||||||||
385 | \fn QFlags QFlags::operator&(int mask) const | - | ||||||||||||
386 | - | |||||||||||||
387 | Returns a QFlags object containing the result of the bitwise AND | - | ||||||||||||
388 | operation on this object and \a mask. | - | ||||||||||||
389 | - | |||||||||||||
390 | \sa operator&=(), operator|(), operator^(), operator~() | - | ||||||||||||
391 | */ | - | ||||||||||||
392 | - | |||||||||||||
393 | /*! | - | ||||||||||||
394 | \fn QFlags QFlags::operator&(uint mask) const | - | ||||||||||||
395 | - | |||||||||||||
396 | \overload | - | ||||||||||||
397 | */ | - | ||||||||||||
398 | - | |||||||||||||
399 | /*! | - | ||||||||||||
400 | \fn QFlags QFlags::operator&(Enum mask) const | - | ||||||||||||
401 | - | |||||||||||||
402 | \overload | - | ||||||||||||
403 | */ | - | ||||||||||||
404 | - | |||||||||||||
405 | /*! | - | ||||||||||||
406 | \fn QFlags QFlags::operator~() const | - | ||||||||||||
407 | - | |||||||||||||
408 | Returns a QFlags object that contains the bitwise negation of | - | ||||||||||||
409 | this object. | - | ||||||||||||
410 | - | |||||||||||||
411 | \sa operator&(), operator|(), operator^() | - | ||||||||||||
412 | */ | - | ||||||||||||
413 | - | |||||||||||||
414 | /*! | - | ||||||||||||
415 | \fn bool QFlags::operator!() const | - | ||||||||||||
416 | - | |||||||||||||
417 | Returns \c true if no flag is set (i.e., if the value stored by the | - | ||||||||||||
418 | QFlags object is 0); otherwise returns \c false. | - | ||||||||||||
419 | */ | - | ||||||||||||
420 | - | |||||||||||||
421 | /*! | - | ||||||||||||
422 | \fn bool QFlags::testFlag(Enum flag) const | - | ||||||||||||
423 | \since 4.2 | - | ||||||||||||
424 | - | |||||||||||||
425 | Returns \c true if the \a flag is set, otherwise \c false. | - | ||||||||||||
426 | */ | - | ||||||||||||
427 | - | |||||||||||||
428 | /*! | - | ||||||||||||
429 | \fn QFlags QFlags::setFlag(Enum flag, bool on) | - | ||||||||||||
430 | \since 5.7 | - | ||||||||||||
431 | - | |||||||||||||
432 | Sets the indicated \a flag if \a on is \c true or unsets it if | - | ||||||||||||
433 | \a on is \c false. Returns a reference to this object. | - | ||||||||||||
434 | */ | - | ||||||||||||
435 | - | |||||||||||||
436 | /*! | - | ||||||||||||
437 | \macro Q_DISABLE_COPY(Class) | - | ||||||||||||
438 | \relates QObject | - | ||||||||||||
439 | - | |||||||||||||
440 | Disables the use of copy constructors and assignment operators | - | ||||||||||||
441 | for the given \a Class. | - | ||||||||||||
442 | - | |||||||||||||
443 | Instances of subclasses of QObject should not be thought of as | - | ||||||||||||
444 | values that can be copied or assigned, but as unique identities. | - | ||||||||||||
445 | This means that when you create your own subclass of QObject | - | ||||||||||||
446 | (director or indirect), you should \e not give it a copy constructor | - | ||||||||||||
447 | or an assignment operator. However, it may not enough to simply | - | ||||||||||||
448 | omit them from your class, because, if you mistakenly write some code | - | ||||||||||||
449 | that requires a copy constructor or an assignment operator (it's easy | - | ||||||||||||
450 | to do), your compiler will thoughtfully create it for you. You must | - | ||||||||||||
451 | do more. | - | ||||||||||||
452 | - | |||||||||||||
453 | The curious user will have seen that the Qt classes derived | - | ||||||||||||
454 | from QObject typically include this macro in a private section: | - | ||||||||||||
455 | - | |||||||||||||
456 | \snippet code/src_corelib_global_qglobal.cpp 43 | - | ||||||||||||
457 | - | |||||||||||||
458 | It declares a copy constructor and an assignment operator in the | - | ||||||||||||
459 | private section, so that if you use them by mistake, the compiler | - | ||||||||||||
460 | will report an error. | - | ||||||||||||
461 | - | |||||||||||||
462 | \snippet code/src_corelib_global_qglobal.cpp 44 | - | ||||||||||||
463 | - | |||||||||||||
464 | But even this might not catch absolutely every case. You might be | - | ||||||||||||
465 | tempted to do something like this: | - | ||||||||||||
466 | - | |||||||||||||
467 | \snippet code/src_corelib_global_qglobal.cpp 45 | - | ||||||||||||
468 | - | |||||||||||||
469 | First of all, don't do that. Most compilers will generate code that | - | ||||||||||||
470 | uses the copy constructor, so the privacy violation error will be | - | ||||||||||||
471 | reported, but your C++ compiler is not required to generate code for | - | ||||||||||||
472 | this statement in a specific way. It could generate code using | - | ||||||||||||
473 | \e{neither} the copy constructor \e{nor} the assignment operator we | - | ||||||||||||
474 | made private. In that case, no error would be reported, but your | - | ||||||||||||
475 | application would probably crash when you called a member function | - | ||||||||||||
476 | of \c{w}. | - | ||||||||||||
477 | */ | - | ||||||||||||
478 | - | |||||||||||||
479 | /*! | - | ||||||||||||
480 | \macro Q_DECLARE_FLAGS(Flags, Enum) | - | ||||||||||||
481 | \relates QFlags | - | ||||||||||||
482 | - | |||||||||||||
483 | The Q_DECLARE_FLAGS() macro expands to | - | ||||||||||||
484 | - | |||||||||||||
485 | \snippet code/src_corelib_global_qglobal.cpp 2 | - | ||||||||||||
486 | - | |||||||||||||
487 | \a Enum is the name of an existing enum type, whereas \a Flags is | - | ||||||||||||
488 | the name of the QFlags<\e{Enum}> typedef. | - | ||||||||||||
489 | - | |||||||||||||
490 | See the QFlags documentation for details. | - | ||||||||||||
491 | - | |||||||||||||
492 | \sa Q_DECLARE_OPERATORS_FOR_FLAGS() | - | ||||||||||||
493 | */ | - | ||||||||||||
494 | - | |||||||||||||
495 | /*! | - | ||||||||||||
496 | \macro Q_DECLARE_OPERATORS_FOR_FLAGS(Flags) | - | ||||||||||||
497 | \relates QFlags | - | ||||||||||||
498 | - | |||||||||||||
499 | The Q_DECLARE_OPERATORS_FOR_FLAGS() macro declares global \c | - | ||||||||||||
500 | operator|() functions for \a Flags, which is of type QFlags<T>. | - | ||||||||||||
501 | - | |||||||||||||
502 | See the QFlags documentation for details. | - | ||||||||||||
503 | - | |||||||||||||
504 | \sa Q_DECLARE_FLAGS() | - | ||||||||||||
505 | */ | - | ||||||||||||
506 | - | |||||||||||||
507 | /*! | - | ||||||||||||
508 | \headerfile <QtGlobal> | - | ||||||||||||
509 | \title Global Qt Declarations | - | ||||||||||||
510 | \ingroup funclists | - | ||||||||||||
511 | - | |||||||||||||
512 | \brief The <QtGlobal> header file includes the fundamental global | - | ||||||||||||
513 | declarations. It is included by most other Qt header files. | - | ||||||||||||
514 | - | |||||||||||||
515 | The global declarations include \l{types}, \l{functions} and | - | ||||||||||||
516 | \l{macros}. | - | ||||||||||||
517 | - | |||||||||||||
518 | The type definitions are partly convenience definitions for basic | - | ||||||||||||
519 | types (some of which guarantee certain bit-sizes on all platforms | - | ||||||||||||
520 | supported by Qt), partly types related to Qt message handling. The | - | ||||||||||||
521 | functions are related to generating messages, Qt version handling | - | ||||||||||||
522 | and comparing and adjusting object values. And finally, some of | - | ||||||||||||
523 | the declared macros enable programmers to add compiler or platform | - | ||||||||||||
524 | specific code to their applications, while others are convenience | - | ||||||||||||
525 | macros for larger operations. | - | ||||||||||||
526 | - | |||||||||||||
527 | \section1 Types | - | ||||||||||||
528 | - | |||||||||||||
529 | The header file declares several type definitions that guarantee a | - | ||||||||||||
530 | specified bit-size on all platforms supported by Qt for various | - | ||||||||||||
531 | basic types, for example \l qint8 which is a signed char | - | ||||||||||||
532 | guaranteed to be 8-bit on all platforms supported by Qt. The | - | ||||||||||||
533 | header file also declares the \l qlonglong type definition for \c | - | ||||||||||||
534 | {long long int } (\c __int64 on Windows). | - | ||||||||||||
535 | - | |||||||||||||
536 | Several convenience type definitions are declared: \l qreal for \c | - | ||||||||||||
537 | double, \l uchar for \c unsigned char, \l uint for \c unsigned | - | ||||||||||||
538 | int, \l ulong for \c unsigned long and \l ushort for \c unsigned | - | ||||||||||||
539 | short. | - | ||||||||||||
540 | - | |||||||||||||
541 | Finally, the QtMsgType definition identifies the various messages | - | ||||||||||||
542 | that can be generated and sent to a Qt message handler; | - | ||||||||||||
543 | QtMessageHandler is a type definition for a pointer to a function with | - | ||||||||||||
544 | the signature | - | ||||||||||||
545 | \c {void myMessageHandler(QtMsgType, const QMessageLogContext &, const char *)}. | - | ||||||||||||
546 | QMessageLogContext class contains the line, file, and function the | - | ||||||||||||
547 | message was logged at. This information is created by the QMessageLogger | - | ||||||||||||
548 | class. | - | ||||||||||||
549 | - | |||||||||||||
550 | \section1 Functions | - | ||||||||||||
551 | - | |||||||||||||
552 | The <QtGlobal> header file contains several functions comparing | - | ||||||||||||
553 | and adjusting an object's value. These functions take a template | - | ||||||||||||
554 | type as argument: You can retrieve the absolute value of an object | - | ||||||||||||
555 | using the qAbs() function, and you can bound a given object's | - | ||||||||||||
556 | value by given minimum and maximum values using the qBound() | - | ||||||||||||
557 | function. You can retrieve the minimum and maximum of two given | - | ||||||||||||
558 | objects using qMin() and qMax() respectively. All these functions | - | ||||||||||||
559 | return a corresponding template type; the template types can be | - | ||||||||||||
560 | replaced by any other type. | - | ||||||||||||
561 | - | |||||||||||||
562 | Example: | - | ||||||||||||
563 | - | |||||||||||||
564 | \snippet code/src_corelib_global_qglobal.cpp 3 | - | ||||||||||||
565 | - | |||||||||||||
566 | <QtGlobal> also contains functions that generate messages from the | - | ||||||||||||
567 | given string argument: qDebug(), qInfo(), qWarning(), qCritical(), | - | ||||||||||||
568 | and qFatal(). These functions call the message handler | - | ||||||||||||
569 | with the given message. | - | ||||||||||||
570 | - | |||||||||||||
571 | Example: | - | ||||||||||||
572 | - | |||||||||||||
573 | \snippet code/src_corelib_global_qglobal.cpp 4 | - | ||||||||||||
574 | - | |||||||||||||
575 | The remaining functions are qRound() and qRound64(), which both | - | ||||||||||||
576 | accept a \l qreal value as their argument returning the value | - | ||||||||||||
577 | rounded up to the nearest integer and 64-bit integer respectively, | - | ||||||||||||
578 | the qInstallMessageHandler() function which installs the given | - | ||||||||||||
579 | QtMessageHandler, and the qVersion() function which returns the | - | ||||||||||||
580 | version number of Qt at run-time as a string. | - | ||||||||||||
581 | - | |||||||||||||
582 | \section1 Macros | - | ||||||||||||
583 | - | |||||||||||||
584 | The <QtGlobal> header file provides a range of macros (Q_CC_*) | - | ||||||||||||
585 | that are defined if the application is compiled using the | - | ||||||||||||
586 | specified platforms. For example, the Q_CC_SUN macro is defined if | - | ||||||||||||
587 | the application is compiled using Forte Developer, or Sun Studio | - | ||||||||||||
588 | C++. The header file also declares a range of macros (Q_OS_*) | - | ||||||||||||
589 | that are defined for the specified platforms. For example, | - | ||||||||||||
590 | Q_OS_UNIX which is defined for the Unix-based systems. | - | ||||||||||||
591 | - | |||||||||||||
592 | The purpose of these macros is to enable programmers to add | - | ||||||||||||
593 | compiler or platform specific code to their application. | - | ||||||||||||
594 | - | |||||||||||||
595 | The remaining macros are convenience macros for larger operations: | - | ||||||||||||
596 | The QT_TRANSLATE_NOOP() and QT_TR_NOOP() macros provide the | - | ||||||||||||
597 | possibility of marking text for dynamic translation, | - | ||||||||||||
598 | i.e. translation without changing the stored source text. The | - | ||||||||||||
599 | Q_ASSERT() and Q_ASSERT_X() enables warning messages of various | - | ||||||||||||
600 | level of refinement. The Q_FOREACH() and foreach() macros | - | ||||||||||||
601 | implement Qt's foreach loop. | - | ||||||||||||
602 | - | |||||||||||||
603 | The Q_INT64_C() and Q_UINT64_C() macros wrap signed and unsigned | - | ||||||||||||
604 | 64-bit integer literals in a platform-independent way. The | - | ||||||||||||
605 | Q_CHECK_PTR() macro prints a warning containing the source code's | - | ||||||||||||
606 | file name and line number, saying that the program ran out of | - | ||||||||||||
607 | memory, if the pointer is 0. The qPrintable() and qUtf8Printable() | - | ||||||||||||
608 | macros represent an easy way of printing text. | - | ||||||||||||
609 | - | |||||||||||||
610 | Finally, the QT_POINTER_SIZE macro expands to the size of a | - | ||||||||||||
611 | pointer in bytes, and the QT_VERSION and QT_VERSION_STR macros | - | ||||||||||||
612 | expand to a numeric value or a string, respectively, specifying | - | ||||||||||||
613 | Qt's version number, i.e the version the application is compiled | - | ||||||||||||
614 | against. | - | ||||||||||||
615 | - | |||||||||||||
616 | \sa <QtAlgorithms>, QSysInfo | - | ||||||||||||
617 | */ | - | ||||||||||||
618 | - | |||||||||||||
619 | /*! | - | ||||||||||||
620 | \typedef qreal | - | ||||||||||||
621 | \relates <QtGlobal> | - | ||||||||||||
622 | - | |||||||||||||
623 | Typedef for \c double unless Qt is configured with the | - | ||||||||||||
624 | \c{-qreal float} option. | - | ||||||||||||
625 | */ | - | ||||||||||||
626 | - | |||||||||||||
627 | /*! \typedef uchar | - | ||||||||||||
628 | \relates <QtGlobal> | - | ||||||||||||
629 | - | |||||||||||||
630 | Convenience typedef for \c{unsigned char}. | - | ||||||||||||
631 | */ | - | ||||||||||||
632 | - | |||||||||||||
633 | /*! \typedef ushort | - | ||||||||||||
634 | \relates <QtGlobal> | - | ||||||||||||
635 | - | |||||||||||||
636 | Convenience typedef for \c{unsigned short}. | - | ||||||||||||
637 | */ | - | ||||||||||||
638 | - | |||||||||||||
639 | /*! \typedef uint | - | ||||||||||||
640 | \relates <QtGlobal> | - | ||||||||||||
641 | - | |||||||||||||
642 | Convenience typedef for \c{unsigned int}. | - | ||||||||||||
643 | */ | - | ||||||||||||
644 | - | |||||||||||||
645 | /*! \typedef ulong | - | ||||||||||||
646 | \relates <QtGlobal> | - | ||||||||||||
647 | - | |||||||||||||
648 | Convenience typedef for \c{unsigned long}. | - | ||||||||||||
649 | */ | - | ||||||||||||
650 | - | |||||||||||||
651 | /*! \typedef qint8 | - | ||||||||||||
652 | \relates <QtGlobal> | - | ||||||||||||
653 | - | |||||||||||||
654 | Typedef for \c{signed char}. This type is guaranteed to be 8-bit | - | ||||||||||||
655 | on all platforms supported by Qt. | - | ||||||||||||
656 | */ | - | ||||||||||||
657 | - | |||||||||||||
658 | /*! | - | ||||||||||||
659 | \typedef quint8 | - | ||||||||||||
660 | \relates <QtGlobal> | - | ||||||||||||
661 | - | |||||||||||||
662 | Typedef for \c{unsigned char}. This type is guaranteed to | - | ||||||||||||
663 | be 8-bit on all platforms supported by Qt. | - | ||||||||||||
664 | */ | - | ||||||||||||
665 | - | |||||||||||||
666 | /*! \typedef qint16 | - | ||||||||||||
667 | \relates <QtGlobal> | - | ||||||||||||
668 | - | |||||||||||||
669 | Typedef for \c{signed short}. This type is guaranteed to be | - | ||||||||||||
670 | 16-bit on all platforms supported by Qt. | - | ||||||||||||
671 | */ | - | ||||||||||||
672 | - | |||||||||||||
673 | /*! | - | ||||||||||||
674 | \typedef quint16 | - | ||||||||||||
675 | \relates <QtGlobal> | - | ||||||||||||
676 | - | |||||||||||||
677 | Typedef for \c{unsigned short}. This type is guaranteed to | - | ||||||||||||
678 | be 16-bit on all platforms supported by Qt. | - | ||||||||||||
679 | */ | - | ||||||||||||
680 | - | |||||||||||||
681 | /*! \typedef qint32 | - | ||||||||||||
682 | \relates <QtGlobal> | - | ||||||||||||
683 | - | |||||||||||||
684 | Typedef for \c{signed int}. This type is guaranteed to be 32-bit | - | ||||||||||||
685 | on all platforms supported by Qt. | - | ||||||||||||
686 | */ | - | ||||||||||||
687 | - | |||||||||||||
688 | /*! | - | ||||||||||||
689 | \typedef quint32 | - | ||||||||||||
690 | \relates <QtGlobal> | - | ||||||||||||
691 | - | |||||||||||||
692 | Typedef for \c{unsigned int}. This type is guaranteed to | - | ||||||||||||
693 | be 32-bit on all platforms supported by Qt. | - | ||||||||||||
694 | */ | - | ||||||||||||
695 | - | |||||||||||||
696 | /*! \typedef qint64 | - | ||||||||||||
697 | \relates <QtGlobal> | - | ||||||||||||
698 | - | |||||||||||||
699 | Typedef for \c{long long int} (\c __int64 on Windows). This type | - | ||||||||||||
700 | is guaranteed to be 64-bit on all platforms supported by Qt. | - | ||||||||||||
701 | - | |||||||||||||
702 | Literals of this type can be created using the Q_INT64_C() macro: | - | ||||||||||||
703 | - | |||||||||||||
704 | \snippet code/src_corelib_global_qglobal.cpp 5 | - | ||||||||||||
705 | - | |||||||||||||
706 | \sa Q_INT64_C(), quint64, qlonglong | - | ||||||||||||
707 | */ | - | ||||||||||||
708 | - | |||||||||||||
709 | /*! | - | ||||||||||||
710 | \typedef quint64 | - | ||||||||||||
711 | \relates <QtGlobal> | - | ||||||||||||
712 | - | |||||||||||||
713 | Typedef for \c{unsigned long long int} (\c{unsigned __int64} on | - | ||||||||||||
714 | Windows). This type is guaranteed to be 64-bit on all platforms | - | ||||||||||||
715 | supported by Qt. | - | ||||||||||||
716 | - | |||||||||||||
717 | Literals of this type can be created using the Q_UINT64_C() | - | ||||||||||||
718 | macro: | - | ||||||||||||
719 | - | |||||||||||||
720 | \snippet code/src_corelib_global_qglobal.cpp 6 | - | ||||||||||||
721 | - | |||||||||||||
722 | \sa Q_UINT64_C(), qint64, qulonglong | - | ||||||||||||
723 | */ | - | ||||||||||||
724 | - | |||||||||||||
725 | /*! | - | ||||||||||||
726 | \typedef qintptr | - | ||||||||||||
727 | \relates <QtGlobal> | - | ||||||||||||
728 | - | |||||||||||||
729 | Integral type for representing pointers in a signed integer (useful for | - | ||||||||||||
730 | hashing, etc.). | - | ||||||||||||
731 | - | |||||||||||||
732 | Typedef for either qint32 or qint64. This type is guaranteed to | - | ||||||||||||
733 | be the same size as a pointer on all platforms supported by Qt. On | - | ||||||||||||
734 | a system with 32-bit pointers, qintptr is a typedef for qint32; | - | ||||||||||||
735 | on a system with 64-bit pointers, qintptr is a typedef for | - | ||||||||||||
736 | qint64. | - | ||||||||||||
737 | - | |||||||||||||
738 | Note that qintptr is signed. Use quintptr for unsigned values. | - | ||||||||||||
739 | - | |||||||||||||
740 | \sa qptrdiff, qint32, qint64 | - | ||||||||||||
741 | */ | - | ||||||||||||
742 | - | |||||||||||||
743 | /*! | - | ||||||||||||
744 | \typedef quintptr | - | ||||||||||||
745 | \relates <QtGlobal> | - | ||||||||||||
746 | - | |||||||||||||
747 | Integral type for representing pointers in an unsigned integer (useful for | - | ||||||||||||
748 | hashing, etc.). | - | ||||||||||||
749 | - | |||||||||||||
750 | Typedef for either quint32 or quint64. This type is guaranteed to | - | ||||||||||||
751 | be the same size as a pointer on all platforms supported by Qt. On | - | ||||||||||||
752 | a system with 32-bit pointers, quintptr is a typedef for quint32; | - | ||||||||||||
753 | on a system with 64-bit pointers, quintptr is a typedef for | - | ||||||||||||
754 | quint64. | - | ||||||||||||
755 | - | |||||||||||||
756 | Note that quintptr is unsigned. Use qptrdiff for signed values. | - | ||||||||||||
757 | - | |||||||||||||
758 | \sa qptrdiff, quint32, quint64 | - | ||||||||||||
759 | */ | - | ||||||||||||
760 | - | |||||||||||||
761 | /*! | - | ||||||||||||
762 | \typedef qptrdiff | - | ||||||||||||
763 | \relates <QtGlobal> | - | ||||||||||||
764 | - | |||||||||||||
765 | Integral type for representing pointer differences. | - | ||||||||||||
766 | - | |||||||||||||
767 | Typedef for either qint32 or qint64. This type is guaranteed to be | - | ||||||||||||
768 | the same size as a pointer on all platforms supported by Qt. On a | - | ||||||||||||
769 | system with 32-bit pointers, quintptr is a typedef for quint32; on | - | ||||||||||||
770 | a system with 64-bit pointers, quintptr is a typedef for quint64. | - | ||||||||||||
771 | - | |||||||||||||
772 | Note that qptrdiff is signed. Use quintptr for unsigned values. | - | ||||||||||||
773 | - | |||||||||||||
774 | \sa quintptr, qint32, qint64 | - | ||||||||||||
775 | */ | - | ||||||||||||
776 | - | |||||||||||||
777 | /*! | - | ||||||||||||
778 | \enum QtMsgType | - | ||||||||||||
779 | \relates <QtGlobal> | - | ||||||||||||
780 | - | |||||||||||||
781 | This enum describes the messages that can be sent to a message | - | ||||||||||||
782 | handler (QtMessageHandler). You can use the enum to identify and | - | ||||||||||||
783 | associate the various message types with the appropriate | - | ||||||||||||
784 | actions. | - | ||||||||||||
785 | - | |||||||||||||
786 | \value QtDebugMsg | - | ||||||||||||
787 | A message generated by the qDebug() function. | - | ||||||||||||
788 | \value QtInfoMsg | - | ||||||||||||
789 | A message generated by the qInfo() function. | - | ||||||||||||
790 | \value QtWarningMsg | - | ||||||||||||
791 | A message generated by the qWarning() function. | - | ||||||||||||
792 | \value QtCriticalMsg | - | ||||||||||||
793 | A message generated by the qCritical() function. | - | ||||||||||||
794 | \value QtFatalMsg | - | ||||||||||||
795 | A message generated by the qFatal() function. | - | ||||||||||||
796 | \value QtSystemMsg | - | ||||||||||||
797 | - | |||||||||||||
798 | \c QtInfoMsg was added in Qt 5.5. | - | ||||||||||||
799 | - | |||||||||||||
800 | \sa QtMessageHandler, qInstallMessageHandler() | - | ||||||||||||
801 | */ | - | ||||||||||||
802 | - | |||||||||||||
803 | /*! \typedef QFunctionPointer | - | ||||||||||||
804 | \relates <QtGlobal> | - | ||||||||||||
805 | - | |||||||||||||
806 | This is a typedef for \c{void (*)()}, a pointer to a function that takes | - | ||||||||||||
807 | no arguments and returns void. | - | ||||||||||||
808 | */ | - | ||||||||||||
809 | - | |||||||||||||
810 | /*! \macro qint64 Q_INT64_C(literal) | - | ||||||||||||
811 | \relates <QtGlobal> | - | ||||||||||||
812 | - | |||||||||||||
813 | Wraps the signed 64-bit integer \a literal in a | - | ||||||||||||
814 | platform-independent way. | - | ||||||||||||
815 | - | |||||||||||||
816 | Example: | - | ||||||||||||
817 | - | |||||||||||||
818 | \snippet code/src_corelib_global_qglobal.cpp 8 | - | ||||||||||||
819 | - | |||||||||||||
820 | \sa qint64, Q_UINT64_C() | - | ||||||||||||
821 | */ | - | ||||||||||||
822 | - | |||||||||||||
823 | /*! \macro quint64 Q_UINT64_C(literal) | - | ||||||||||||
824 | \relates <QtGlobal> | - | ||||||||||||
825 | - | |||||||||||||
826 | Wraps the unsigned 64-bit integer \a literal in a | - | ||||||||||||
827 | platform-independent way. | - | ||||||||||||
828 | - | |||||||||||||
829 | Example: | - | ||||||||||||
830 | - | |||||||||||||
831 | \snippet code/src_corelib_global_qglobal.cpp 9 | - | ||||||||||||
832 | - | |||||||||||||
833 | \sa quint64, Q_INT64_C() | - | ||||||||||||
834 | */ | - | ||||||||||||
835 | - | |||||||||||||
836 | /*! \typedef qlonglong | - | ||||||||||||
837 | \relates <QtGlobal> | - | ||||||||||||
838 | - | |||||||||||||
839 | Typedef for \c{long long int} (\c __int64 on Windows). This is | - | ||||||||||||
840 | the same as \l qint64. | - | ||||||||||||
841 | - | |||||||||||||
842 | \sa qulonglong, qint64 | - | ||||||||||||
843 | */ | - | ||||||||||||
844 | - | |||||||||||||
845 | /*! | - | ||||||||||||
846 | \typedef qulonglong | - | ||||||||||||
847 | \relates <QtGlobal> | - | ||||||||||||
848 | - | |||||||||||||
849 | Typedef for \c{unsigned long long int} (\c{unsigned __int64} on | - | ||||||||||||
850 | Windows). This is the same as \l quint64. | - | ||||||||||||
851 | - | |||||||||||||
852 | \sa quint64, qlonglong | - | ||||||||||||
853 | */ | - | ||||||||||||
854 | - | |||||||||||||
855 | /*! \fn T qAbs(const T &value) | - | ||||||||||||
856 | \relates <QtGlobal> | - | ||||||||||||
857 | - | |||||||||||||
858 | Compares \a value to the 0 of type T and returns the absolute | - | ||||||||||||
859 | value. Thus if T is \e {double}, then \a value is compared to | - | ||||||||||||
860 | \e{(double) 0}. | - | ||||||||||||
861 | - | |||||||||||||
862 | Example: | - | ||||||||||||
863 | - | |||||||||||||
864 | \snippet code/src_corelib_global_qglobal.cpp 10 | - | ||||||||||||
865 | */ | - | ||||||||||||
866 | - | |||||||||||||
867 | /*! \fn int qRound(qreal value) | - | ||||||||||||
868 | \relates <QtGlobal> | - | ||||||||||||
869 | - | |||||||||||||
870 | Rounds \a value to the nearest integer. | - | ||||||||||||
871 | - | |||||||||||||
872 | Example: | - | ||||||||||||
873 | - | |||||||||||||
874 | \snippet code/src_corelib_global_qglobal.cpp 11 | - | ||||||||||||
875 | */ | - | ||||||||||||
876 | - | |||||||||||||
877 | /*! \fn qint64 qRound64(qreal value) | - | ||||||||||||
878 | \relates <QtGlobal> | - | ||||||||||||
879 | - | |||||||||||||
880 | Rounds \a value to the nearest 64-bit integer. | - | ||||||||||||
881 | - | |||||||||||||
882 | Example: | - | ||||||||||||
883 | - | |||||||||||||
884 | \snippet code/src_corelib_global_qglobal.cpp 12 | - | ||||||||||||
885 | */ | - | ||||||||||||
886 | - | |||||||||||||
887 | /*! \fn const T &qMin(const T &value1, const T &value2) | - | ||||||||||||
888 | \relates <QtGlobal> | - | ||||||||||||
889 | - | |||||||||||||
890 | Returns the minimum of \a value1 and \a value2. | - | ||||||||||||
891 | - | |||||||||||||
892 | Example: | - | ||||||||||||
893 | - | |||||||||||||
894 | \snippet code/src_corelib_global_qglobal.cpp 13 | - | ||||||||||||
895 | - | |||||||||||||
896 | \sa qMax(), qBound() | - | ||||||||||||
897 | */ | - | ||||||||||||
898 | - | |||||||||||||
899 | /*! \fn const T &qMax(const T &value1, const T &value2) | - | ||||||||||||
900 | \relates <QtGlobal> | - | ||||||||||||
901 | - | |||||||||||||
902 | Returns the maximum of \a value1 and \a value2. | - | ||||||||||||
903 | - | |||||||||||||
904 | Example: | - | ||||||||||||
905 | - | |||||||||||||
906 | \snippet code/src_corelib_global_qglobal.cpp 14 | - | ||||||||||||
907 | - | |||||||||||||
908 | \sa qMin(), qBound() | - | ||||||||||||
909 | */ | - | ||||||||||||
910 | - | |||||||||||||
911 | /*! \fn const T &qBound(const T &min, const T &value, const T &max) | - | ||||||||||||
912 | \relates <QtGlobal> | - | ||||||||||||
913 | - | |||||||||||||
914 | Returns \a value bounded by \a min and \a max. This is equivalent | - | ||||||||||||
915 | to qMax(\a min, qMin(\a value, \a max)). | - | ||||||||||||
916 | - | |||||||||||||
917 | Example: | - | ||||||||||||
918 | - | |||||||||||||
919 | \snippet code/src_corelib_global_qglobal.cpp 15 | - | ||||||||||||
920 | - | |||||||||||||
921 | \sa qMin(), qMax() | - | ||||||||||||
922 | */ | - | ||||||||||||
923 | - | |||||||||||||
924 | /*! \fn auto qOverload(T functionPointer) | - | ||||||||||||
925 | \relates <QtGlobal> | - | ||||||||||||
926 | \since 5.7 | - | ||||||||||||
927 | - | |||||||||||||
928 | Returns a pointer to an overloaded function. The template | - | ||||||||||||
929 | parameter is the list of the argument types of the function. | - | ||||||||||||
930 | \a functionPointer is the pointer to the (member) function: | - | ||||||||||||
931 | - | |||||||||||||
932 | \snippet code/src_corelib_global_qglobal.cpp 52 | - | ||||||||||||
933 | - | |||||||||||||
934 | If a member function is also const-overloaded \l qConstOverload and | - | ||||||||||||
935 | \l qNonConstOverload need to be used. | - | ||||||||||||
936 | - | |||||||||||||
937 | qOverload() requires C++14 enabled. In C++11-only code, the helper | - | ||||||||||||
938 | classes QOverload, QConstOverload, and QNonConstOverload can be used directly: | - | ||||||||||||
939 | - | |||||||||||||
940 | \snippet code/src_corelib_global_qglobal.cpp 53 | - | ||||||||||||
941 | - | |||||||||||||
942 | \sa qConstOverload(), qNonConstOverload() | - | ||||||||||||
943 | */ | - | ||||||||||||
944 | - | |||||||||||||
945 | /*! \fn auto qConstOverload(T memberFunctionPointer) | - | ||||||||||||
946 | \relates <QtGlobal> | - | ||||||||||||
947 | \since 5.7 | - | ||||||||||||
948 | - | |||||||||||||
949 | Returns the \a memberFunctionPointer pointer to a constant member function: | - | ||||||||||||
950 | - | |||||||||||||
951 | \snippet code/src_corelib_global_qglobal.cpp 54 | - | ||||||||||||
952 | - | |||||||||||||
953 | \sa qOverload, qNonConstOverload | - | ||||||||||||
954 | */ | - | ||||||||||||
955 | - | |||||||||||||
956 | /*! \fn auto qNonConstOverload(T memberFunctionPointer) | - | ||||||||||||
957 | \relates <QtGlobal> | - | ||||||||||||
958 | \since 5.7 | - | ||||||||||||
959 | - | |||||||||||||
960 | Returns the \a memberFunctionPointer pointer to a non-constant member function: | - | ||||||||||||
961 | - | |||||||||||||
962 | \snippet code/src_corelib_global_qglobal.cpp 54 | - | ||||||||||||
963 | - | |||||||||||||
964 | \sa qOverload, qNonConstOverload | - | ||||||||||||
965 | */ | - | ||||||||||||
966 | - | |||||||||||||
967 | /*! | - | ||||||||||||
968 | \macro QT_VERSION_CHECK | - | ||||||||||||
969 | \relates <QtGlobal> | - | ||||||||||||
970 | - | |||||||||||||
971 | Turns the major, minor and patch numbers of a version into an | - | ||||||||||||
972 | integer, 0xMMNNPP (MM = major, NN = minor, PP = patch). This can | - | ||||||||||||
973 | be compared with another similarly processed version id. | - | ||||||||||||
974 | - | |||||||||||||
975 | Example: | - | ||||||||||||
976 | - | |||||||||||||
977 | \snippet code/src_corelib_global_qglobal.cpp qt-version-check | - | ||||||||||||
978 | - | |||||||||||||
979 | \sa QT_VERSION | - | ||||||||||||
980 | */ | - | ||||||||||||
981 | - | |||||||||||||
982 | /*! | - | ||||||||||||
983 | \macro QT_VERSION | - | ||||||||||||
984 | \relates <QtGlobal> | - | ||||||||||||
985 | - | |||||||||||||
986 | This macro expands a numeric value of the form 0xMMNNPP (MM = | - | ||||||||||||
987 | major, NN = minor, PP = patch) that specifies Qt's version | - | ||||||||||||
988 | number. For example, if you compile your application against Qt | - | ||||||||||||
989 | 4.1.2, the QT_VERSION macro will expand to 0x040102. | - | ||||||||||||
990 | - | |||||||||||||
991 | You can use QT_VERSION to use the latest Qt features where | - | ||||||||||||
992 | available. | - | ||||||||||||
993 | - | |||||||||||||
994 | Example: | - | ||||||||||||
995 | - | |||||||||||||
996 | \snippet code/src_corelib_global_qglobal.cpp 16 | - | ||||||||||||
997 | - | |||||||||||||
998 | \sa QT_VERSION_STR, qVersion() | - | ||||||||||||
999 | */ | - | ||||||||||||
1000 | - | |||||||||||||
1001 | /*! | - | ||||||||||||
1002 | \macro QT_VERSION_STR | - | ||||||||||||
1003 | \relates <QtGlobal> | - | ||||||||||||
1004 | - | |||||||||||||
1005 | This macro expands to a string that specifies Qt's version number | - | ||||||||||||
1006 | (for example, "4.1.2"). This is the version against which the | - | ||||||||||||
1007 | application is compiled. | - | ||||||||||||
1008 | - | |||||||||||||
1009 | \sa qVersion(), QT_VERSION | - | ||||||||||||
1010 | */ | - | ||||||||||||
1011 | - | |||||||||||||
1012 | /*! | - | ||||||||||||
1013 | \relates <QtGlobal> | - | ||||||||||||
1014 | - | |||||||||||||
1015 | Returns the version number of Qt at run-time as a string (for | - | ||||||||||||
1016 | example, "4.1.2"). This may be a different version than the | - | ||||||||||||
1017 | version the application was compiled against. | - | ||||||||||||
1018 | - | |||||||||||||
1019 | \sa QT_VERSION_STR | - | ||||||||||||
1020 | */ | - | ||||||||||||
1021 | - | |||||||||||||
1022 | const char *qVersion() Q_DECL_NOTHROW | - | ||||||||||||
1023 | { | - | ||||||||||||
1024 | return QT_VERSION_STR; executed 585 times by 2 tests: return "5.7.1"; Executed by:
| 585 | ||||||||||||
1025 | } | - | ||||||||||||
1026 | - | |||||||||||||
1027 | bool qSharedBuild() Q_DECL_NOTHROW | - | ||||||||||||
1028 | { | - | ||||||||||||
1029 | #ifdef QT_SHARED | - | ||||||||||||
1030 | return true; never executed: return true; | 0 | ||||||||||||
1031 | #else | - | ||||||||||||
1032 | return false; | - | ||||||||||||
1033 | #endif | - | ||||||||||||
1034 | } | - | ||||||||||||
1035 | - | |||||||||||||
1036 | /***************************************************************************** | - | ||||||||||||
1037 | System detection routines | - | ||||||||||||
1038 | *****************************************************************************/ | - | ||||||||||||
1039 | - | |||||||||||||
1040 | /*! | - | ||||||||||||
1041 | \class QSysInfo | - | ||||||||||||
1042 | \inmodule QtCore | - | ||||||||||||
1043 | \brief The QSysInfo class provides information about the system. | - | ||||||||||||
1044 | - | |||||||||||||
1045 | \list | - | ||||||||||||
1046 | \li \l WordSize specifies the size of a pointer for the platform | - | ||||||||||||
1047 | on which the application is compiled. | - | ||||||||||||
1048 | \li \l ByteOrder specifies whether the platform is big-endian or | - | ||||||||||||
1049 | little-endian. | - | ||||||||||||
1050 | \li \l WindowsVersion specifies the version of the Windows operating | - | ||||||||||||
1051 | system on which the application is run. | - | ||||||||||||
1052 | \li \l MacintoshVersion specifies the version of the Macintosh | - | ||||||||||||
1053 | operating system on which the application is run. | - | ||||||||||||
1054 | \endlist | - | ||||||||||||
1055 | - | |||||||||||||
1056 | Some constants are defined only on certain platforms. You can use | - | ||||||||||||
1057 | the preprocessor symbols Q_OS_WIN and Q_OS_MACOS to test that | - | ||||||||||||
1058 | the application is compiled under Windows or \macos. | - | ||||||||||||
1059 | - | |||||||||||||
1060 | \sa QLibraryInfo | - | ||||||||||||
1061 | */ | - | ||||||||||||
1062 | - | |||||||||||||
1063 | /*! | - | ||||||||||||
1064 | \enum QSysInfo::Sizes | - | ||||||||||||
1065 | - | |||||||||||||
1066 | This enum provides platform-specific information about the sizes of data | - | ||||||||||||
1067 | structures used by the underlying architecture. | - | ||||||||||||
1068 | - | |||||||||||||
1069 | \value WordSize The size in bits of a pointer for the platform on which | - | ||||||||||||
1070 | the application is compiled (32 or 64). | - | ||||||||||||
1071 | */ | - | ||||||||||||
1072 | - | |||||||||||||
1073 | /*! | - | ||||||||||||
1074 | \variable QSysInfo::WindowsVersion | - | ||||||||||||
1075 | \brief the version of the Windows operating system on which the | - | ||||||||||||
1076 | application is run. | - | ||||||||||||
1077 | */ | - | ||||||||||||
1078 | - | |||||||||||||
1079 | /*! | - | ||||||||||||
1080 | \fn QSysInfo::WindowsVersion QSysInfo::windowsVersion() | - | ||||||||||||
1081 | \since 4.4 | - | ||||||||||||
1082 | - | |||||||||||||
1083 | Returns the version of the Windows operating system on which the | - | ||||||||||||
1084 | application is run, or WV_None if the operating system is not | - | ||||||||||||
1085 | Windows. | - | ||||||||||||
1086 | */ | - | ||||||||||||
1087 | - | |||||||||||||
1088 | /*! | - | ||||||||||||
1089 | \variable QSysInfo::MacintoshVersion | - | ||||||||||||
1090 | \brief the version of the Macintosh operating system on which | - | ||||||||||||
1091 | the application is run. | - | ||||||||||||
1092 | */ | - | ||||||||||||
1093 | - | |||||||||||||
1094 | /*! | - | ||||||||||||
1095 | \fn QSysInfo::MacVersion QSysInfo::macVersion() | - | ||||||||||||
1096 | - | |||||||||||||
1097 | Returns the version of Darwin (\macos or iOS) on which the | - | ||||||||||||
1098 | application is run, or MV_None if the operating system | - | ||||||||||||
1099 | is not a version of Darwin. | - | ||||||||||||
1100 | */ | - | ||||||||||||
1101 | - | |||||||||||||
1102 | /*! | - | ||||||||||||
1103 | \enum QSysInfo::Endian | - | ||||||||||||
1104 | - | |||||||||||||
1105 | \value BigEndian Big-endian byte order (also called Network byte order) | - | ||||||||||||
1106 | \value LittleEndian Little-endian byte order | - | ||||||||||||
1107 | \value ByteOrder Equals BigEndian or LittleEndian, depending on | - | ||||||||||||
1108 | the platform's byte order. | - | ||||||||||||
1109 | */ | - | ||||||||||||
1110 | - | |||||||||||||
1111 | /*! | - | ||||||||||||
1112 | \enum QSysInfo::WinVersion | - | ||||||||||||
1113 | - | |||||||||||||
1114 | This enum provides symbolic names for the various versions of the | - | ||||||||||||
1115 | Windows operating system. On Windows, the | - | ||||||||||||
1116 | QSysInfo::WindowsVersion variable gives the version of the system | - | ||||||||||||
1117 | on which the application is run. | - | ||||||||||||
1118 | - | |||||||||||||
1119 | MS-DOS-based versions: | - | ||||||||||||
1120 | - | |||||||||||||
1121 | \value WV_32s Windows 3.1 with Win 32s | - | ||||||||||||
1122 | \value WV_95 Windows 95 | - | ||||||||||||
1123 | \value WV_98 Windows 98 | - | ||||||||||||
1124 | \value WV_Me Windows Me | - | ||||||||||||
1125 | - | |||||||||||||
1126 | NT-based versions (note that each operating system version is only represented once rather than each Windows edition): | - | ||||||||||||
1127 | - | |||||||||||||
1128 | \value WV_NT Windows NT (operating system version 4.0) | - | ||||||||||||
1129 | \value WV_2000 Windows 2000 (operating system version 5.0) | - | ||||||||||||
1130 | \value WV_XP Windows XP (operating system version 5.1) | - | ||||||||||||
1131 | \value WV_2003 Windows Server 2003, Windows Server 2003 R2, Windows Home Server, Windows XP Professional x64 Edition (operating system version 5.2) | - | ||||||||||||
1132 | \value WV_VISTA Windows Vista, Windows Server 2008 (operating system version 6.0) | - | ||||||||||||
1133 | \value WV_WINDOWS7 Windows 7, Windows Server 2008 R2 (operating system version 6.1) | - | ||||||||||||
1134 | \value WV_WINDOWS8 Windows 8 (operating system version 6.2) | - | ||||||||||||
1135 | \value WV_WINDOWS8_1 Windows 8.1 (operating system version 6.3), introduced in Qt 5.2 | - | ||||||||||||
1136 | \value WV_WINDOWS10 Windows 10 (operating system version 10.0), introduced in Qt 5.5 | - | ||||||||||||
1137 | - | |||||||||||||
1138 | Alternatively, you may use the following macros which correspond directly to the Windows operating system version number: | - | ||||||||||||
1139 | - | |||||||||||||
1140 | \value WV_4_0 Operating system version 4.0, corresponds to Windows NT | - | ||||||||||||
1141 | \value WV_5_0 Operating system version 5.0, corresponds to Windows 2000 | - | ||||||||||||
1142 | \value WV_5_1 Operating system version 5.1, corresponds to Windows XP | - | ||||||||||||
1143 | \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 | - | ||||||||||||
1144 | \value WV_6_0 Operating system version 6.0, corresponds to Windows Vista and Windows Server 2008 | - | ||||||||||||
1145 | \value WV_6_1 Operating system version 6.1, corresponds to Windows 7 and Windows Server 2008 R2 | - | ||||||||||||
1146 | \value WV_6_2 Operating system version 6.2, corresponds to Windows 8 | - | ||||||||||||
1147 | \value WV_6_3 Operating system version 6.3, corresponds to Windows 8.1, introduced in Qt 5.2 | - | ||||||||||||
1148 | \value WV_10_0 Operating system version 10.0, corresponds to Windows 10, introduced in Qt 5.5 | - | ||||||||||||
1149 | - | |||||||||||||
1150 | \omitvalue WV_CE | - | ||||||||||||
1151 | \omitvalue WV_CENET | - | ||||||||||||
1152 | \omitvalue WV_CE_5 | - | ||||||||||||
1153 | \omitvalue WV_CE_6 | - | ||||||||||||
1154 | - | |||||||||||||
1155 | The following masks can be used for testing whether a Windows | - | ||||||||||||
1156 | version is MS-DOS-based or NT-based: | - | ||||||||||||
1157 | - | |||||||||||||
1158 | \value WV_DOS_based MS-DOS-based version of Windows | - | ||||||||||||
1159 | \value WV_NT_based NT-based version of Windows | - | ||||||||||||
1160 | \omitvalue WV_CE_based | - | ||||||||||||
1161 | - | |||||||||||||
1162 | \value WV_None Operating system other than Windows. | - | ||||||||||||
1163 | - | |||||||||||||
1164 | \sa MacVersion | - | ||||||||||||
1165 | */ | - | ||||||||||||
1166 | - | |||||||||||||
1167 | /*! | - | ||||||||||||
1168 | \enum QSysInfo::MacVersion | - | ||||||||||||
1169 | - | |||||||||||||
1170 | This enum provides symbolic names for the various versions of the | - | ||||||||||||
1171 | Darwin operating system, covering both \macos and iOS. The | - | ||||||||||||
1172 | QSysInfo::MacintoshVersion variable gives the version of the | - | ||||||||||||
1173 | system on which the application is run. | - | ||||||||||||
1174 | - | |||||||||||||
1175 | \value MV_9 \macos 9 | - | ||||||||||||
1176 | \value MV_10_0 \macos 10.0 | - | ||||||||||||
1177 | \value MV_10_1 \macos 10.1 | - | ||||||||||||
1178 | \value MV_10_2 \macos 10.2 | - | ||||||||||||
1179 | \value MV_10_3 \macos 10.3 | - | ||||||||||||
1180 | \value MV_10_4 \macos 10.4 | - | ||||||||||||
1181 | \value MV_10_5 \macos 10.5 | - | ||||||||||||
1182 | \value MV_10_6 \macos 10.6 | - | ||||||||||||
1183 | \value MV_10_7 \macos 10.7 | - | ||||||||||||
1184 | \value MV_10_8 \macos 10.8 | - | ||||||||||||
1185 | \value MV_10_9 \macos 10.9 | - | ||||||||||||
1186 | \value MV_10_10 \macos 10.10 | - | ||||||||||||
1187 | \value MV_10_11 \macos 10.11 | - | ||||||||||||
1188 | \value MV_10_12 \macos 10.12 | - | ||||||||||||
1189 | \value MV_Unknown An unknown and currently unsupported platform | - | ||||||||||||
1190 | - | |||||||||||||
1191 | \value MV_CHEETAH Apple codename for MV_10_0 | - | ||||||||||||
1192 | \value MV_PUMA Apple codename for MV_10_1 | - | ||||||||||||
1193 | \value MV_JAGUAR Apple codename for MV_10_2 | - | ||||||||||||
1194 | \value MV_PANTHER Apple codename for MV_10_3 | - | ||||||||||||
1195 | \value MV_TIGER Apple codename for MV_10_4 | - | ||||||||||||
1196 | \value MV_LEOPARD Apple codename for MV_10_5 | - | ||||||||||||
1197 | \value MV_SNOWLEOPARD Apple codename for MV_10_6 | - | ||||||||||||
1198 | \value MV_LION Apple codename for MV_10_7 | - | ||||||||||||
1199 | \value MV_MOUNTAINLION Apple codename for MV_10_8 | - | ||||||||||||
1200 | \value MV_MAVERICKS Apple codename for MV_10_9 | - | ||||||||||||
1201 | \value MV_YOSEMITE Apple codename for MV_10_10 | - | ||||||||||||
1202 | \value MV_ELCAPITAN Apple codename for MV_10_11 | - | ||||||||||||
1203 | \value MV_SIERRA Apple codename for MV_10_12 | - | ||||||||||||
1204 | - | |||||||||||||
1205 | \value MV_IOS iOS (any) | - | ||||||||||||
1206 | \value MV_IOS_4_3 iOS 4.3 | - | ||||||||||||
1207 | \value MV_IOS_5_0 iOS 5.0 | - | ||||||||||||
1208 | \value MV_IOS_5_1 iOS 5.1 | - | ||||||||||||
1209 | \value MV_IOS_6_0 iOS 6.0 | - | ||||||||||||
1210 | \value MV_IOS_6_1 iOS 6.1 | - | ||||||||||||
1211 | \value MV_IOS_7_0 iOS 7.0 | - | ||||||||||||
1212 | \value MV_IOS_7_1 iOS 7.1 | - | ||||||||||||
1213 | \value MV_IOS_8_0 iOS 8.0 | - | ||||||||||||
1214 | \value MV_IOS_8_1 iOS 8.1 | - | ||||||||||||
1215 | \value MV_IOS_8_2 iOS 8.2 | - | ||||||||||||
1216 | \value MV_IOS_8_3 iOS 8.3 | - | ||||||||||||
1217 | \value MV_IOS_8_4 iOS 8.4 | - | ||||||||||||
1218 | \value MV_IOS_9_0 iOS 9.0 | - | ||||||||||||
1219 | \value MV_IOS_9_1 iOS 9.1 | - | ||||||||||||
1220 | \value MV_IOS_9_2 iOS 9.2 | - | ||||||||||||
1221 | \value MV_IOS_9_3 iOS 9.3 | - | ||||||||||||
1222 | \value MV_IOS_10_0 iOS 10.0 | - | ||||||||||||
1223 | - | |||||||||||||
1224 | \value MV_None Not a Darwin operating system | - | ||||||||||||
1225 | - | |||||||||||||
1226 | \sa WinVersion | - | ||||||||||||
1227 | */ | - | ||||||||||||
1228 | - | |||||||||||||
1229 | /*! | - | ||||||||||||
1230 | \macro Q_OS_DARWIN | - | ||||||||||||
1231 | \relates <QtGlobal> | - | ||||||||||||
1232 | - | |||||||||||||
1233 | Defined on Darwin-based operating systems such as \macos, iOS, watchOS, and tvOS. | - | ||||||||||||
1234 | */ | - | ||||||||||||
1235 | - | |||||||||||||
1236 | /*! | - | ||||||||||||
1237 | \macro Q_OS_MAC | - | ||||||||||||
1238 | \relates <QtGlobal> | - | ||||||||||||
1239 | - | |||||||||||||
1240 | Deprecated synonym for \c Q_OS_DARWIN. Do not use. | - | ||||||||||||
1241 | */ | - | ||||||||||||
1242 | - | |||||||||||||
1243 | /*! | - | ||||||||||||
1244 | \macro Q_OS_OSX | - | ||||||||||||
1245 | \relates <QtGlobal> | - | ||||||||||||
1246 | - | |||||||||||||
1247 | Deprecated synonym for \c Q_OS_MACOS. Do not use. | - | ||||||||||||
1248 | */ | - | ||||||||||||
1249 | - | |||||||||||||
1250 | /*! | - | ||||||||||||
1251 | \macro Q_OS_MACOS | - | ||||||||||||
1252 | \relates <QtGlobal> | - | ||||||||||||
1253 | - | |||||||||||||
1254 | Defined on \macos. | - | ||||||||||||
1255 | */ | - | ||||||||||||
1256 | - | |||||||||||||
1257 | /*! | - | ||||||||||||
1258 | \macro Q_OS_IOS | - | ||||||||||||
1259 | \relates <QtGlobal> | - | ||||||||||||
1260 | - | |||||||||||||
1261 | Defined on iOS. | - | ||||||||||||
1262 | */ | - | ||||||||||||
1263 | - | |||||||||||||
1264 | /*! | - | ||||||||||||
1265 | \macro Q_OS_WATCHOS | - | ||||||||||||
1266 | \relates <QtGlobal> | - | ||||||||||||
1267 | - | |||||||||||||
1268 | Defined on watchOS. | - | ||||||||||||
1269 | */ | - | ||||||||||||
1270 | - | |||||||||||||
1271 | /*! | - | ||||||||||||
1272 | \macro Q_OS_TVOS | - | ||||||||||||
1273 | \relates <QtGlobal> | - | ||||||||||||
1274 | - | |||||||||||||
1275 | Defined on tvOS. | - | ||||||||||||
1276 | */ | - | ||||||||||||
1277 | - | |||||||||||||
1278 | /*! | - | ||||||||||||
1279 | \macro Q_OS_WIN | - | ||||||||||||
1280 | \relates <QtGlobal> | - | ||||||||||||
1281 | - | |||||||||||||
1282 | Defined on all supported versions of Windows. That is, if | - | ||||||||||||
1283 | \l Q_OS_WIN32, \l Q_OS_WIN64, or \l Q_OS_WINRT is defined. | - | ||||||||||||
1284 | */ | - | ||||||||||||
1285 | - | |||||||||||||
1286 | /*! | - | ||||||||||||
1287 | \macro Q_OS_WIN32 | - | ||||||||||||
1288 | \relates <QtGlobal> | - | ||||||||||||
1289 | - | |||||||||||||
1290 | Defined on 32-bit and 64-bit versions of Windows. | - | ||||||||||||
1291 | */ | - | ||||||||||||
1292 | - | |||||||||||||
1293 | /*! | - | ||||||||||||
1294 | \macro Q_OS_WIN64 | - | ||||||||||||
1295 | \relates <QtGlobal> | - | ||||||||||||
1296 | - | |||||||||||||
1297 | Defined on 64-bit versions of Windows. | - | ||||||||||||
1298 | */ | - | ||||||||||||
1299 | - | |||||||||||||
1300 | /*! | - | ||||||||||||
1301 | \macro Q_OS_WINRT | - | ||||||||||||
1302 | \relates <QtGlobal> | - | ||||||||||||
1303 | - | |||||||||||||
1304 | Defined for Windows Runtime (Windows Store apps) on Windows 8, Windows RT, | - | ||||||||||||
1305 | and Windows Phone 8. | - | ||||||||||||
1306 | */ | - | ||||||||||||
1307 | - | |||||||||||||
1308 | /*! | - | ||||||||||||
1309 | \macro Q_OS_WINPHONE | - | ||||||||||||
1310 | \relates <QtGlobal> | - | ||||||||||||
1311 | - | |||||||||||||
1312 | Defined on Windows Phone 8. | - | ||||||||||||
1313 | */ | - | ||||||||||||
1314 | - | |||||||||||||
1315 | /*! | - | ||||||||||||
1316 | \macro Q_OS_CYGWIN | - | ||||||||||||
1317 | \relates <QtGlobal> | - | ||||||||||||
1318 | - | |||||||||||||
1319 | Defined on Cygwin. | - | ||||||||||||
1320 | */ | - | ||||||||||||
1321 | - | |||||||||||||
1322 | /*! | - | ||||||||||||
1323 | \macro Q_OS_SOLARIS | - | ||||||||||||
1324 | \relates <QtGlobal> | - | ||||||||||||
1325 | - | |||||||||||||
1326 | Defined on Sun Solaris. | - | ||||||||||||
1327 | */ | - | ||||||||||||
1328 | - | |||||||||||||
1329 | /*! | - | ||||||||||||
1330 | \macro Q_OS_HPUX | - | ||||||||||||
1331 | \relates <QtGlobal> | - | ||||||||||||
1332 | - | |||||||||||||
1333 | Defined on HP-UX. | - | ||||||||||||
1334 | */ | - | ||||||||||||
1335 | - | |||||||||||||
1336 | /*! | - | ||||||||||||
1337 | \macro Q_OS_ULTRIX | - | ||||||||||||
1338 | \relates <QtGlobal> | - | ||||||||||||
1339 | - | |||||||||||||
1340 | Defined on DEC Ultrix. | - | ||||||||||||
1341 | */ | - | ||||||||||||
1342 | - | |||||||||||||
1343 | /*! | - | ||||||||||||
1344 | \macro Q_OS_LINUX | - | ||||||||||||
1345 | \relates <QtGlobal> | - | ||||||||||||
1346 | - | |||||||||||||
1347 | Defined on Linux. | - | ||||||||||||
1348 | */ | - | ||||||||||||
1349 | - | |||||||||||||
1350 | /*! | - | ||||||||||||
1351 | \macro Q_OS_ANDROID | - | ||||||||||||
1352 | \relates <QtGlobal> | - | ||||||||||||
1353 | - | |||||||||||||
1354 | Defined on Android. | - | ||||||||||||
1355 | */ | - | ||||||||||||
1356 | - | |||||||||||||
1357 | /*! | - | ||||||||||||
1358 | \macro Q_OS_FREEBSD | - | ||||||||||||
1359 | \relates <QtGlobal> | - | ||||||||||||
1360 | - | |||||||||||||
1361 | Defined on FreeBSD. | - | ||||||||||||
1362 | */ | - | ||||||||||||
1363 | - | |||||||||||||
1364 | /*! | - | ||||||||||||
1365 | \macro Q_OS_NETBSD | - | ||||||||||||
1366 | \relates <QtGlobal> | - | ||||||||||||
1367 | - | |||||||||||||
1368 | Defined on NetBSD. | - | ||||||||||||
1369 | */ | - | ||||||||||||
1370 | - | |||||||||||||
1371 | /*! | - | ||||||||||||
1372 | \macro Q_OS_OPENBSD | - | ||||||||||||
1373 | \relates <QtGlobal> | - | ||||||||||||
1374 | - | |||||||||||||
1375 | Defined on OpenBSD. | - | ||||||||||||
1376 | */ | - | ||||||||||||
1377 | - | |||||||||||||
1378 | /*! | - | ||||||||||||
1379 | \macro Q_OS_BSDI | - | ||||||||||||
1380 | \relates <QtGlobal> | - | ||||||||||||
1381 | - | |||||||||||||
1382 | Defined on BSD/OS. | - | ||||||||||||
1383 | */ | - | ||||||||||||
1384 | - | |||||||||||||
1385 | /*! | - | ||||||||||||
1386 | \macro Q_OS_IRIX | - | ||||||||||||
1387 | \relates <QtGlobal> | - | ||||||||||||
1388 | - | |||||||||||||
1389 | Defined on SGI Irix. | - | ||||||||||||
1390 | */ | - | ||||||||||||
1391 | - | |||||||||||||
1392 | /*! | - | ||||||||||||
1393 | \macro Q_OS_OSF | - | ||||||||||||
1394 | \relates <QtGlobal> | - | ||||||||||||
1395 | - | |||||||||||||
1396 | Defined on HP Tru64 UNIX. | - | ||||||||||||
1397 | */ | - | ||||||||||||
1398 | - | |||||||||||||
1399 | /*! | - | ||||||||||||
1400 | \macro Q_OS_SCO | - | ||||||||||||
1401 | \relates <QtGlobal> | - | ||||||||||||
1402 | - | |||||||||||||
1403 | Defined on SCO OpenServer 5. | - | ||||||||||||
1404 | */ | - | ||||||||||||
1405 | - | |||||||||||||
1406 | /*! | - | ||||||||||||
1407 | \macro Q_OS_UNIXWARE | - | ||||||||||||
1408 | \relates <QtGlobal> | - | ||||||||||||
1409 | - | |||||||||||||
1410 | Defined on UnixWare 7, Open UNIX 8. | - | ||||||||||||
1411 | */ | - | ||||||||||||
1412 | - | |||||||||||||
1413 | /*! | - | ||||||||||||
1414 | \macro Q_OS_AIX | - | ||||||||||||
1415 | \relates <QtGlobal> | - | ||||||||||||
1416 | - | |||||||||||||
1417 | Defined on AIX. | - | ||||||||||||
1418 | */ | - | ||||||||||||
1419 | - | |||||||||||||
1420 | /*! | - | ||||||||||||
1421 | \macro Q_OS_HURD | - | ||||||||||||
1422 | \relates <QtGlobal> | - | ||||||||||||
1423 | - | |||||||||||||
1424 | Defined on GNU Hurd. | - | ||||||||||||
1425 | */ | - | ||||||||||||
1426 | - | |||||||||||||
1427 | /*! | - | ||||||||||||
1428 | \macro Q_OS_DGUX | - | ||||||||||||
1429 | \relates <QtGlobal> | - | ||||||||||||
1430 | - | |||||||||||||
1431 | Defined on DG/UX. | - | ||||||||||||
1432 | */ | - | ||||||||||||
1433 | - | |||||||||||||
1434 | /*! | - | ||||||||||||
1435 | \macro Q_OS_RELIANT | - | ||||||||||||
1436 | \relates <QtGlobal> | - | ||||||||||||
1437 | - | |||||||||||||
1438 | Defined on Reliant UNIX. | - | ||||||||||||
1439 | */ | - | ||||||||||||
1440 | - | |||||||||||||
1441 | /*! | - | ||||||||||||
1442 | \macro Q_OS_DYNIX | - | ||||||||||||
1443 | \relates <QtGlobal> | - | ||||||||||||
1444 | - | |||||||||||||
1445 | Defined on DYNIX/ptx. | - | ||||||||||||
1446 | */ | - | ||||||||||||
1447 | - | |||||||||||||
1448 | /*! | - | ||||||||||||
1449 | \macro Q_OS_QNX | - | ||||||||||||
1450 | \relates <QtGlobal> | - | ||||||||||||
1451 | - | |||||||||||||
1452 | Defined on QNX Neutrino. | - | ||||||||||||
1453 | */ | - | ||||||||||||
1454 | - | |||||||||||||
1455 | /*! | - | ||||||||||||
1456 | \macro Q_OS_LYNX | - | ||||||||||||
1457 | \relates <QtGlobal> | - | ||||||||||||
1458 | - | |||||||||||||
1459 | Defined on LynxOS. | - | ||||||||||||
1460 | */ | - | ||||||||||||
1461 | - | |||||||||||||
1462 | /*! | - | ||||||||||||
1463 | \macro Q_OS_BSD4 | - | ||||||||||||
1464 | \relates <QtGlobal> | - | ||||||||||||
1465 | - | |||||||||||||
1466 | Defined on Any BSD 4.4 system. | - | ||||||||||||
1467 | */ | - | ||||||||||||
1468 | - | |||||||||||||
1469 | /*! | - | ||||||||||||
1470 | \macro Q_OS_UNIX | - | ||||||||||||
1471 | \relates <QtGlobal> | - | ||||||||||||
1472 | - | |||||||||||||
1473 | Defined on Any UNIX BSD/SYSV system. | - | ||||||||||||
1474 | */ | - | ||||||||||||
1475 | - | |||||||||||||
1476 | /*! | - | ||||||||||||
1477 | \macro Q_CC_SYM | - | ||||||||||||
1478 | \relates <QtGlobal> | - | ||||||||||||
1479 | - | |||||||||||||
1480 | Defined if the application is compiled using Digital Mars C/C++ | - | ||||||||||||
1481 | (used to be Symantec C++). | - | ||||||||||||
1482 | */ | - | ||||||||||||
1483 | - | |||||||||||||
1484 | /*! | - | ||||||||||||
1485 | \macro Q_CC_MSVC | - | ||||||||||||
1486 | \relates <QtGlobal> | - | ||||||||||||
1487 | - | |||||||||||||
1488 | Defined if the application is compiled using Microsoft Visual | - | ||||||||||||
1489 | C/C++, Intel C++ for Windows. | - | ||||||||||||
1490 | */ | - | ||||||||||||
1491 | - | |||||||||||||
1492 | /*! | - | ||||||||||||
1493 | \macro Q_CC_BOR | - | ||||||||||||
1494 | \relates <QtGlobal> | - | ||||||||||||
1495 | - | |||||||||||||
1496 | Defined if the application is compiled using Borland/Turbo C++. | - | ||||||||||||
1497 | */ | - | ||||||||||||
1498 | - | |||||||||||||
1499 | /*! | - | ||||||||||||
1500 | \macro Q_CC_WAT | - | ||||||||||||
1501 | \relates <QtGlobal> | - | ||||||||||||
1502 | - | |||||||||||||
1503 | Defined if the application is compiled using Watcom C++. | - | ||||||||||||
1504 | */ | - | ||||||||||||
1505 | - | |||||||||||||
1506 | /*! | - | ||||||||||||
1507 | \macro Q_CC_GNU | - | ||||||||||||
1508 | \relates <QtGlobal> | - | ||||||||||||
1509 | - | |||||||||||||
1510 | Defined if the application is compiled using GNU C++. | - | ||||||||||||
1511 | */ | - | ||||||||||||
1512 | - | |||||||||||||
1513 | /*! | - | ||||||||||||
1514 | \macro Q_CC_COMEAU | - | ||||||||||||
1515 | \relates <QtGlobal> | - | ||||||||||||
1516 | - | |||||||||||||
1517 | Defined if the application is compiled using Comeau C++. | - | ||||||||||||
1518 | */ | - | ||||||||||||
1519 | - | |||||||||||||
1520 | /*! | - | ||||||||||||
1521 | \macro Q_CC_EDG | - | ||||||||||||
1522 | \relates <QtGlobal> | - | ||||||||||||
1523 | - | |||||||||||||
1524 | Defined if the application is compiled using Edison Design Group | - | ||||||||||||
1525 | C++. | - | ||||||||||||
1526 | */ | - | ||||||||||||
1527 | - | |||||||||||||
1528 | /*! | - | ||||||||||||
1529 | \macro Q_CC_OC | - | ||||||||||||
1530 | \relates <QtGlobal> | - | ||||||||||||
1531 | - | |||||||||||||
1532 | Defined if the application is compiled using CenterLine C++. | - | ||||||||||||
1533 | */ | - | ||||||||||||
1534 | - | |||||||||||||
1535 | /*! | - | ||||||||||||
1536 | \macro Q_CC_SUN | - | ||||||||||||
1537 | \relates <QtGlobal> | - | ||||||||||||
1538 | - | |||||||||||||
1539 | Defined if the application is compiled using Forte Developer, or | - | ||||||||||||
1540 | Sun Studio C++. | - | ||||||||||||
1541 | */ | - | ||||||||||||
1542 | - | |||||||||||||
1543 | /*! | - | ||||||||||||
1544 | \macro Q_CC_MIPS | - | ||||||||||||
1545 | \relates <QtGlobal> | - | ||||||||||||
1546 | - | |||||||||||||
1547 | Defined if the application is compiled using MIPSpro C++. | - | ||||||||||||
1548 | */ | - | ||||||||||||
1549 | - | |||||||||||||
1550 | /*! | - | ||||||||||||
1551 | \macro Q_CC_DEC | - | ||||||||||||
1552 | \relates <QtGlobal> | - | ||||||||||||
1553 | - | |||||||||||||
1554 | Defined if the application is compiled using DEC C++. | - | ||||||||||||
1555 | */ | - | ||||||||||||
1556 | - | |||||||||||||
1557 | /*! | - | ||||||||||||
1558 | \macro Q_CC_HPACC | - | ||||||||||||
1559 | \relates <QtGlobal> | - | ||||||||||||
1560 | - | |||||||||||||
1561 | Defined if the application is compiled using HP aC++. | - | ||||||||||||
1562 | */ | - | ||||||||||||
1563 | - | |||||||||||||
1564 | /*! | - | ||||||||||||
1565 | \macro Q_CC_USLC | - | ||||||||||||
1566 | \relates <QtGlobal> | - | ||||||||||||
1567 | - | |||||||||||||
1568 | Defined if the application is compiled using SCO OUDK and UDK. | - | ||||||||||||
1569 | */ | - | ||||||||||||
1570 | - | |||||||||||||
1571 | /*! | - | ||||||||||||
1572 | \macro Q_CC_CDS | - | ||||||||||||
1573 | \relates <QtGlobal> | - | ||||||||||||
1574 | - | |||||||||||||
1575 | Defined if the application is compiled using Reliant C++. | - | ||||||||||||
1576 | */ | - | ||||||||||||
1577 | - | |||||||||||||
1578 | /*! | - | ||||||||||||
1579 | \macro Q_CC_KAI | - | ||||||||||||
1580 | \relates <QtGlobal> | - | ||||||||||||
1581 | - | |||||||||||||
1582 | Defined if the application is compiled using KAI C++. | - | ||||||||||||
1583 | */ | - | ||||||||||||
1584 | - | |||||||||||||
1585 | /*! | - | ||||||||||||
1586 | \macro Q_CC_INTEL | - | ||||||||||||
1587 | \relates <QtGlobal> | - | ||||||||||||
1588 | - | |||||||||||||
1589 | Defined if the application is compiled using Intel C++ for Linux, | - | ||||||||||||
1590 | Intel C++ for Windows. | - | ||||||||||||
1591 | */ | - | ||||||||||||
1592 | - | |||||||||||||
1593 | /*! | - | ||||||||||||
1594 | \macro Q_CC_HIGHC | - | ||||||||||||
1595 | \relates <QtGlobal> | - | ||||||||||||
1596 | - | |||||||||||||
1597 | Defined if the application is compiled using MetaWare High C/C++. | - | ||||||||||||
1598 | */ | - | ||||||||||||
1599 | - | |||||||||||||
1600 | /*! | - | ||||||||||||
1601 | \macro Q_CC_PGI | - | ||||||||||||
1602 | \relates <QtGlobal> | - | ||||||||||||
1603 | - | |||||||||||||
1604 | Defined if the application is compiled using Portland Group C++. | - | ||||||||||||
1605 | */ | - | ||||||||||||
1606 | - | |||||||||||||
1607 | /*! | - | ||||||||||||
1608 | \macro Q_CC_GHS | - | ||||||||||||
1609 | \relates <QtGlobal> | - | ||||||||||||
1610 | - | |||||||||||||
1611 | Defined if the application is compiled using Green Hills | - | ||||||||||||
1612 | Optimizing C++ Compilers. | - | ||||||||||||
1613 | */ | - | ||||||||||||
1614 | - | |||||||||||||
1615 | /*! | - | ||||||||||||
1616 | \macro Q_PROCESSOR_ALPHA | - | ||||||||||||
1617 | \relates <QtGlobal> | - | ||||||||||||
1618 | - | |||||||||||||
1619 | Defined if the application is compiled for Alpha processors. | - | ||||||||||||
1620 | - | |||||||||||||
1621 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1622 | */ | - | ||||||||||||
1623 | - | |||||||||||||
1624 | /*! | - | ||||||||||||
1625 | \macro Q_PROCESSOR_ARM | - | ||||||||||||
1626 | \relates <QtGlobal> | - | ||||||||||||
1627 | - | |||||||||||||
1628 | Defined if the application is compiled for ARM processors. Qt currently | - | ||||||||||||
1629 | supports three optional ARM revisions: \l Q_PROCESSOR_ARM_V5, \l | - | ||||||||||||
1630 | Q_PROCESSOR_ARM_V6, and \l Q_PROCESSOR_ARM_V7. | - | ||||||||||||
1631 | - | |||||||||||||
1632 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1633 | */ | - | ||||||||||||
1634 | /*! | - | ||||||||||||
1635 | \macro Q_PROCESSOR_ARM_V5 | - | ||||||||||||
1636 | \relates <QtGlobal> | - | ||||||||||||
1637 | - | |||||||||||||
1638 | Defined if the application is compiled for ARMv5 processors. The \l | - | ||||||||||||
1639 | Q_PROCESSOR_ARM macro is also defined when Q_PROCESSOR_ARM_V5 is defined. | - | ||||||||||||
1640 | - | |||||||||||||
1641 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1642 | */ | - | ||||||||||||
1643 | /*! | - | ||||||||||||
1644 | \macro Q_PROCESSOR_ARM_V6 | - | ||||||||||||
1645 | \relates <QtGlobal> | - | ||||||||||||
1646 | - | |||||||||||||
1647 | Defined if the application is compiled for ARMv6 processors. The \l | - | ||||||||||||
1648 | Q_PROCESSOR_ARM and \l Q_PROCESSOR_ARM_V5 macros are also defined when | - | ||||||||||||
1649 | Q_PROCESSOR_ARM_V6 is defined. | - | ||||||||||||
1650 | - | |||||||||||||
1651 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1652 | */ | - | ||||||||||||
1653 | /*! | - | ||||||||||||
1654 | \macro Q_PROCESSOR_ARM_V7 | - | ||||||||||||
1655 | \relates <QtGlobal> | - | ||||||||||||
1656 | - | |||||||||||||
1657 | Defined if the application is compiled for ARMv7 processors. The \l | - | ||||||||||||
1658 | Q_PROCESSOR_ARM, \l Q_PROCESSOR_ARM_V5, and \l Q_PROCESSOR_ARM_V6 macros | - | ||||||||||||
1659 | are also defined when Q_PROCESSOR_ARM_V7 is defined. | - | ||||||||||||
1660 | - | |||||||||||||
1661 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1662 | */ | - | ||||||||||||
1663 | - | |||||||||||||
1664 | /*! | - | ||||||||||||
1665 | \macro Q_PROCESSOR_AVR32 | - | ||||||||||||
1666 | \relates <QtGlobal> | - | ||||||||||||
1667 | - | |||||||||||||
1668 | Defined if the application is compiled for AVR32 processors. | - | ||||||||||||
1669 | - | |||||||||||||
1670 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1671 | */ | - | ||||||||||||
1672 | - | |||||||||||||
1673 | /*! | - | ||||||||||||
1674 | \macro Q_PROCESSOR_BLACKFIN | - | ||||||||||||
1675 | \relates <QtGlobal> | - | ||||||||||||
1676 | - | |||||||||||||
1677 | Defined if the application is compiled for Blackfin processors. | - | ||||||||||||
1678 | - | |||||||||||||
1679 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1680 | */ | - | ||||||||||||
1681 | - | |||||||||||||
1682 | /*! | - | ||||||||||||
1683 | \macro Q_PROCESSOR_IA64 | - | ||||||||||||
1684 | \relates <QtGlobal> | - | ||||||||||||
1685 | - | |||||||||||||
1686 | Defined if the application is compiled for IA-64 processors. This includes | - | ||||||||||||
1687 | all Itanium and Itanium 2 processors. | - | ||||||||||||
1688 | - | |||||||||||||
1689 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1690 | */ | - | ||||||||||||
1691 | - | |||||||||||||
1692 | /*! | - | ||||||||||||
1693 | \macro Q_PROCESSOR_MIPS | - | ||||||||||||
1694 | \relates <QtGlobal> | - | ||||||||||||
1695 | - | |||||||||||||
1696 | Defined if the application is compiled for MIPS processors. Qt currently | - | ||||||||||||
1697 | supports seven MIPS revisions: \l Q_PROCESSOR_MIPS_I, \l | - | ||||||||||||
1698 | Q_PROCESSOR_MIPS_II, \l Q_PROCESSOR_MIPS_III, \l Q_PROCESSOR_MIPS_IV, \l | - | ||||||||||||
1699 | Q_PROCESSOR_MIPS_V, \l Q_PROCESSOR_MIPS_32, and \l Q_PROCESSOR_MIPS_64. | - | ||||||||||||
1700 | - | |||||||||||||
1701 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1702 | */ | - | ||||||||||||
1703 | /*! | - | ||||||||||||
1704 | \macro Q_PROCESSOR_MIPS_I | - | ||||||||||||
1705 | \relates <QtGlobal> | - | ||||||||||||
1706 | - | |||||||||||||
1707 | Defined if the application is compiled for MIPS-I processors. The \l | - | ||||||||||||
1708 | Q_PROCESSOR_MIPS macro is also defined when Q_PROCESSOR_MIPS_I is defined. | - | ||||||||||||
1709 | - | |||||||||||||
1710 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1711 | */ | - | ||||||||||||
1712 | /*! | - | ||||||||||||
1713 | \macro Q_PROCESSOR_MIPS_II | - | ||||||||||||
1714 | \relates <QtGlobal> | - | ||||||||||||
1715 | - | |||||||||||||
1716 | Defined if the application is compiled for MIPS-II processors. The \l | - | ||||||||||||
1717 | Q_PROCESSOR_MIPS and \l Q_PROCESSOR_MIPS_I macros are also defined when | - | ||||||||||||
1718 | Q_PROCESSOR_MIPS_II is defined. | - | ||||||||||||
1719 | - | |||||||||||||
1720 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1721 | */ | - | ||||||||||||
1722 | /*! | - | ||||||||||||
1723 | \macro Q_PROCESSOR_MIPS_32 | - | ||||||||||||
1724 | \relates <QtGlobal> | - | ||||||||||||
1725 | - | |||||||||||||
1726 | Defined if the application is compiled for MIPS32 processors. The \l | - | ||||||||||||
1727 | Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, and \l Q_PROCESSOR_MIPS_II macros | - | ||||||||||||
1728 | are also defined when Q_PROCESSOR_MIPS_32 is defined. | - | ||||||||||||
1729 | - | |||||||||||||
1730 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1731 | */ | - | ||||||||||||
1732 | /*! | - | ||||||||||||
1733 | \macro Q_PROCESSOR_MIPS_III | - | ||||||||||||
1734 | \relates <QtGlobal> | - | ||||||||||||
1735 | - | |||||||||||||
1736 | Defined if the application is compiled for MIPS-III processors. The \l | - | ||||||||||||
1737 | Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, and \l Q_PROCESSOR_MIPS_II macros | - | ||||||||||||
1738 | are also defined when Q_PROCESSOR_MIPS_III is defined. | - | ||||||||||||
1739 | - | |||||||||||||
1740 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1741 | */ | - | ||||||||||||
1742 | /*! | - | ||||||||||||
1743 | \macro Q_PROCESSOR_MIPS_IV | - | ||||||||||||
1744 | \relates <QtGlobal> | - | ||||||||||||
1745 | - | |||||||||||||
1746 | Defined if the application is compiled for MIPS-IV processors. The \l | - | ||||||||||||
1747 | Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, and \l | - | ||||||||||||
1748 | Q_PROCESSOR_MIPS_III macros are also defined when Q_PROCESSOR_MIPS_IV is | - | ||||||||||||
1749 | defined. | - | ||||||||||||
1750 | - | |||||||||||||
1751 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1752 | */ | - | ||||||||||||
1753 | /*! | - | ||||||||||||
1754 | \macro Q_PROCESSOR_MIPS_V | - | ||||||||||||
1755 | \relates <QtGlobal> | - | ||||||||||||
1756 | - | |||||||||||||
1757 | Defined if the application is compiled for MIPS-V processors. The \l | - | ||||||||||||
1758 | Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, \l | - | ||||||||||||
1759 | Q_PROCESSOR_MIPS_III, and \l Q_PROCESSOR_MIPS_IV macros are also defined | - | ||||||||||||
1760 | when Q_PROCESSOR_MIPS_V is defined. | - | ||||||||||||
1761 | - | |||||||||||||
1762 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1763 | */ | - | ||||||||||||
1764 | /*! | - | ||||||||||||
1765 | \macro Q_PROCESSOR_MIPS_64 | - | ||||||||||||
1766 | \relates <QtGlobal> | - | ||||||||||||
1767 | - | |||||||||||||
1768 | Defined if the application is compiled for MIPS64 processors. The \l | - | ||||||||||||
1769 | Q_PROCESSOR_MIPS, \l Q_PROCESSOR_MIPS_I, \l Q_PROCESSOR_MIPS_II, \l | - | ||||||||||||
1770 | Q_PROCESSOR_MIPS_III, \l Q_PROCESSOR_MIPS_IV, and \l Q_PROCESSOR_MIPS_V | - | ||||||||||||
1771 | macros are also defined when Q_PROCESSOR_MIPS_64 is defined. | - | ||||||||||||
1772 | - | |||||||||||||
1773 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1774 | */ | - | ||||||||||||
1775 | - | |||||||||||||
1776 | /*! | - | ||||||||||||
1777 | \macro Q_PROCESSOR_POWER | - | ||||||||||||
1778 | \relates <QtGlobal> | - | ||||||||||||
1779 | - | |||||||||||||
1780 | Defined if the application is compiled for POWER processors. Qt currently | - | ||||||||||||
1781 | supports two Power variants: \l Q_PROCESSOR_POWER_32 and \l | - | ||||||||||||
1782 | Q_PROCESSOR_POWER_64. | - | ||||||||||||
1783 | - | |||||||||||||
1784 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1785 | */ | - | ||||||||||||
1786 | /*! | - | ||||||||||||
1787 | \macro Q_PROCESSOR_POWER_32 | - | ||||||||||||
1788 | \relates <QtGlobal> | - | ||||||||||||
1789 | - | |||||||||||||
1790 | Defined if the application is compiled for 32-bit Power processors. The \l | - | ||||||||||||
1791 | Q_PROCESSOR_POWER macro is also defined when Q_PROCESSOR_POWER_32 is | - | ||||||||||||
1792 | defined. | - | ||||||||||||
1793 | - | |||||||||||||
1794 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1795 | */ | - | ||||||||||||
1796 | /*! | - | ||||||||||||
1797 | \macro Q_PROCESSOR_POWER_64 | - | ||||||||||||
1798 | \relates <QtGlobal> | - | ||||||||||||
1799 | - | |||||||||||||
1800 | Defined if the application is compiled for 64-bit Power processors. The \l | - | ||||||||||||
1801 | Q_PROCESSOR_POWER macro is also defined when Q_PROCESSOR_POWER_64 is | - | ||||||||||||
1802 | defined. | - | ||||||||||||
1803 | - | |||||||||||||
1804 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1805 | */ | - | ||||||||||||
1806 | - | |||||||||||||
1807 | /*! | - | ||||||||||||
1808 | \macro Q_PROCESSOR_S390 | - | ||||||||||||
1809 | \relates <QtGlobal> | - | ||||||||||||
1810 | - | |||||||||||||
1811 | Defined if the application is compiled for S/390 processors. Qt supports | - | ||||||||||||
1812 | one optional variant of S/390: Q_PROCESSOR_S390_X. | - | ||||||||||||
1813 | - | |||||||||||||
1814 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1815 | */ | - | ||||||||||||
1816 | /*! | - | ||||||||||||
1817 | \macro Q_PROCESSOR_S390_X | - | ||||||||||||
1818 | \relates <QtGlobal> | - | ||||||||||||
1819 | - | |||||||||||||
1820 | Defined if the application is compiled for S/390x processors. The \l | - | ||||||||||||
1821 | Q_PROCESSOR_S390 macro is also defined when Q_PROCESSOR_S390_X is defined. | - | ||||||||||||
1822 | - | |||||||||||||
1823 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1824 | */ | - | ||||||||||||
1825 | - | |||||||||||||
1826 | /*! | - | ||||||||||||
1827 | \macro Q_PROCESSOR_SH | - | ||||||||||||
1828 | \relates <QtGlobal> | - | ||||||||||||
1829 | - | |||||||||||||
1830 | Defined if the application is compiled for SuperH processors. Qt currently | - | ||||||||||||
1831 | supports one SuperH revision: \l Q_PROCESSOR_SH_4A. | - | ||||||||||||
1832 | - | |||||||||||||
1833 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1834 | */ | - | ||||||||||||
1835 | /*! | - | ||||||||||||
1836 | \macro Q_PROCESSOR_SH_4A | - | ||||||||||||
1837 | \relates <QtGlobal> | - | ||||||||||||
1838 | - | |||||||||||||
1839 | Defined if the application is compiled for SuperH 4A processors. The \l | - | ||||||||||||
1840 | Q_PROCESSOR_SH macro is also defined when Q_PROCESSOR_SH_4A is defined. | - | ||||||||||||
1841 | - | |||||||||||||
1842 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1843 | */ | - | ||||||||||||
1844 | - | |||||||||||||
1845 | /*! | - | ||||||||||||
1846 | \macro Q_PROCESSOR_SPARC | - | ||||||||||||
1847 | \relates <QtGlobal> | - | ||||||||||||
1848 | - | |||||||||||||
1849 | Defined if the application is compiled for SPARC processors. Qt currently | - | ||||||||||||
1850 | supports one optional SPARC revision: \l Q_PROCESSOR_SPARC_V9. | - | ||||||||||||
1851 | - | |||||||||||||
1852 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1853 | */ | - | ||||||||||||
1854 | /*! | - | ||||||||||||
1855 | \macro Q_PROCESSOR_SPARC_V9 | - | ||||||||||||
1856 | \relates <QtGlobal> | - | ||||||||||||
1857 | - | |||||||||||||
1858 | Defined if the application is compiled for SPARC V9 processors. The \l | - | ||||||||||||
1859 | Q_PROCESSOR_SPARC macro is also defined when Q_PROCESSOR_SPARC_V9 is | - | ||||||||||||
1860 | defined. | - | ||||||||||||
1861 | - | |||||||||||||
1862 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1863 | */ | - | ||||||||||||
1864 | - | |||||||||||||
1865 | /*! | - | ||||||||||||
1866 | \macro Q_PROCESSOR_X86 | - | ||||||||||||
1867 | \relates <QtGlobal> | - | ||||||||||||
1868 | - | |||||||||||||
1869 | Defined if the application is compiled for x86 processors. Qt currently | - | ||||||||||||
1870 | supports two x86 variants: \l Q_PROCESSOR_X86_32 and \l Q_PROCESSOR_X86_64. | - | ||||||||||||
1871 | - | |||||||||||||
1872 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1873 | */ | - | ||||||||||||
1874 | /*! | - | ||||||||||||
1875 | \macro Q_PROCESSOR_X86_32 | - | ||||||||||||
1876 | \relates <QtGlobal> | - | ||||||||||||
1877 | - | |||||||||||||
1878 | Defined if the application is compiled for 32-bit x86 processors. This | - | ||||||||||||
1879 | includes all i386, i486, i586, and i686 processors. The \l Q_PROCESSOR_X86 | - | ||||||||||||
1880 | macro is also defined when Q_PROCESSOR_X86_32 is defined. | - | ||||||||||||
1881 | - | |||||||||||||
1882 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1883 | */ | - | ||||||||||||
1884 | /*! | - | ||||||||||||
1885 | \macro Q_PROCESSOR_X86_64 | - | ||||||||||||
1886 | \relates <QtGlobal> | - | ||||||||||||
1887 | - | |||||||||||||
1888 | Defined if the application is compiled for 64-bit x86 processors. This | - | ||||||||||||
1889 | includes all AMD64, Intel 64, and other x86_64/x64 processors. The \l | - | ||||||||||||
1890 | Q_PROCESSOR_X86 macro is also defined when Q_PROCESSOR_X86_64 is defined. | - | ||||||||||||
1891 | - | |||||||||||||
1892 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
1893 | */ | - | ||||||||||||
1894 | - | |||||||||||||
1895 | /*! | - | ||||||||||||
1896 | \macro QT_DISABLE_DEPRECATED_BEFORE | - | ||||||||||||
1897 | \relates <QtGlobal> | - | ||||||||||||
1898 | - | |||||||||||||
1899 | This macro can be defined in the project file to disable functions deprecated in | - | ||||||||||||
1900 | a specified version of Qt or any earlier version. The default version number is 5.0, | - | ||||||||||||
1901 | meaning that functions deprecated in or before Qt 5.0 will not be included. | - | ||||||||||||
1902 | - | |||||||||||||
1903 | Examples: | - | ||||||||||||
1904 | When using a future release of Qt 5, set QT_DISABLE_DEPRECATED_BEFORE=0x050100 to | - | ||||||||||||
1905 | disable functions deprecated in Qt 5.1 and earlier. In any release, set | - | ||||||||||||
1906 | QT_DISABLE_DEPRECATED_BEFORE=0x000000 to enable any functions, including the ones | - | ||||||||||||
1907 | deprecated in Qt 5.0 | - | ||||||||||||
1908 | */ | - | ||||||||||||
1909 | - | |||||||||||||
1910 | #if defined(QT_BUILD_QMAKE) | - | ||||||||||||
1911 | // needed to bootstrap qmake | - | ||||||||||||
1912 | static const unsigned int qt_one = 1; | - | ||||||||||||
1913 | const int QSysInfo::ByteOrder = ((*((unsigned char *) &qt_one) == 0) ? BigEndian : LittleEndian); | - | ||||||||||||
1914 | #endif | - | ||||||||||||
1915 | - | |||||||||||||
1916 | #if defined(Q_OS_MAC) | - | ||||||||||||
1917 | - | |||||||||||||
1918 | QT_BEGIN_INCLUDE_NAMESPACE | - | ||||||||||||
1919 | #include "private/qcore_mac_p.h" | - | ||||||||||||
1920 | #include "qnamespace.h" | - | ||||||||||||
1921 | QT_END_INCLUDE_NAMESPACE | - | ||||||||||||
1922 | - | |||||||||||||
1923 | QSysInfo::MacVersion QSysInfo::macVersion() | - | ||||||||||||
1924 | { | - | ||||||||||||
1925 | const QAppleOperatingSystemVersion version = qt_apple_os_version(); // qtcore_mac_objc.mm | - | ||||||||||||
1926 | #if defined(Q_OS_OSX) | - | ||||||||||||
1927 | return QSysInfo::MacVersion(Q_MV_OSX(version.major, version.minor)); | - | ||||||||||||
1928 | #elif defined(Q_OS_IOS) | - | ||||||||||||
1929 | return QSysInfo::MacVersion(Q_MV_IOS(version.major, version.minor)); | - | ||||||||||||
1930 | #else | - | ||||||||||||
1931 | return QSysInfo::MV_Unknown; | - | ||||||||||||
1932 | #endif | - | ||||||||||||
1933 | } | - | ||||||||||||
1934 | const QSysInfo::MacVersion QSysInfo::MacintoshVersion = QSysInfo::macVersion(); | - | ||||||||||||
1935 | - | |||||||||||||
1936 | #elif defined(Q_OS_WIN) || defined(Q_OS_CYGWIN) || defined(Q_OS_WINCE) || defined(Q_OS_WINRT) | - | ||||||||||||
1937 | - | |||||||||||||
1938 | QT_BEGIN_INCLUDE_NAMESPACE | - | ||||||||||||
1939 | #include "qt_windows.h" | - | ||||||||||||
1940 | QT_END_INCLUDE_NAMESPACE | - | ||||||||||||
1941 | - | |||||||||||||
1942 | # ifndef QT_BOOTSTRAPPED | - | ||||||||||||
1943 | class QWindowsSockInit | - | ||||||||||||
1944 | { | - | ||||||||||||
1945 | public: | - | ||||||||||||
1946 | QWindowsSockInit(); | - | ||||||||||||
1947 | ~QWindowsSockInit(); | - | ||||||||||||
1948 | int version; | - | ||||||||||||
1949 | }; | - | ||||||||||||
1950 | - | |||||||||||||
1951 | QWindowsSockInit::QWindowsSockInit() | - | ||||||||||||
1952 | : version(0) | - | ||||||||||||
1953 | { | - | ||||||||||||
1954 | //### should we try for 2.2 on all platforms ?? | - | ||||||||||||
1955 | WSAData wsadata; | - | ||||||||||||
1956 | - | |||||||||||||
1957 | // IPv6 requires Winsock v2.0 or better. | - | ||||||||||||
1958 | if (WSAStartup(MAKEWORD(2,0), &wsadata) != 0) { | - | ||||||||||||
1959 | qWarning("QTcpSocketAPI: WinSock v2.0 initialization failed."); | - | ||||||||||||
1960 | } else { | - | ||||||||||||
1961 | version = 0x20; | - | ||||||||||||
1962 | } | - | ||||||||||||
1963 | } | - | ||||||||||||
1964 | - | |||||||||||||
1965 | QWindowsSockInit::~QWindowsSockInit() | - | ||||||||||||
1966 | { | - | ||||||||||||
1967 | WSACleanup(); | - | ||||||||||||
1968 | } | - | ||||||||||||
1969 | Q_GLOBAL_STATIC(QWindowsSockInit, winsockInit) | - | ||||||||||||
1970 | # endif // QT_BOOTSTRAPPED | - | ||||||||||||
1971 | - | |||||||||||||
1972 | #ifdef Q_OS_WINRT | - | ||||||||||||
1973 | static inline HMODULE moduleHandleForFunction(LPCVOID address) | - | ||||||||||||
1974 | { | - | ||||||||||||
1975 | // This is a widely used, decades-old technique for retrieving the handle | - | ||||||||||||
1976 | // of a module and is effectively equivalent to GetModuleHandleEx | - | ||||||||||||
1977 | // (which is unavailable on WinRT) | - | ||||||||||||
1978 | MEMORY_BASIC_INFORMATION mbi = { 0, 0, 0, 0, 0, 0, 0 }; | - | ||||||||||||
1979 | if (VirtualQuery(address, &mbi, sizeof(mbi)) == 0) | - | ||||||||||||
1980 | return 0; | - | ||||||||||||
1981 | return reinterpret_cast<HMODULE>(mbi.AllocationBase); | - | ||||||||||||
1982 | } | - | ||||||||||||
1983 | #endif | - | ||||||||||||
1984 | - | |||||||||||||
1985 | static inline OSVERSIONINFO winOsVersionOSVERSIONINFOEX determineWinOsVersion() | - | ||||||||||||
1986 | { | - | ||||||||||||
1987 | OSVERSIONINFOOSVERSIONINFOEX result = { sizeof(OSVERSIONINFOOSVERSIONINFOEX), 0, 0, 0, 0, {'\0'}};}, 0, 0, 0, 0, 0}; | - | ||||||||||||
1988 | - | |||||||||||||
1989 | #ifndef Q_OS_WINCE | - | ||||||||||||
1990 | #define GetProcAddressA GetProcAddress | - | ||||||||||||
1991 | #endif | - | ||||||||||||
1992 | - | |||||||||||||
1993 | // GetModuleHandle is not supported in WinRT and linking to it at load time | - | ||||||||||||
1994 | // will not pass the Windows App Certification Kit... but it exists and is functional, | - | ||||||||||||
1995 | // so use some unusual but widely used techniques to get a pointer to it | - | ||||||||||||
1996 | #ifdef Q_OS_WINRT | - | ||||||||||||
1997 | // 1. Get HMODULE of kernel32.dll, using the address of some function exported by that DLL | - | ||||||||||||
1998 | HMODULE kernelModule = moduleHandleForFunction(reinterpret_cast<LPCVOID>(VirtualQuery)); | - | ||||||||||||
1999 | if (Q_UNLIKELY(!kernelModule)) | - | ||||||||||||
2000 | return result; | - | ||||||||||||
2001 | - | |||||||||||||
2002 | // 2. Get pointer to GetModuleHandle so we can then load other arbitrary modules (DLLs) | - | ||||||||||||
2003 | typedef HMODULE(WINAPI *GetModuleHandleFunction)(LPCWSTR); | - | ||||||||||||
2004 | GetModuleHandleFunction pGetModuleHandle = reinterpret_cast<GetModuleHandleFunction>( | - | ||||||||||||
2005 | GetProcAddressA(kernelModule, "GetModuleHandleW")); | - | ||||||||||||
2006 | if (Q_UNLIKELY(!pGetModuleHandle)) | - | ||||||||||||
2007 | return result; | - | ||||||||||||
2008 | #else | - | ||||||||||||
2009 | #define pGetModuleHandle GetModuleHandleW | - | ||||||||||||
2010 | #endif | - | ||||||||||||
2011 | - | |||||||||||||
2012 | #ifndef Q_OS_WINCE | - | ||||||||||||
2013 | HMODULE ntdll = pGetModuleHandle(L"ntdll.dll"); | - | ||||||||||||
2014 | if (Q_UNLIKELY(!ntdll)) | - | ||||||||||||
2015 | return result; | - | ||||||||||||
2016 | - | |||||||||||||
2017 | // NTSTATUS is not defined on WinRT | - | ||||||||||||
2018 | typedef LONG NTSTATUS; | - | ||||||||||||
2019 | typedef NTSTATUS (NTAPI *RtlGetVersionFunction)(LPOSVERSIONINFO); | - | ||||||||||||
2020 | - | |||||||||||||
2021 | // RtlGetVersion is documented public API but we must load it dynamically | - | ||||||||||||
2022 | // because linking to it at load time will not pass the Windows App Certification Kit | - | ||||||||||||
2023 | // https://msdn.microsoft.com/en-us/library/windows/hardware/ff561910.aspx | - | ||||||||||||
2024 | RtlGetVersionFunction pRtlGetVersion = reinterpret_cast<RtlGetVersionFunction>( | - | ||||||||||||
2025 | GetProcAddressA(ntdll, "RtlGetVersion")); | - | ||||||||||||
2026 | if (Q_UNLIKELY(!pRtlGetVersion)) | - | ||||||||||||
2027 | return result; | - | ||||||||||||
2028 | - | |||||||||||||
2029 | // GetVersionEx() has been deprecated in Windows 8.1 and will return | - | ||||||||||||
2030 | // only Windows 8 from that version on, so use the kernel API function. | - | ||||||||||||
2031 | pRtlGetVersion(((LPOSVERSIONINFO) &result); // always returns STATUS_SUCCESS | - | ||||||||||||
2032 | #else // !Q_OS_WINCE | - | ||||||||||||
2033 | GetVersionEx(&result); | - | ||||||||||||
2034 | #endif | - | ||||||||||||
2035 | return result; | - | ||||||||||||
2036 | } | - | ||||||||||||
2037 | - | |||||||||||||
2038 | static OSVERSIONINFOEX winOsVersion() | - | ||||||||||||
2039 | { | - | ||||||||||||
2040 | static OSVERSIONINFOEX result = determineWinOsVersion(); | - | ||||||||||||
2041 | return result; | - | ||||||||||||
2042 | } | - | ||||||||||||
2043 | - | |||||||||||||
2044 | QSysInfo::WinVersion QSysInfo::windowsVersion() | - | ||||||||||||
2045 | { | - | ||||||||||||
2046 | #ifndef VER_PLATFORM_WIN32s | - | ||||||||||||
2047 | #define VER_PLATFORM_WIN32s 0 | - | ||||||||||||
2048 | #endif | - | ||||||||||||
2049 | #ifndef VER_PLATFORM_WIN32_WINDOWS | - | ||||||||||||
2050 | #define VER_PLATFORM_WIN32_WINDOWS 1 | - | ||||||||||||
2051 | #endif | - | ||||||||||||
2052 | #ifndef VER_PLATFORM_WIN32_NT | - | ||||||||||||
2053 | #define VER_PLATFORM_WIN32_NT 2 | - | ||||||||||||
2054 | #endif | - | ||||||||||||
2055 | #ifndef VER_PLATFORM_WIN32_CE | - | ||||||||||||
2056 | #define VER_PLATFORM_WIN32_CE 3 | - | ||||||||||||
2057 | #endif | - | ||||||||||||
2058 | - | |||||||||||||
2059 | static QSysInfo::WinVersion winver; | - | ||||||||||||
2060 | if (winver) | - | ||||||||||||
2061 | return winver; | - | ||||||||||||
2062 | winver = QSysInfo::WV_NT; | - | ||||||||||||
2063 | const OSVERSIONINFOOSVERSIONINFOEX osver = winOsVersion(); | - | ||||||||||||
2064 | if (osver.dwMajorVersion == 0) | - | ||||||||||||
2065 | return QSysInfo::WV_None; | - | ||||||||||||
2066 | #ifdef Q_OS_WINCE | - | ||||||||||||
2067 | DWORD qt_cever = 0; | - | ||||||||||||
2068 | qt_cever = osver.dwMajorVersion * 100; | - | ||||||||||||
2069 | qt_cever += osver.dwMinorVersion * 10; | - | ||||||||||||
2070 | #endif | - | ||||||||||||
2071 | switch (osver.dwPlatformId) { | - | ||||||||||||
2072 | case VER_PLATFORM_WIN32s: | - | ||||||||||||
2073 | winver = QSysInfo::WV_32s; | - | ||||||||||||
2074 | break; | - | ||||||||||||
2075 | case VER_PLATFORM_WIN32_WINDOWS: | - | ||||||||||||
2076 | // We treat Windows Me (minor 90) the same as Windows 98 | - | ||||||||||||
2077 | if (osver.dwMinorVersion == 90) | - | ||||||||||||
2078 | winver = QSysInfo::WV_Me; | - | ||||||||||||
2079 | else if (osver.dwMinorVersion == 10) | - | ||||||||||||
2080 | winver = QSysInfo::WV_98; | - | ||||||||||||
2081 | else | - | ||||||||||||
2082 | winver = QSysInfo::WV_95; | - | ||||||||||||
2083 | break; | - | ||||||||||||
2084 | #ifdef Q_OS_WINCE | - | ||||||||||||
2085 | case VER_PLATFORM_WIN32_CE: | - | ||||||||||||
2086 | if (qt_cever >= 600) | - | ||||||||||||
2087 | winver = QSysInfo::WV_CE_6; | - | ||||||||||||
2088 | if (qt_cever >= 500) | - | ||||||||||||
2089 | winver = QSysInfo::WV_CE_5; | - | ||||||||||||
2090 | else if (qt_cever >= 400) | - | ||||||||||||
2091 | winver = QSysInfo::WV_CENET; | - | ||||||||||||
2092 | else | - | ||||||||||||
2093 | winver = QSysInfo::WV_CE; | - | ||||||||||||
2094 | break; | - | ||||||||||||
2095 | #endif | - | ||||||||||||
2096 | default: // VER_PLATFORM_WIN32_NT | - | ||||||||||||
2097 | if (osver.dwMajorVersion < 5) { | - | ||||||||||||
2098 | winver = QSysInfo::WV_NT; | - | ||||||||||||
2099 | } else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0) { | - | ||||||||||||
2100 | winver = QSysInfo::WV_2000; | - | ||||||||||||
2101 | } else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 1) { | - | ||||||||||||
2102 | winver = QSysInfo::WV_XP; | - | ||||||||||||
2103 | } else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 2) { | - | ||||||||||||
2104 | winver = QSysInfo::WV_2003; | - | ||||||||||||
2105 | } else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 0) { | - | ||||||||||||
2106 | winver = QSysInfo::WV_VISTA; | - | ||||||||||||
2107 | } else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 1) { | - | ||||||||||||
2108 | winver = QSysInfo::WV_WINDOWS7; | - | ||||||||||||
2109 | } else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 2) { | - | ||||||||||||
2110 | winver = QSysInfo::WV_WINDOWS8; | - | ||||||||||||
2111 | } else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 3) { | - | ||||||||||||
2112 | winver = QSysInfo::WV_WINDOWS8_1; | - | ||||||||||||
2113 | } else if (osver.dwMajorVersion == 10 && osver.dwMinorVersion == 0) { | - | ||||||||||||
2114 | winver = QSysInfo::WV_WINDOWS10; | - | ||||||||||||
2115 | } else { | - | ||||||||||||
2116 | winver = QSysInfo::WV_NT_based; | - | ||||||||||||
2117 | } | - | ||||||||||||
2118 | } | - | ||||||||||||
2119 | - | |||||||||||||
2120 | #ifdef QT_DEBUG | - | ||||||||||||
2121 | { | - | ||||||||||||
2122 | if (Q_UNLIKELY(qEnvironmentVariableIsSet("QT_WINVER_OVERRIDE"))) { | - | ||||||||||||
2123 | const QByteArray winVerOverride = qgetenv("QT_WINVER_OVERRIDE"); | - | ||||||||||||
2124 | if (winVerOverride == "NT") | - | ||||||||||||
2125 | winver = QSysInfo::WV_NT; | - | ||||||||||||
2126 | else if (winVerOverride == "2000") | - | ||||||||||||
2127 | winver = QSysInfo::WV_2000; | - | ||||||||||||
2128 | else if (winVerOverride == "2003") | - | ||||||||||||
2129 | winver = QSysInfo::WV_2003; | - | ||||||||||||
2130 | else if (winVerOverride == "XP") | - | ||||||||||||
2131 | winver = QSysInfo::WV_XP; | - | ||||||||||||
2132 | else if (winVerOverride == "VISTA") | - | ||||||||||||
2133 | winver = QSysInfo::WV_VISTA; | - | ||||||||||||
2134 | else if (winVerOverride == "WINDOWS7") | - | ||||||||||||
2135 | winver = QSysInfo::WV_WINDOWS7; | - | ||||||||||||
2136 | else if (winVerOverride == "WINDOWS8") | - | ||||||||||||
2137 | winver = QSysInfo::WV_WINDOWS8; | - | ||||||||||||
2138 | else if (winVerOverride == "WINDOWS8_1") | - | ||||||||||||
2139 | winver = QSysInfo::WV_WINDOWS8_1; | - | ||||||||||||
2140 | else if (winVerOverride == "WINDOWS10") | - | ||||||||||||
2141 | winver = QSysInfo::WV_WINDOWS10; | - | ||||||||||||
2142 | } | - | ||||||||||||
2143 | } | - | ||||||||||||
2144 | #endif | - | ||||||||||||
2145 | - | |||||||||||||
2146 | return winver; | - | ||||||||||||
2147 | } | - | ||||||||||||
2148 | - | |||||||||||||
2149 | static QString winSp_helper() | - | ||||||||||||
2150 | { | - | ||||||||||||
2151 | const qint16 major = winOsVersion().wServicePackMajor; | - | ||||||||||||
2152 | if (major) { | - | ||||||||||||
2153 | QString sp = QStringLiteral(" SP ") + QString::number(major); | - | ||||||||||||
2154 | const qint16 minor = winOsVersion().wServicePackMinor; | - | ||||||||||||
2155 | if (minor) | - | ||||||||||||
2156 | sp += QLatin1Char('.') + QString::number(minor); | - | ||||||||||||
2157 | - | |||||||||||||
2158 | return sp; | - | ||||||||||||
2159 | } | - | ||||||||||||
2160 | return QString(); | - | ||||||||||||
2161 | } | - | ||||||||||||
2162 | - | |||||||||||||
2163 | static const char *winVer_helper() | - | ||||||||||||
2164 | { | - | ||||||||||||
2165 | const bool workstation = winOsVersion().wProductType == VER_NT_WORKSTATION; | - | ||||||||||||
2166 | - | |||||||||||||
2167 | switch (int(QSysInfo::WindowsVersion)) { | - | ||||||||||||
2168 | case QSysInfo::WV_NT: | - | ||||||||||||
2169 | return "NT"; | - | ||||||||||||
2170 | case QSysInfo::WV_2000: | - | ||||||||||||
2171 | return "2000"; | - | ||||||||||||
2172 | case QSysInfo::WV_XP: | - | ||||||||||||
2173 | return "XP"; | - | ||||||||||||
2174 | case QSysInfo::WV_2003: | - | ||||||||||||
2175 | return "2003"; | - | ||||||||||||
2176 | case QSysInfo::WV_VISTA: | - | ||||||||||||
2177 | return workstation ? "Vista" : "Server 2008"; | - | ||||||||||||
2178 | case QSysInfo::WV_WINDOWS7: | - | ||||||||||||
2179 | return workstation ? "7" : "Server 2008 R2"; | - | ||||||||||||
2180 | case QSysInfo::WV_WINDOWS8: | - | ||||||||||||
2181 | return workstation ? "8" : "Server 2012"; | - | ||||||||||||
2182 | case QSysInfo::WV_WINDOWS8_1: | - | ||||||||||||
2183 | return workstation ? "8.1" : "Server 2012 R2"; | - | ||||||||||||
2184 | case QSysInfo::WV_WINDOWS10: | - | ||||||||||||
2185 | return workstation ? "10" : "Server 2016"; | - | ||||||||||||
2186 | - | |||||||||||||
2187 | case QSysInfo::WV_CE: | - | ||||||||||||
2188 | return "CE"; | - | ||||||||||||
2189 | case QSysInfo::WV_CENET: | - | ||||||||||||
2190 | return "CENET"; | - | ||||||||||||
2191 | case QSysInfo::WV_CE_5: | - | ||||||||||||
2192 | return "CE5"; | - | ||||||||||||
2193 | case QSysInfo::WV_CE_6: | - | ||||||||||||
2194 | return "CE6"; | - | ||||||||||||
2195 | } | - | ||||||||||||
2196 | // unknown, future version | - | ||||||||||||
2197 | return 0; | - | ||||||||||||
2198 | } | - | ||||||||||||
2199 | - | |||||||||||||
2200 | const QSysInfo::WinVersion QSysInfo::WindowsVersion = QSysInfo::windowsVersion(); | - | ||||||||||||
2201 | - | |||||||||||||
2202 | #endif | - | ||||||||||||
2203 | #if defined(Q_OS_UNIX) | - | ||||||||||||
2204 | # if (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || defined(Q_OS_FREEBSD) | - | ||||||||||||
2205 | # define USE_ETC_OS_RELEASE | - | ||||||||||||
2206 | struct QUnixOSVersion | - | ||||||||||||
2207 | { | - | ||||||||||||
2208 | // from /etc/os-release older /etc/lsb-release // redhat /etc/redhat-release // debian /etc/debian_version | - | ||||||||||||
2209 | QString productType; // $ID $DISTRIB_ID // single line file containing: // Debian | - | ||||||||||||
2210 | QString productVersion; // $VERSION_ID $DISTRIB_RELEASE // <Vendor_ID release Version_ID> // single line file <Release_ID/sid> | - | ||||||||||||
2211 | QString prettyName; // $PRETTY_NAME $DISTRIB_DESCRIPTION | - | ||||||||||||
2212 | }; | - | ||||||||||||
2213 | - | |||||||||||||
2214 | static QString unquote(const char *begin, const char *end) | - | ||||||||||||
2215 | { | - | ||||||||||||
2216 | if (*begin == '"') { | - | ||||||||||||
2217 | Q_ASSERT(end[-1] == '"'); | - | ||||||||||||
2218 | return QString::fromLatin1(begin + 1, end - begin - 2); | - | ||||||||||||
2219 | } | - | ||||||||||||
2220 | return QString::fromLatin1(begin, end - begin); | - | ||||||||||||
2221 | } | - | ||||||||||||
2222 | static QByteArray getEtcFileContent(const char *filename) | - | ||||||||||||
2223 | { | - | ||||||||||||
2224 | // we're avoiding QFile here | - | ||||||||||||
2225 | int fd = qt_safe_open(filename, O_RDONLY); | - | ||||||||||||
2226 | if (fd == -1) | - | ||||||||||||
2227 | return QByteArray(); | - | ||||||||||||
2228 | - | |||||||||||||
2229 | QT_STATBUF sbuf; | - | ||||||||||||
2230 | if (QT_FSTAT(fd, &sbuf) == -1) { | - | ||||||||||||
2231 | qt_safe_close(fd); | - | ||||||||||||
2232 | return QByteArray(); | - | ||||||||||||
2233 | } | - | ||||||||||||
2234 | - | |||||||||||||
2235 | QByteArray buffer(sbuf.st_size, Qt::Uninitialized); | - | ||||||||||||
2236 | buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size)); | - | ||||||||||||
2237 | qt_safe_close(fd); | - | ||||||||||||
2238 | return buffer; | - | ||||||||||||
2239 | } | - | ||||||||||||
2240 | - | |||||||||||||
2241 | static bool readEtcFile(QUnixOSVersion &v, const char *filename, | - | ||||||||||||
2242 | const QByteArray &idKey, const QByteArray &versionKey, const QByteArray &prettyNameKey) | - | ||||||||||||
2243 | { | - | ||||||||||||
2244 | - | |||||||||||||
2245 | QByteArray buffer = getEtcFileContent(filename); | - | ||||||||||||
2246 | if (buffer.isEmpty()) | - | ||||||||||||
2247 | return false; | - | ||||||||||||
2248 | - | |||||||||||||
2249 | const char *ptr = buffer.constData(); | - | ||||||||||||
2250 | const char *end = buffer.constEnd(); | - | ||||||||||||
2251 | const char *eol; | - | ||||||||||||
2252 | QByteArray line; | - | ||||||||||||
2253 | for ( ; ptr != end; ptr = eol + 1) { | - | ||||||||||||
2254 | // find the end of the line after ptr | - | ||||||||||||
2255 | eol = static_cast<const char *>(memchr(ptr, '\n', end - ptr)); | - | ||||||||||||
2256 | if (!eol) | - | ||||||||||||
2257 | eol = end - 1; | - | ||||||||||||
2258 | line.setRawData(ptr, eol - ptr); | - | ||||||||||||
2259 | - | |||||||||||||
2260 | if (line.startsWith(idKey)) { | - | ||||||||||||
2261 | ptr += idKey.length(); | - | ||||||||||||
2262 | v.productType = unquote(ptr, eol); | - | ||||||||||||
2263 | continue; | - | ||||||||||||
2264 | } | - | ||||||||||||
2265 | - | |||||||||||||
2266 | if (line.startsWith(prettyNameKey)) { | - | ||||||||||||
2267 | ptr += prettyNameKey.length(); | - | ||||||||||||
2268 | v.prettyName = unquote(ptr, eol); | - | ||||||||||||
2269 | continue; | - | ||||||||||||
2270 | } | - | ||||||||||||
2271 | - | |||||||||||||
2272 | if (line.startsWith(versionKey)) { | - | ||||||||||||
2273 | ptr += versionKey.length(); | - | ||||||||||||
2274 | v.productVersion = unquote(ptr, eol); | - | ||||||||||||
2275 | continue; | - | ||||||||||||
2276 | } | - | ||||||||||||
2277 | } | - | ||||||||||||
2278 | - | |||||||||||||
2279 | return true; | - | ||||||||||||
2280 | } | - | ||||||||||||
2281 | - | |||||||||||||
2282 | static bool readEtcOsRelease(QUnixOSVersion &v) | - | ||||||||||||
2283 | { | - | ||||||||||||
2284 | return readEtcFile(v, "/etc/os-release", QByteArrayLiteral("ID="), | - | ||||||||||||
2285 | QByteArrayLiteral("VERSION_ID="), QByteArrayLiteral("PRETTY_NAME=")); | - | ||||||||||||
2286 | } | - | ||||||||||||
2287 | - | |||||||||||||
2288 | static bool readEtcLsbRelease(QUnixOSVersion &v) | - | ||||||||||||
2289 | { | - | ||||||||||||
2290 | bool ok = readEtcFile(v, "/etc/lsb-release", QByteArrayLiteral("DISTRIB_ID="), | - | ||||||||||||
2291 | QByteArrayLiteral("DISTRIB_RELEASE="), QByteArrayLiteral("DISTRIB_DESCRIPTION=")); | - | ||||||||||||
2292 | if (ok && (v.prettyName.isEmpty() || v.prettyName == v.productType)) { | - | ||||||||||||
2293 | // some distributions have redundant information for the pretty name, | - | ||||||||||||
2294 | // so try /etc/<lowercasename>-release | - | ||||||||||||
2295 | - | |||||||||||||
2296 | // we're still avoiding QFile here | - | ||||||||||||
2297 | QByteArray distrorelease = "/etc/" + v.productType.toLatin1().toLower() + "-release"; | - | ||||||||||||
2298 | int fd = qt_safe_open(distrorelease, O_RDONLY); | - | ||||||||||||
2299 | if (fd != -1) { | - | ||||||||||||
2300 | QT_STATBUF sbuf; | - | ||||||||||||
2301 | if (QT_FSTAT(fd, &sbuf) != -1 && sbuf.st_size > v.prettyName.length()) { | - | ||||||||||||
2302 | // file apparently contains interesting information | - | ||||||||||||
2303 | QByteArray buffer(sbuf.st_size, Qt::Uninitialized); | - | ||||||||||||
2304 | buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size)); | - | ||||||||||||
2305 | v.prettyName = QString::fromLatin1(buffer.trimmed()); | - | ||||||||||||
2306 | } | - | ||||||||||||
2307 | qt_safe_close(fd); | - | ||||||||||||
2308 | } | - | ||||||||||||
2309 | } | - | ||||||||||||
2310 | - | |||||||||||||
2311 | // some distributions have a /etc/lsb-release file that does not provide the values | - | ||||||||||||
2312 | // we are looking for, i.e. DISTRIB_ID, DISTRIB_RELEASE and DISTRIB_DESCRIPTION. | - | ||||||||||||
2313 | // Assuming that neither DISTRIB_ID nor DISTRIB_RELEASE were found, or contained valid values, | - | ||||||||||||
2314 | // returning false for readEtcLsbRelease will allow further /etc/<lowercasename>-release parsing. | - | ||||||||||||
2315 | return ok && !(v.productType.isEmpty() && v.productVersion.isEmpty()); | - | ||||||||||||
2316 | } | - | ||||||||||||
2317 | - | |||||||||||||
2318 | #if defined(Q_OS_LINUX) | - | ||||||||||||
2319 | static QByteArray getEtcFileFirstLine(const char *fileName) | - | ||||||||||||
2320 | { | - | ||||||||||||
2321 | QByteArray buffer = getEtcFileContent(fileName); | - | ||||||||||||
2322 | if (buffer.isEmpty()) | - | ||||||||||||
2323 | return QByteArray(); | - | ||||||||||||
2324 | - | |||||||||||||
2325 | const char *ptr = buffer.constData(); | - | ||||||||||||
2326 | int eol = buffer.indexOf("\n"); | - | ||||||||||||
2327 | return QByteArray(ptr, eol).trimmed(); | - | ||||||||||||
2328 | } | - | ||||||||||||
2329 | - | |||||||||||||
2330 | static bool readEtcRedHatRelease(QUnixOSVersion &v) | - | ||||||||||||
2331 | { | - | ||||||||||||
2332 | // /etc/redhat-release analysed should be a one line file | - | ||||||||||||
2333 | // the format of its content is <Vendor_ID release Version> | - | ||||||||||||
2334 | // i.e. "Red Hat Enterprise Linux Workstation release 6.5 (Santiago)" | - | ||||||||||||
2335 | QByteArray line = getEtcFileFirstLine("/etc/redhat-release"); | - | ||||||||||||
2336 | if (line.isEmpty()) | - | ||||||||||||
2337 | return false; | - | ||||||||||||
2338 | - | |||||||||||||
2339 | v.prettyName = QString::fromLatin1(line); | - | ||||||||||||
2340 | - | |||||||||||||
2341 | const char keyword[] = "release "; | - | ||||||||||||
2342 | int releaseIndex = line.indexOf(keyword); | - | ||||||||||||
2343 | v.productType = QString::fromLatin1(line.mid(0, releaseIndex)).remove(QLatin1Char(' ')); | - | ||||||||||||
2344 | int spaceIndex = line.indexOf(' ', releaseIndex + strlen(keyword)); | - | ||||||||||||
2345 | v.productVersion = QString::fromLatin1(line.mid(releaseIndex + strlen(keyword), | - | ||||||||||||
2346 | spaceIndex > -1 ? spaceIndex - releaseIndex - int(strlen(keyword)) : -1)); | - | ||||||||||||
2347 | return true; | - | ||||||||||||
2348 | } | - | ||||||||||||
2349 | - | |||||||||||||
2350 | static bool readEtcDebianVersion(QUnixOSVersion &v) | - | ||||||||||||
2351 | { | - | ||||||||||||
2352 | // /etc/debian_version analysed should be a one line file | - | ||||||||||||
2353 | // the format of its content is <Release_ID/sid> | - | ||||||||||||
2354 | // i.e. "jessie/sid" | - | ||||||||||||
2355 | QByteArray line = getEtcFileFirstLine("/etc/debian_version"); | - | ||||||||||||
2356 | if (line.isEmpty()) | - | ||||||||||||
2357 | return false; | - | ||||||||||||
2358 | - | |||||||||||||
2359 | v.productType = QStringLiteral("Debian"); | - | ||||||||||||
2360 | v.productVersion = QString::fromLatin1(line); | - | ||||||||||||
2361 | return true; | - | ||||||||||||
2362 | } | - | ||||||||||||
2363 | #endif | - | ||||||||||||
2364 | - | |||||||||||||
2365 | static bool findUnixOsVersion(QUnixOSVersion &v) | - | ||||||||||||
2366 | { | - | ||||||||||||
2367 | if (readEtcOsRelease(v)) | - | ||||||||||||
2368 | return true; | - | ||||||||||||
2369 | if (readEtcLsbRelease(v)) | - | ||||||||||||
2370 | return true; | - | ||||||||||||
2371 | #if defined(Q_OS_LINUX) | - | ||||||||||||
2372 | if (readEtcRedHatRelease(v)) | - | ||||||||||||
2373 | return true; | - | ||||||||||||
2374 | if (readEtcDebianVersion(v)) | - | ||||||||||||
2375 | return true; | - | ||||||||||||
2376 | #endif | - | ||||||||||||
2377 | return false; | - | ||||||||||||
2378 | } | - | ||||||||||||
2379 | # endif // USE_ETC_OS_RELEASE | - | ||||||||||||
2380 | #endif // Q_OS_UNIX | - | ||||||||||||
2381 | - | |||||||||||||
2382 | - | |||||||||||||
2383 | /*! | - | ||||||||||||
2384 | \since 5.4 | - | ||||||||||||
2385 | - | |||||||||||||
2386 | Returns the architecture of the CPU that Qt was compiled for, in text | - | ||||||||||||
2387 | format. Note that this may not match the actual CPU that the application is | - | ||||||||||||
2388 | running on if there's an emulation layer or if the CPU supports multiple | - | ||||||||||||
2389 | architectures (like x86-64 processors supporting i386 applications). To | - | ||||||||||||
2390 | detect that, use currentCpuArchitecture(). | - | ||||||||||||
2391 | - | |||||||||||||
2392 | Values returned by this function are stable and will not change over time, | - | ||||||||||||
2393 | so applications can rely on the returned value as an identifier, except | - | ||||||||||||
2394 | that new CPU types may be added over time. | - | ||||||||||||
2395 | - | |||||||||||||
2396 | Typical returned values are (note: list not exhaustive): | - | ||||||||||||
2397 | \list | - | ||||||||||||
2398 | \li "arm" | - | ||||||||||||
2399 | \li "arm64" | - | ||||||||||||
2400 | \li "i386" | - | ||||||||||||
2401 | \li "ia64" | - | ||||||||||||
2402 | \li "mips" | - | ||||||||||||
2403 | \li "mips64" | - | ||||||||||||
2404 | \li "power" | - | ||||||||||||
2405 | \li "power64" | - | ||||||||||||
2406 | \li "sparc" | - | ||||||||||||
2407 | \li "sparcv9" | - | ||||||||||||
2408 | \li "x86_64" | - | ||||||||||||
2409 | \endlist | - | ||||||||||||
2410 | - | |||||||||||||
2411 | \sa QSysInfo::buildAbi(), QSysInfo::currentCpuArchitecture() | - | ||||||||||||
2412 | */ | - | ||||||||||||
2413 | QString QSysInfo::buildCpuArchitecture() | - | ||||||||||||
2414 | { | - | ||||||||||||
2415 | return QStringLiteral(ARCH_PROCESSOR); | - | ||||||||||||
2416 | } | - | ||||||||||||
2417 | - | |||||||||||||
2418 | /*! | - | ||||||||||||
2419 | \since 5.4 | - | ||||||||||||
2420 | - | |||||||||||||
2421 | Returns the architecture of the CPU that the application is running on, in | - | ||||||||||||
2422 | text format. Note that this function depends on what the OS will report and | - | ||||||||||||
2423 | may not detect the actual CPU architecture if the OS hides that information | - | ||||||||||||
2424 | or is unable to provide it. For example, a 32-bit OS running on a 64-bit | - | ||||||||||||
2425 | CPU is usually unable to determine the CPU is actually capable of running | - | ||||||||||||
2426 | 64-bit programs. | - | ||||||||||||
2427 | - | |||||||||||||
2428 | Values returned by this function are mostly stable: an attempt will be made | - | ||||||||||||
2429 | to ensure that they stay constant over time and match the values returned | - | ||||||||||||
2430 | by QSysInfo::builldCpuArchitecture(). However, due to the nature of the | - | ||||||||||||
2431 | operating system functions being used, there may be discrepancies. | - | ||||||||||||
2432 | - | |||||||||||||
2433 | Typical returned values are (note: list not exhaustive): | - | ||||||||||||
2434 | \list | - | ||||||||||||
2435 | \li "arm" | - | ||||||||||||
2436 | \li "arm64" | - | ||||||||||||
2437 | \li "i386" | - | ||||||||||||
2438 | \li "ia64" | - | ||||||||||||
2439 | \li "mips" | - | ||||||||||||
2440 | \li "mips64" | - | ||||||||||||
2441 | \li "power" | - | ||||||||||||
2442 | \li "power64" | - | ||||||||||||
2443 | \li "sparc" | - | ||||||||||||
2444 | \li "sparcv9" | - | ||||||||||||
2445 | \li "x86_64" | - | ||||||||||||
2446 | \endlist | - | ||||||||||||
2447 | - | |||||||||||||
2448 | \sa QSysInfo::buildAbi(), QSysInfo::buildCpuArchitecture() | - | ||||||||||||
2449 | */ | - | ||||||||||||
2450 | QString QSysInfo::currentCpuArchitecture() | - | ||||||||||||
2451 | { | - | ||||||||||||
2452 | #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) | - | ||||||||||||
2453 | // We don't need to catch all the CPU architectures in this function; | - | ||||||||||||
2454 | // only those where the host CPU might be different than the build target | - | ||||||||||||
2455 | // (usually, 64-bit platforms). | - | ||||||||||||
2456 | SYSTEM_INFO info; | - | ||||||||||||
2457 | GetNativeSystemInfo(&info); | - | ||||||||||||
2458 | switch (info.wProcessorArchitecture) { | - | ||||||||||||
2459 | # ifdef PROCESSOR_ARCHITECTURE_AMD64 | - | ||||||||||||
2460 | case PROCESSOR_ARCHITECTURE_AMD64: | - | ||||||||||||
2461 | return QStringLiteral("x86_64"); | - | ||||||||||||
2462 | # endif | - | ||||||||||||
2463 | # ifdef PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 | - | ||||||||||||
2464 | case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: | - | ||||||||||||
2465 | # endif | - | ||||||||||||
2466 | case PROCESSOR_ARCHITECTURE_IA64: | - | ||||||||||||
2467 | return QStringLiteral("ia64"); | - | ||||||||||||
2468 | } | - | ||||||||||||
2469 | #elif defined(Q_OS_UNIX) | - | ||||||||||||
2470 | long ret = -1; | - | ||||||||||||
2471 | struct utsname u; | - | ||||||||||||
2472 | - | |||||||||||||
2473 | # if defined(Q_OS_SOLARIS) | - | ||||||||||||
2474 | // We need a special call for Solaris because uname(2) on x86 returns "i86pc" for | - | ||||||||||||
2475 | // both 32- and 64-bit CPUs. Reference: | - | ||||||||||||
2476 | // http://docs.oracle.com/cd/E18752_01/html/816-5167/sysinfo-2.html#REFMAN2sysinfo-2 | - | ||||||||||||
2477 | // http://fxr.watson.org/fxr/source/common/syscall/systeminfo.c?v=OPENSOLARIS | - | ||||||||||||
2478 | // http://fxr.watson.org/fxr/source/common/conf/param.c?v=OPENSOLARIS;im=10#L530 | - | ||||||||||||
2479 | if (ret == -1) | - | ||||||||||||
2480 | ret = sysinfo(SI_ARCHITECTURE_64, u.machine, sizeof u.machine); | - | ||||||||||||
2481 | # endif | - | ||||||||||||
2482 | - | |||||||||||||
2483 | if (ret == -1) | - | ||||||||||||
2484 | ret = uname(&u); | - | ||||||||||||
2485 | - | |||||||||||||
2486 | // we could use detectUnixVersion() above, but we only need a field no other function does | - | ||||||||||||
2487 | if (ret != -1) { | - | ||||||||||||
2488 | // the use of QT_BUILD_INTERNAL here is simply to ensure all branches build | - | ||||||||||||
2489 | // as we don't often build on some of the less common platforms | - | ||||||||||||
2490 | # if defined(Q_PROCESSOR_ARM) || defined(QT_BUILD_INTERNAL) | - | ||||||||||||
2491 | if (strcmp(u.machine, "aarch64") == 0) | - | ||||||||||||
2492 | return QStringLiteral("arm64"); | - | ||||||||||||
2493 | if (strncmp(u.machine, "armv", 4) == 0) | - | ||||||||||||
2494 | return QStringLiteral("arm"); | - | ||||||||||||
2495 | # endif | - | ||||||||||||
2496 | # if defined(Q_PROCESSOR_POWER) || defined(QT_BUILD_INTERNAL) | - | ||||||||||||
2497 | // harmonize "powerpc" and "ppc" to "power" | - | ||||||||||||
2498 | if (strncmp(u.machine, "ppc", 3) == 0) | - | ||||||||||||
2499 | return QLatin1String("power") + QLatin1String(u.machine + 3); | - | ||||||||||||
2500 | if (strncmp(u.machine, "powerpc", 7) == 0) | - | ||||||||||||
2501 | return QLatin1String("power") + QLatin1String(u.machine + 7); | - | ||||||||||||
2502 | if (strcmp(u.machine, "Power Macintosh") == 0) | - | ||||||||||||
2503 | return QLatin1String("power"); | - | ||||||||||||
2504 | # endif | - | ||||||||||||
2505 | # if defined(Q_PROCESSOR_SPARC) || defined(QT_BUILD_INTERNAL) | - | ||||||||||||
2506 | // Solaris sysinfo(2) (above) uses "sparcv9", but uname -m says "sun4u"; | - | ||||||||||||
2507 | // Linux says "sparc64" | - | ||||||||||||
2508 | if (strcmp(u.machine, "sun4u") == 0 || strcmp(u.machine, "sparc64") == 0) | - | ||||||||||||
2509 | return QStringLiteral("sparcv9"); | - | ||||||||||||
2510 | if (strcmp(u.machine, "sparc32") == 0) | - | ||||||||||||
2511 | return QStringLiteral("sparc"); | - | ||||||||||||
2512 | # endif | - | ||||||||||||
2513 | # if defined(Q_PROCESSOR_X86) || defined(QT_BUILD_INTERNAL) | - | ||||||||||||
2514 | // harmonize all "i?86" to "i386" | - | ||||||||||||
2515 | if (strlen(u.machine) == 4 && u.machine[0] == 'i' | - | ||||||||||||
2516 | && u.machine[2] == '8' && u.machine[3] == '6') | - | ||||||||||||
2517 | return QStringLiteral("i386"); | - | ||||||||||||
2518 | if (strcmp(u.machine, "amd64") == 0) // Solaris | - | ||||||||||||
2519 | return QStringLiteral("x86_64"); | - | ||||||||||||
2520 | # endif | - | ||||||||||||
2521 | return QString::fromLatin1(u.machine); | - | ||||||||||||
2522 | } | - | ||||||||||||
2523 | #endif | - | ||||||||||||
2524 | return buildCpuArchitecture(); | - | ||||||||||||
2525 | } | - | ||||||||||||
2526 | - | |||||||||||||
2527 | /*! | - | ||||||||||||
2528 | \since 5.4 | - | ||||||||||||
2529 | - | |||||||||||||
2530 | Returns the full architecture string that Qt was compiled for. This string | - | ||||||||||||
2531 | is useful for identifying different, incompatible builds. For example, it | - | ||||||||||||
2532 | can be used as an identifier to request an upgrade package from a server. | - | ||||||||||||
2533 | - | |||||||||||||
2534 | The values returned from this function are kept stable as follows: the | - | ||||||||||||
2535 | mandatory components of the result will not change in future versions of | - | ||||||||||||
2536 | Qt, but optional suffixes may be added. | - | ||||||||||||
2537 | - | |||||||||||||
2538 | The returned value is composed of three or more parts, separated by dashes | - | ||||||||||||
2539 | ("-"). They are: | - | ||||||||||||
2540 | - | |||||||||||||
2541 | \table | - | ||||||||||||
2542 | \header \li Component \li Value | - | ||||||||||||
2543 | \row \li CPU Architecture \li The same as QSysInfo::buildCpuArchitecture(), such as "arm", "i386", "mips" or "x86_64" | - | ||||||||||||
2544 | \row \li Endianness \li "little_endian" or "big_endian" | - | ||||||||||||
2545 | \row \li Word size \li Whether it's a 32- or 64-bit application. Possible values are: | - | ||||||||||||
2546 | "llp64" (Windows 64-bit), "lp64" (Unix 64-bit), "ilp32" (32-bit) | - | ||||||||||||
2547 | \row \li (Optional) ABI \li Zero or more components identifying different ABIs possible in this architecture. | - | ||||||||||||
2548 | Currently, Qt has optional ABI components for ARM and MIPS processors: one | - | ||||||||||||
2549 | component is the main ABI (such as "eabi", "o32", "n32", "o64"); another is | - | ||||||||||||
2550 | whether the calling convention is using hardware floating point registers ("hardfloat" | - | ||||||||||||
2551 | is present). | - | ||||||||||||
2552 | - | |||||||||||||
2553 | Additionally, if Qt was configured with \c{-qreal float}, the ABI option tag "qreal_float" | - | ||||||||||||
2554 | will be present. If Qt was configured with another type as qreal, that type is present after | - | ||||||||||||
2555 | "qreal_", with all characters other than letters and digits escaped by an underscore, followed | - | ||||||||||||
2556 | by two hex digits. For example, \c{-qreal long double} becomes "qreal_long_20double". | - | ||||||||||||
2557 | \endtable | - | ||||||||||||
2558 | - | |||||||||||||
2559 | \sa QSysInfo::buildCpuArchitecture() | - | ||||||||||||
2560 | */ | - | ||||||||||||
2561 | QString QSysInfo::buildAbi() | - | ||||||||||||
2562 | { | - | ||||||||||||
2563 | #ifdef Q_COMPILER_UNICODE_STRINGS | - | ||||||||||||
2564 | // ARCH_FULL is a concatenation of strings (incl. ARCH_PROCESSOR), which breaks | - | ||||||||||||
2565 | // QStringLiteral on MSVC. Since the concatenation behavior we want is specified | - | ||||||||||||
2566 | // the same C++11 paper as the Unicode strings, we'll use that macro and hope | - | ||||||||||||
2567 | // that Microsoft implements the new behavior when they add support for Unicode strings. | - | ||||||||||||
2568 | return QStringLiteral(ARCH_FULL); | - | ||||||||||||
2569 | #else | - | ||||||||||||
2570 | return QLatin1String(ARCH_FULL); | - | ||||||||||||
2571 | #endif | - | ||||||||||||
2572 | } | - | ||||||||||||
2573 | - | |||||||||||||
2574 | static QString unknownText() | - | ||||||||||||
2575 | { | - | ||||||||||||
2576 | return QStringLiteral("unknown"); | - | ||||||||||||
2577 | } | - | ||||||||||||
2578 | - | |||||||||||||
2579 | /*! | - | ||||||||||||
2580 | \since 5.4 | - | ||||||||||||
2581 | - | |||||||||||||
2582 | Returns the type of the operating system kernel Qt was compiled for. It's | - | ||||||||||||
2583 | also the kernel the application is running on, unless the host operating | - | ||||||||||||
2584 | system is running a form of compatibility or virtualization layer. | - | ||||||||||||
2585 | - | |||||||||||||
2586 | Values returned by this function are stable and will not change over time, | - | ||||||||||||
2587 | so applications can rely on the returned value as an identifier, except | - | ||||||||||||
2588 | that new OS kernel types may be added over time. | - | ||||||||||||
2589 | - | |||||||||||||
2590 | On Windows, this function returns the type of Windows kernel, like "winnt". | - | ||||||||||||
2591 | On Unix systems, it returns the same as the output of \c{uname | - | ||||||||||||
2592 | -s} (lowercased). | - | ||||||||||||
2593 | - | |||||||||||||
2594 | \note This function may return surprising values: it returns "linux" | - | ||||||||||||
2595 | for all operating systems running Linux (including Android), "qnx" for all | - | ||||||||||||
2596 | operating systems running QNX, "freebsd" for | - | ||||||||||||
2597 | Debian/kFreeBSD, and "darwin" for \macos and iOS. For information on the type | - | ||||||||||||
2598 | of product the application is running on, see productType(). | - | ||||||||||||
2599 | - | |||||||||||||
2600 | \sa QFileSelector, kernelVersion(), productType(), productVersion(), prettyProductName() | - | ||||||||||||
2601 | */ | - | ||||||||||||
2602 | QString QSysInfo::kernelType() | - | ||||||||||||
2603 | { | - | ||||||||||||
2604 | #if defined(Q_OS_WINCE) | - | ||||||||||||
2605 | return QStringLiteral("wince"); | - | ||||||||||||
2606 | #elif defined(Q_OS_WIN) | - | ||||||||||||
2607 | return QStringLiteral("winnt"); | - | ||||||||||||
2608 | #elif defined(Q_OS_UNIX) | - | ||||||||||||
2609 | struct utsname u; | - | ||||||||||||
2610 | if (uname(&u) == 0) | - | ||||||||||||
2611 | return QString::fromLatin1(u.sysname).toLower(); | - | ||||||||||||
2612 | #endif | - | ||||||||||||
2613 | return unknownText(); | - | ||||||||||||
2614 | } | - | ||||||||||||
2615 | - | |||||||||||||
2616 | /*! | - | ||||||||||||
2617 | \since 5.4 | - | ||||||||||||
2618 | - | |||||||||||||
2619 | Returns the release version of the operating system kernel. On Windows, it | - | ||||||||||||
2620 | returns the version of the NT or CE kernel. On Unix systems, including | - | ||||||||||||
2621 | Android and \macos, it returns the same as the \c{uname -r} | - | ||||||||||||
2622 | command would return. | - | ||||||||||||
2623 | - | |||||||||||||
2624 | If the version could not be determined, this function may return an empty | - | ||||||||||||
2625 | string. | - | ||||||||||||
2626 | - | |||||||||||||
2627 | \sa kernelType(), productType(), productVersion(), prettyProductName() | - | ||||||||||||
2628 | */ | - | ||||||||||||
2629 | QString QSysInfo::kernelVersion() | - | ||||||||||||
2630 | { | - | ||||||||||||
2631 | #ifdef Q_OS_WIN | - | ||||||||||||
2632 | const OSVERSIONINFOOSVERSIONINFOEX osver = winOsVersion(); | - | ||||||||||||
2633 | return QString::number(int(osver.dwMajorVersion)) + QLatin1Char('.') + QString::number(int(osver.dwMinorVersion)) | - | ||||||||||||
2634 | + QLatin1Char('.') + QString::number(int(osver.dwBuildNumber)); | - | ||||||||||||
2635 | #else | - | ||||||||||||
2636 | struct utsname u; | - | ||||||||||||
2637 | if (uname(&u) == 0)
| 0-1 | ||||||||||||
2638 | return QString::fromLatin1(u.release); executed 1 time by 1 test: return QString::fromLatin1(u.release); Executed by:
| 1 | ||||||||||||
2639 | return QString(); never executed: return QString(); | 0 | ||||||||||||
2640 | #endif | - | ||||||||||||
2641 | } | - | ||||||||||||
2642 | - | |||||||||||||
2643 | - | |||||||||||||
2644 | /*! | - | ||||||||||||
2645 | \since 5.4 | - | ||||||||||||
2646 | - | |||||||||||||
2647 | Returns the product name of the operating system this application is | - | ||||||||||||
2648 | running in. If the application is running on some sort of emulation or | - | ||||||||||||
2649 | virtualization layer (such as WINE on a Unix system), this function will | - | ||||||||||||
2650 | inspect the emulation / virtualization layer. | - | ||||||||||||
2651 | - | |||||||||||||
2652 | Values returned by this function are stable and will not change over time, | - | ||||||||||||
2653 | so applications can rely on the returned value as an identifier, except | - | ||||||||||||
2654 | that new OS types may be added over time. | - | ||||||||||||
2655 | - | |||||||||||||
2656 | \b{Linux and Android note}: this function returns "android" for Linux | - | ||||||||||||
2657 | systems running Android userspace, notably when using the Bionic library. | - | ||||||||||||
2658 | For all other Linux systems, regardless of C library being used, it tries | - | ||||||||||||
2659 | to determine the distribution name and returns that. If determining the | - | ||||||||||||
2660 | distribution name failed, it returns "unknown". | - | ||||||||||||
2661 | - | |||||||||||||
2662 | \b{Darwin, \macos and iOS note}: this function returns "macos" for macOS | - | ||||||||||||
2663 | systems, "ios" for iOS systems and "darwin" in case the system could not be | - | ||||||||||||
2664 | determined. | - | ||||||||||||
2665 | - | |||||||||||||
2666 | \b{OS X note}: this function returns "osx" for versions of \macos prior to 10.12. | - | ||||||||||||
2667 | - | |||||||||||||
2668 | \b{FreeBSD note}: this function returns "debian" for Debian/kFreeBSD and | - | ||||||||||||
2669 | "unknown" otherwise. | - | ||||||||||||
2670 | - | |||||||||||||
2671 | \b{Windows note}: this function returns "winphone" for builds for Windows | - | ||||||||||||
2672 | Phone, "winrt" for WinRT builds, and "windows" for normal desktop builds. | - | ||||||||||||
2673 | - | |||||||||||||
2674 | For other Unix-type systems, this function usually returns "unknown". | - | ||||||||||||
2675 | - | |||||||||||||
2676 | \sa QFileSelector, kernelType(), kernelVersion(), productVersion(), prettyProductName() | - | ||||||||||||
2677 | */ | - | ||||||||||||
2678 | QString QSysInfo::productType() | - | ||||||||||||
2679 | { | - | ||||||||||||
2680 | // similar, but not identical to QFileSelectorPrivate::platformSelectors | - | ||||||||||||
2681 | #if defined(Q_OS_WINPHONE) | - | ||||||||||||
2682 | return QStringLiteral("winphone"); | - | ||||||||||||
2683 | #elif defined(Q_OS_WINRT) | - | ||||||||||||
2684 | return QStringLiteral("winrt"); | - | ||||||||||||
2685 | #elif defined(Q_OS_WINCE) | - | ||||||||||||
2686 | return QStringLiteral("wince"); | - | ||||||||||||
2687 | #elif defined(Q_OS_WIN) | - | ||||||||||||
2688 | return QStringLiteral("windows"); | - | ||||||||||||
#elif defined(Q_OS_BLACKBERRY) | ||||||||||||||
return QStringLiteral("blackberry"); | ||||||||||||||
2689 | - | |||||||||||||
2690 | #elif defined(Q_OS_QNX) | - | ||||||||||||
2691 | return QStringLiteral("qnx"); | - | ||||||||||||
2692 | - | |||||||||||||
2693 | #elif defined(Q_OS_ANDROID) | - | ||||||||||||
2694 | return QStringLiteral("android"); | - | ||||||||||||
2695 | - | |||||||||||||
2696 | #elif defined(Q_OS_IOS) | - | ||||||||||||
2697 | return QStringLiteral("ios"); | - | ||||||||||||
2698 | #elif defined(Q_OS_MACOS) | - | ||||||||||||
2699 | const QAppleOperatingSystemVersion version = qt_apple_os_version(); | - | ||||||||||||
2700 | if (version.major == 10 && version.minor < 12) | - | ||||||||||||
2701 | return QStringLiteral("osx"); | - | ||||||||||||
2702 | return QStringLiteral("macos"); | - | ||||||||||||
2703 | #elif defined(Q_OS_DARWIN) | - | ||||||||||||
2704 | return QStringLiteral("darwin"); | - | ||||||||||||
2705 | - | |||||||||||||
2706 | #elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX | - | ||||||||||||
2707 | QUnixOSVersion unixOsVersion; | - | ||||||||||||
2708 | findUnixOsVersion(unixOsVersion); | - | ||||||||||||
2709 | if (!unixOsVersion.productType.isEmpty())
| 0-6 | ||||||||||||
2710 | return unixOsVersion.productType; executed 6 times by 2 tests: return unixOsVersion.productType; Executed by:
| 6 | ||||||||||||
2711 | #endif | - | ||||||||||||
2712 | return unknownText(); never executed: return unknownText(); | 0 | ||||||||||||
2713 | } | - | ||||||||||||
2714 | - | |||||||||||||
2715 | /*! | - | ||||||||||||
2716 | \since 5.4 | - | ||||||||||||
2717 | - | |||||||||||||
2718 | Returns the product version of the operating system in string form. If the | - | ||||||||||||
2719 | version could not be determined, this function returns "unknown". | - | ||||||||||||
2720 | - | |||||||||||||
2721 | It will return the Android, iOS, \macos, Windows full-product | - | ||||||||||||
2722 | versions on those systems. In particular, on OS X, iOS and Windows, the | - | ||||||||||||
2723 | returned string is similar to the macVersion() or windowsVersion() enums. | - | ||||||||||||
2724 | - | |||||||||||||
2725 | On Linux systems, it will try to determine the distribution version and will | - | ||||||||||||
2726 | return that. This is also done on Debian/kFreeBSD, so this function will | - | ||||||||||||
2727 | return Debian version in that case. | - | ||||||||||||
2728 | - | |||||||||||||
2729 | In all other Unix-type systems, this function always returns "unknown". | - | ||||||||||||
2730 | - | |||||||||||||
2731 | \note The version string returned from this function is only guaranteed to | - | ||||||||||||
2732 | be orderable on Android, \macos and iOS. On Windows, some Windows | - | ||||||||||||
2733 | versions are text ("XP" and "Vista", for example). On Linux, the version of | - | ||||||||||||
2734 | the distribution may jump unexpectedly, please refer to the distribution's | - | ||||||||||||
2735 | documentation for versioning practices. | - | ||||||||||||
2736 | - | |||||||||||||
2737 | \sa kernelType(), kernelVersion(), productType(), prettyProductName() | - | ||||||||||||
2738 | */ | - | ||||||||||||
2739 | QString QSysInfo::productVersion() | - | ||||||||||||
2740 | { | - | ||||||||||||
2741 | #if defined(Q_OS_MAC) | - | ||||||||||||
2742 | const QAppleOperatingSystemVersion version = qt_apple_os_version(); | - | ||||||||||||
2743 | return QString::number(version.major) + QLatin1Char('.') + QString::number(version.minor); | - | ||||||||||||
2744 | #elif defined(Q_OS_WIN) | - | ||||||||||||
2745 | const char *version = winVer_helper(); | - | ||||||||||||
2746 | if (version) { | - | ||||||||||||
2747 | const QLatin1Char spaceChar(' '); | - | ||||||||||||
2748 | return QString::fromLatin1(version).remove(spaceChar).toLower() + winSp_helper().remove(spaceChar).toLower(); | - | ||||||||||||
2749 | } | - | ||||||||||||
2750 | // fall through | - | ||||||||||||
2751 | - | |||||||||||||
2752 | // Android should not fall through to the Unix code | - | ||||||||||||
2753 | #elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK) | - | ||||||||||||
2754 | return QJNIObjectPrivate::getStaticObjectField("android/os/Build$VERSION", "RELEASE", "Ljava/lang/String;").toString(); | - | ||||||||||||
#elif defined(Q_OS_ANDROID) #elif defined(Q_OS_BLACKBERRY) | ||||||||||||||
deviceinfo_details_t *deviceInfo; | ||||||||||||||
if (deviceinfo_get_details(&deviceInfo) == BPS_SUCCESS) { | ||||||||||||||
QString bbVersion = QString::fromLatin1(deviceinfo_details_get_device_os_version(deviceInfo)); | ||||||||||||||
deviceinfo_free_details(&deviceInfo); | ||||||||||||||
return bbVersion; | ||||||||||||||
}#elif defined(USE_ETC_OS_RELEASE) // Q_OS_UNIX | ||||||||||||||
2756 | QUnixOSVersion unixOsVersion; | - | ||||||||||||
2757 | findUnixOsVersion(unixOsVersion); | - | ||||||||||||
2758 | if (!unixOsVersion.productVersion.isEmpty())
| 0-2 | ||||||||||||
2759 | return unixOsVersion.productVersion; executed 2 times by 1 test: return unixOsVersion.productVersion; Executed by:
| 2 | ||||||||||||
2760 | #endif | - | ||||||||||||
2761 | - | |||||||||||||
2762 | // fallback | - | ||||||||||||
2763 | return unknownText(); never executed: return unknownText(); | 0 | ||||||||||||
2764 | } | - | ||||||||||||
2765 | - | |||||||||||||
2766 | /*! | - | ||||||||||||
2767 | \since 5.4 | - | ||||||||||||
2768 | - | |||||||||||||
2769 | Returns a prettier form of productType() and productVersion(), containing | - | ||||||||||||
2770 | other tokens like the operating system type, codenames and other | - | ||||||||||||
2771 | information. The result of this function is suitable for displaying to the | - | ||||||||||||
2772 | user, but not for long-term storage, as the string may change with updates | - | ||||||||||||
2773 | to Qt. | - | ||||||||||||
2774 | - | |||||||||||||
2775 | If productType() is "unknown", this function will instead use the | - | ||||||||||||
2776 | kernelType() and kernelVersion() functions. | - | ||||||||||||
2777 | - | |||||||||||||
2778 | \sa kernelType(), kernelVersion(), productType(), productVersion() | - | ||||||||||||
2779 | */ | - | ||||||||||||
2780 | QString QSysInfo::prettyProductName() | - | ||||||||||||
2781 | { | - | ||||||||||||
2782 | #if defined(Q_OS_IOS) | - | ||||||||||||
2783 | return QLatin1String("iOS ") + productVersion(); | - | ||||||||||||
2784 | #elif defined(Q_OS_MACOS) | - | ||||||||||||
2785 | // get the known codenames | - | ||||||||||||
2786 | const char *basename = 0; | - | ||||||||||||
2787 | switch (int(MacintoshVersion)) { | - | ||||||||||||
2788 | case MV_CHEETAH: | - | ||||||||||||
2789 | case MV_PUMA: | - | ||||||||||||
2790 | case MV_JAGUAR: | - | ||||||||||||
2791 | case MV_PANTHER: | - | ||||||||||||
2792 | case MV_TIGER: | - | ||||||||||||
2793 | // This version of Qt does not run on those versions of OS X | - | ||||||||||||
2794 | // so this case label will never be reached | - | ||||||||||||
2795 | Q_UNREACHABLE(); | - | ||||||||||||
2796 | break; | - | ||||||||||||
2797 | case MV_LEOPARD: | - | ||||||||||||
2798 | basename = "Mac OS X Leopard ("; | - | ||||||||||||
2799 | break; | - | ||||||||||||
2800 | case MV_SNOWLEOPARD: | - | ||||||||||||
2801 | basename = "Mac OS X Snow Leopard ("; | - | ||||||||||||
2802 | break; | - | ||||||||||||
2803 | case MV_LION: | - | ||||||||||||
2804 | basename = "OS X Lion ("; | - | ||||||||||||
2805 | break; | - | ||||||||||||
2806 | case MV_MOUNTAINLION: | - | ||||||||||||
2807 | basename = "OS X Mountain Lion ("; | - | ||||||||||||
2808 | break; | - | ||||||||||||
2809 | case MV_MAVERICKS: | - | ||||||||||||
2810 | basename = "OS X Mavericks ("; | - | ||||||||||||
2811 | break; | - | ||||||||||||
2812 | case MV_YOSEMITE: | - | ||||||||||||
2813 | basename = "OS X Yosemite ("; | - | ||||||||||||
2814 | break; | - | ||||||||||||
2815 | case MV_ELCAPITAN: | - | ||||||||||||
2816 | basename = "OS X El Capitan ("; | - | ||||||||||||
2817 | break; | - | ||||||||||||
2818 | case MV_SIERRA: | - | ||||||||||||
2819 | basename = "macOS Sierra ("; | - | ||||||||||||
2820 | break; | - | ||||||||||||
2821 | } | - | ||||||||||||
2822 | if (basename) | - | ||||||||||||
2823 | return QLatin1String(basename) + productVersion() + QLatin1Char(')'); | - | ||||||||||||
2824 | - | |||||||||||||
2825 | // a future version of macOS | - | ||||||||||||
2826 | return QLatin1String("macOS ") + productVersion(); | - | ||||||||||||
2827 | #elif defined(Q_OS_WINPHONE) | - | ||||||||||||
2828 | return QLatin1String("Windows Phone ") + QLatin1String(winVer_helper()); | - | ||||||||||||
2829 | #elif defined(Q_OS_WIN) | - | ||||||||||||
2830 | return QLatin1String("Windows ") + QLatin1String(winVer_helper()); | - | ||||||||||||
#elif defined(Q_OS_ANDROID) | ||||||||||||||
return QLatin1String("Android ")()) + productVersionwinSp_helper(); | ||||||||||||||
2831 | #elif defined(Q_OS_BLACKBERRYQ_OS_ANDROID) | - | ||||||||||||
2832 | return QLatin1String("BlackBerry"Android ") + productVersion(); | - | ||||||||||||
2833 | #elif defined(Q_OS_HAIKU) | - | ||||||||||||
2834 | return QLatin1String("Haiku ") + productVersion(); | - | ||||||||||||
2835 | #elif defined(Q_OS_UNIX) | - | ||||||||||||
2836 | # ifdef USE_ETC_OS_RELEASE | - | ||||||||||||
2837 | QUnixOSVersion unixOsVersion; | - | ||||||||||||
2838 | findUnixOsVersion(unixOsVersion); | - | ||||||||||||
2839 | if (!unixOsVersion.prettyName.isEmpty())
| 0-1 | ||||||||||||
2840 | return unixOsVersion.prettyName; executed 1 time by 1 test: return unixOsVersion.prettyName; Executed by:
| 1 | ||||||||||||
2841 | # endif | - | ||||||||||||
2842 | struct utsname u; | - | ||||||||||||
2843 | if (uname(&u) == 0)
| 0 | ||||||||||||
2844 | return QString::fromLatin1(u.sysname) + QLatin1Char(' ') + QString::fromLatin1(u.release); never executed: return QString::fromLatin1(u.sysname) + QLatin1Char(' ') + QString::fromLatin1(u.release); | 0 | ||||||||||||
2845 | #endif | - | ||||||||||||
2846 | return unknownText(); never executed: return unknownText(); | 0 | ||||||||||||
2847 | } | - | ||||||||||||
2848 | - | |||||||||||||
2849 | #ifndef QT_BOOTSTRAPPED | - | ||||||||||||
2850 | /*! | - | ||||||||||||
2851 | \since 5.6 | - | ||||||||||||
2852 | - | |||||||||||||
2853 | Returns this machine's host name, if one is configured. Note that hostnames | - | ||||||||||||
2854 | are not guaranteed to be globally unique, especially if they were | - | ||||||||||||
2855 | configured automatically. | - | ||||||||||||
2856 | - | |||||||||||||
2857 | This function does not guarantee the returned host name is a Fully | - | ||||||||||||
2858 | Qualified Domain Name (FQDN). For that, use QHostInfo to resolve the | - | ||||||||||||
2859 | returned name to an FQDN. | - | ||||||||||||
2860 | - | |||||||||||||
2861 | This function returns the same as QHostInfo::localHostName(). | - | ||||||||||||
2862 | - | |||||||||||||
2863 | \sa QHostInfo::localDomainName | - | ||||||||||||
2864 | */ | - | ||||||||||||
2865 | QString QSysInfo::machineHostName() | - | ||||||||||||
2866 | { | - | ||||||||||||
2867 | #if defined(Q_OS_LINUX) | - | ||||||||||||
2868 | // gethostname(3) on Linux just calls uname(2), so do it ourselves | - | ||||||||||||
2869 | // and avoid a memcpy | - | ||||||||||||
2870 | struct utsname u; | - | ||||||||||||
2871 | if (uname(&u) == 0) | - | ||||||||||||
2872 | return QString::fromLocal8Bit(u.nodename); | - | ||||||||||||
2873 | #else | - | ||||||||||||
2874 | # ifdef Q_OS_WIN | - | ||||||||||||
2875 | // Important: QtNetwork depends on machineHostName() initializing ws2_32.dll | - | ||||||||||||
2876 | winsockInit(); | - | ||||||||||||
2877 | # endif | - | ||||||||||||
2878 | - | |||||||||||||
2879 | char hostName[512]; | - | ||||||||||||
2880 | if (gethostname(hostName, sizeof(hostName)) == -1) | - | ||||||||||||
2881 | return QString(); | - | ||||||||||||
2882 | hostName[sizeof(hostName) - 1] = '\0'; | - | ||||||||||||
2883 | return QString::fromLocal8Bit(hostName); | - | ||||||||||||
2884 | #endif | - | ||||||||||||
2885 | return QString(); | - | ||||||||||||
2886 | } | - | ||||||||||||
2887 | #endif // QT_BOOTSTRAPPED | - | ||||||||||||
2888 | - | |||||||||||||
2889 | /*! | - | ||||||||||||
2890 | \macro void Q_ASSERT(bool test) | - | ||||||||||||
2891 | \relates <QtGlobal> | - | ||||||||||||
2892 | - | |||||||||||||
2893 | Prints a warning message containing the source code file name and | - | ||||||||||||
2894 | line number if \a test is \c false. | - | ||||||||||||
2895 | - | |||||||||||||
2896 | Q_ASSERT() is useful for testing pre- and post-conditions | - | ||||||||||||
2897 | during development. It does nothing if \c QT_NO_DEBUG was defined | - | ||||||||||||
2898 | during compilation. | - | ||||||||||||
2899 | - | |||||||||||||
2900 | Example: | - | ||||||||||||
2901 | - | |||||||||||||
2902 | \snippet code/src_corelib_global_qglobal.cpp 17 | - | ||||||||||||
2903 | - | |||||||||||||
2904 | If \c b is zero, the Q_ASSERT statement will output the following | - | ||||||||||||
2905 | message using the qFatal() function: | - | ||||||||||||
2906 | - | |||||||||||||
2907 | \snippet code/src_corelib_global_qglobal.cpp 18 | - | ||||||||||||
2908 | - | |||||||||||||
2909 | \sa Q_ASSERT_X(), qFatal(), {Debugging Techniques} | - | ||||||||||||
2910 | */ | - | ||||||||||||
2911 | - | |||||||||||||
2912 | /*! | - | ||||||||||||
2913 | \macro void Q_ASSERT_X(bool test, const char *where, const char *what) | - | ||||||||||||
2914 | \relates <QtGlobal> | - | ||||||||||||
2915 | - | |||||||||||||
2916 | Prints the message \a what together with the location \a where, | - | ||||||||||||
2917 | the source file name and line number if \a test is \c false. | - | ||||||||||||
2918 | - | |||||||||||||
2919 | Q_ASSERT_X is useful for testing pre- and post-conditions during | - | ||||||||||||
2920 | development. It does nothing if \c QT_NO_DEBUG was defined during | - | ||||||||||||
2921 | compilation. | - | ||||||||||||
2922 | - | |||||||||||||
2923 | Example: | - | ||||||||||||
2924 | - | |||||||||||||
2925 | \snippet code/src_corelib_global_qglobal.cpp 19 | - | ||||||||||||
2926 | - | |||||||||||||
2927 | If \c b is zero, the Q_ASSERT_X statement will output the following | - | ||||||||||||
2928 | message using the qFatal() function: | - | ||||||||||||
2929 | - | |||||||||||||
2930 | \snippet code/src_corelib_global_qglobal.cpp 20 | - | ||||||||||||
2931 | - | |||||||||||||
2932 | \sa Q_ASSERT(), qFatal(), {Debugging Techniques} | - | ||||||||||||
2933 | */ | - | ||||||||||||
2934 | - | |||||||||||||
2935 | /*! | - | ||||||||||||
2936 | \macro void Q_ASSUME(bool expr) | - | ||||||||||||
2937 | \relates <QtGlobal> | - | ||||||||||||
2938 | \since 5.0 | - | ||||||||||||
2939 | - | |||||||||||||
2940 | Causes the compiler to assume that \a expr is \c true. This macro is useful | - | ||||||||||||
2941 | for improving code generation, by providing the compiler with hints about | - | ||||||||||||
2942 | conditions that it would not otherwise know about. However, there is no | - | ||||||||||||
2943 | guarantee that the compiler will actually use those hints. | - | ||||||||||||
2944 | - | |||||||||||||
2945 | This macro could be considered a "lighter" version of \l{Q_ASSERT()}. While | - | ||||||||||||
2946 | Q_ASSERT will abort the program's execution if the condition is \c false, | - | ||||||||||||
2947 | Q_ASSUME will tell the compiler not to generate code for those conditions. | - | ||||||||||||
2948 | Therefore, it is important that the assumptions always hold, otherwise | - | ||||||||||||
2949 | undefined behaviour may occur. | - | ||||||||||||
2950 | - | |||||||||||||
2951 | If \a expr is a constantly \c false condition, Q_ASSUME will tell the compiler | - | ||||||||||||
2952 | that the current code execution cannot be reached. That is, Q_ASSUME(false) | - | ||||||||||||
2953 | is equivalent to Q_UNREACHABLE(). | - | ||||||||||||
2954 | - | |||||||||||||
2955 | In debug builds the condition is enforced by an assert to facilitate debugging. | - | ||||||||||||
2956 | - | |||||||||||||
2957 | \note Q_LIKELY() tells the compiler that the expression is likely, but not | - | ||||||||||||
2958 | the only possibility. Q_ASSUME tells the compiler that it is the only | - | ||||||||||||
2959 | possibility. | - | ||||||||||||
2960 | - | |||||||||||||
2961 | \sa Q_ASSERT(), Q_UNREACHABLE(), Q_LIKELY() | - | ||||||||||||
2962 | */ | - | ||||||||||||
2963 | - | |||||||||||||
2964 | /*! | - | ||||||||||||
2965 | \macro void Q_UNREACHABLE() | - | ||||||||||||
2966 | \relates <QtGlobal> | - | ||||||||||||
2967 | \since 5.0 | - | ||||||||||||
2968 | - | |||||||||||||
2969 | Tells the compiler that the current point cannot be reached by any | - | ||||||||||||
2970 | execution, so it may optimize any code paths leading here as dead code, as | - | ||||||||||||
2971 | well as code continuing from here. | - | ||||||||||||
2972 | - | |||||||||||||
2973 | This macro is useful to mark impossible conditions. For example, given the | - | ||||||||||||
2974 | following enum: | - | ||||||||||||
2975 | - | |||||||||||||
2976 | \snippet code/src_corelib_global_qglobal.cpp qunreachable-enum | - | ||||||||||||
2977 | - | |||||||||||||
2978 | One can write a switch table like so: | - | ||||||||||||
2979 | - | |||||||||||||
2980 | \snippet code/src_corelib_global_qglobal.cpp qunreachable-switch | - | ||||||||||||
2981 | - | |||||||||||||
2982 | The advantage of inserting Q_UNREACHABLE() at that point is that the | - | ||||||||||||
2983 | compiler is told not to generate code for a shape variable containing that | - | ||||||||||||
2984 | value. If the macro is missing, the compiler will still generate the | - | ||||||||||||
2985 | necessary comparisons for that value. If the case label were removed, some | - | ||||||||||||
2986 | compilers could produce a warning that some enum values were not checked. | - | ||||||||||||
2987 | - | |||||||||||||
2988 | By using this macro in impossible conditions, code coverage may be improved | - | ||||||||||||
2989 | as dead code paths may be eliminated. | - | ||||||||||||
2990 | - | |||||||||||||
2991 | In debug builds the condition is enforced by an assert to facilitate debugging. | - | ||||||||||||
2992 | - | |||||||||||||
2993 | \sa Q_ASSERT(), Q_ASSUME(), qFatal() | - | ||||||||||||
2994 | */ | - | ||||||||||||
2995 | - | |||||||||||||
2996 | /*! | - | ||||||||||||
2997 | \macro void Q_CHECK_PTR(void *pointer) | - | ||||||||||||
2998 | \relates <QtGlobal> | - | ||||||||||||
2999 | - | |||||||||||||
3000 | If \a pointer is 0, prints a message containing the source | - | ||||||||||||
3001 | code's file name and line number, saying that the program ran out | - | ||||||||||||
3002 | of memory and aborts program execution. It throws \c std::bad_alloc instead | - | ||||||||||||
3003 | if exceptions are enabled. | - | ||||||||||||
3004 | - | |||||||||||||
3005 | Q_CHECK_PTR does nothing if \c QT_NO_DEBUG and \c QT_NO_EXCEPTIONS were | - | ||||||||||||
3006 | defined during compilation. Therefore you must not use Q_CHECK_PTR to check | - | ||||||||||||
3007 | for successful memory allocations because the check will be disabled in | - | ||||||||||||
3008 | some cases. | - | ||||||||||||
3009 | - | |||||||||||||
3010 | Example: | - | ||||||||||||
3011 | - | |||||||||||||
3012 | \snippet code/src_corelib_global_qglobal.cpp 21 | - | ||||||||||||
3013 | - | |||||||||||||
3014 | \sa qWarning(), {Debugging Techniques} | - | ||||||||||||
3015 | */ | - | ||||||||||||
3016 | - | |||||||||||||
3017 | /*! | - | ||||||||||||
3018 | \fn T *q_check_ptr(T *pointer) | - | ||||||||||||
3019 | \relates <QtGlobal> | - | ||||||||||||
3020 | - | |||||||||||||
3021 | Uses Q_CHECK_PTR on \a pointer, then returns \a pointer. | - | ||||||||||||
3022 | - | |||||||||||||
3023 | This can be used as an inline version of Q_CHECK_PTR. | - | ||||||||||||
3024 | */ | - | ||||||||||||
3025 | - | |||||||||||||
3026 | /*! | - | ||||||||||||
3027 | \macro const char* Q_FUNC_INFO() | - | ||||||||||||
3028 | \relates <QtGlobal> | - | ||||||||||||
3029 | - | |||||||||||||
3030 | Expands to a string that describe the function the macro resides in. How this string looks | - | ||||||||||||
3031 | more specifically is compiler dependent. With GNU GCC it is typically the function signature, | - | ||||||||||||
3032 | while with other compilers it might be the line and column number. | - | ||||||||||||
3033 | - | |||||||||||||
3034 | Q_FUNC_INFO can be conveniently used with qDebug(). For example, this function: | - | ||||||||||||
3035 | - | |||||||||||||
3036 | \snippet code/src_corelib_global_qglobal.cpp 22 | - | ||||||||||||
3037 | - | |||||||||||||
3038 | when instantiated with the integer type, will with the GCC compiler produce: | - | ||||||||||||
3039 | - | |||||||||||||
3040 | \tt{const TInputType& myMin(const TInputType&, const TInputType&) [with TInputType = int] was called with value1: 3 value2: 4} | - | ||||||||||||
3041 | - | |||||||||||||
3042 | If this macro is used outside a function, the behavior is undefined. | - | ||||||||||||
3043 | */ | - | ||||||||||||
3044 | - | |||||||||||||
3045 | /* | - | ||||||||||||
3046 | The Q_CHECK_PTR macro calls this function if an allocation check | - | ||||||||||||
3047 | fails. | - | ||||||||||||
3048 | */ | - | ||||||||||||
3049 | void qt_check_pointer(const char *n, int l) | - | ||||||||||||
3050 | { | - | ||||||||||||
3051 | qFatal("In file %s, line %d: Out of memory", n, l); | - | ||||||||||||
3052 | } | - | ||||||||||||
3053 | - | |||||||||||||
3054 | /* | - | ||||||||||||
3055 | \internal | - | ||||||||||||
3056 | Allows you to throw an exception without including <new> | - | ||||||||||||
3057 | Called internally from Q_CHECK_PTR on certain OS combinations | - | ||||||||||||
3058 | */ | - | ||||||||||||
3059 | void qBadAlloc() | - | ||||||||||||
3060 | { | - | ||||||||||||
3061 | QT_THROW(std::bad_alloc()); | - | ||||||||||||
3062 | } | - | ||||||||||||
3063 | - | |||||||||||||
3064 | #ifndef QT_NO_EXCEPTIONS | - | ||||||||||||
3065 | /* | - | ||||||||||||
3066 | \internal | - | ||||||||||||
3067 | Allows you to call std::terminate() without including <exception>. | - | ||||||||||||
3068 | Called internally from QT_TERMINATE_ON_EXCEPTION | - | ||||||||||||
3069 | */ | - | ||||||||||||
3070 | Q_NORETURN void qTerminate() Q_DECL_NOTHROW | - | ||||||||||||
3071 | { | - | ||||||||||||
3072 | std::terminate(); | - | ||||||||||||
3073 | } never executed: end of block | 0 | ||||||||||||
3074 | #endif | - | ||||||||||||
3075 | - | |||||||||||||
3076 | /* | - | ||||||||||||
3077 | The Q_ASSERT macro calls this function when the test fails. | - | ||||||||||||
3078 | */ | - | ||||||||||||
3079 | void qt_assert(const char *assertion, const char *file, int line) Q_DECL_NOTHROW | - | ||||||||||||
3080 | { | - | ||||||||||||
3081 | qFatal("ASSERT: \"%s\" in file %s, line %d", assertion, file, line); | - | ||||||||||||
3082 | } never executed: end of block | 0 | ||||||||||||
3083 | - | |||||||||||||
3084 | /* | - | ||||||||||||
3085 | The Q_ASSERT_X macro calls this function when the test fails. | - | ||||||||||||
3086 | */ | - | ||||||||||||
3087 | void qt_assert_x(const char *where, const char *what, const char *file, int line) Q_DECL_NOTHROW | - | ||||||||||||
3088 | { | - | ||||||||||||
3089 | qFatal("ASSERT failure in %s: \"%s\", file %s, line %d", where, what, file, line); | - | ||||||||||||
3090 | } never executed: end of block | 0 | ||||||||||||
3091 | - | |||||||||||||
3092 | - | |||||||||||||
3093 | /* | - | ||||||||||||
3094 | Dijkstra's bisection algorithm to find the square root of an integer. | - | ||||||||||||
3095 | Deliberately not exported as part of the Qt API, but used in both | - | ||||||||||||
3096 | qsimplerichtext.cpp and qgfxraster_qws.cpp | - | ||||||||||||
3097 | */ | - | ||||||||||||
3098 | Q_CORE_EXPORT unsigned int qt_int_sqrt(unsigned int n) | - | ||||||||||||
3099 | { | - | ||||||||||||
3100 | // n must be in the range 0...UINT_MAX/2-1 | - | ||||||||||||
3101 | if (n >= (UINT_MAX>>2)) { | - | ||||||||||||
3102 | unsigned int r = 2 * qt_int_sqrt(n / 4); | - | ||||||||||||
3103 | unsigned int r2 = r + 1; | - | ||||||||||||
3104 | return (n >= r2 * r2) ? r2 : r; | - | ||||||||||||
3105 | } | - | ||||||||||||
3106 | uint h, p= 0, q= 1, r= n; | - | ||||||||||||
3107 | while (q <= n) | - | ||||||||||||
3108 | q <<= 2; | - | ||||||||||||
3109 | while (q != 1) { | - | ||||||||||||
3110 | q >>= 2; | - | ||||||||||||
3111 | h= p + q; | - | ||||||||||||
3112 | p >>= 1; | - | ||||||||||||
3113 | if (r >= h) { | - | ||||||||||||
3114 | p += q; | - | ||||||||||||
3115 | r -= h; | - | ||||||||||||
3116 | } | - | ||||||||||||
3117 | } | - | ||||||||||||
3118 | return p; | - | ||||||||||||
3119 | } | - | ||||||||||||
3120 | - | |||||||||||||
3121 | void *qMemCopy(void *dest, const void *src, size_t n) { return memcpy(dest, src, n); } | - | ||||||||||||
3122 | void *qMemSet(void *dest, int c, size_t n) { return memset(dest, c, n); } | - | ||||||||||||
3123 | - | |||||||||||||
3124 | #if !defined(Q_OS_WIN) && !defined(QT_NO_THREAD) && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_QNX) && \ | - | ||||||||||||
3125 | defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L | - | ||||||||||||
3126 | namespace { | - | ||||||||||||
3127 | // There are two incompatible versions of strerror_r: | - | ||||||||||||
3128 | // a) the XSI/POSIX.1 version, which returns an int, | - | ||||||||||||
3129 | // indicating success or not | - | ||||||||||||
3130 | // b) the GNU version, which returns a char*, which may or may not | - | ||||||||||||
3131 | // be the beginning of the buffer we used | - | ||||||||||||
3132 | // The GNU libc manpage for strerror_r says you should use the XSI | - | ||||||||||||
3133 | // version in portable code. However, it's impossible to do that if | - | ||||||||||||
3134 | // _GNU_SOURCE is defined so we use C++ overloading to decide what to do | - | ||||||||||||
3135 | // depending on the return type | - | ||||||||||||
3136 | static inline Q_DECL_UNUSED QString fromstrerror_helper(int, const QByteArray &buf) | - | ||||||||||||
3137 | { | - | ||||||||||||
3138 | return QString::fromLocal8Bit(buf.constData()); | - | ||||||||||||
3139 | } | - | ||||||||||||
3140 | static inline Q_DECL_UNUSED QString fromstrerror_helper(const char *str, const QByteArray &) | - | ||||||||||||
3141 | { | - | ||||||||||||
3142 | return QString::fromLocal8Bit(str); | - | ||||||||||||
3143 | } | - | ||||||||||||
3144 | } | - | ||||||||||||
3145 | #endif | - | ||||||||||||
3146 | - | |||||||||||||
3147 | QString qt_error_string(int errorCode) | - | ||||||||||||
3148 | { | - | ||||||||||||
3149 | const char *s = 0; | - | ||||||||||||
3150 | QString ret; | - | ||||||||||||
3151 | if (errorCode == -1) { | - | ||||||||||||
3152 | #if defined(Q_OS_WIN) | - | ||||||||||||
3153 | errorCode = GetLastError(); | - | ||||||||||||
3154 | #else | - | ||||||||||||
3155 | errorCode = errno; | - | ||||||||||||
3156 | #endif | - | ||||||||||||
3157 | } | - | ||||||||||||
3158 | switch (errorCode) { | - | ||||||||||||
3159 | case 0: | - | ||||||||||||
3160 | break; | - | ||||||||||||
3161 | case EACCES: | - | ||||||||||||
3162 | s = QT_TRANSLATE_NOOP("QIODevice", "Permission denied"); | - | ||||||||||||
3163 | break; | - | ||||||||||||
3164 | case EMFILE: | - | ||||||||||||
3165 | s = QT_TRANSLATE_NOOP("QIODevice", "Too many open files"); | - | ||||||||||||
3166 | break; | - | ||||||||||||
3167 | case ENOENT: | - | ||||||||||||
3168 | s = QT_TRANSLATE_NOOP("QIODevice", "No such file or directory"); | - | ||||||||||||
3169 | break; | - | ||||||||||||
3170 | case ENOSPC: | - | ||||||||||||
3171 | s = QT_TRANSLATE_NOOP("QIODevice", "No space left on device"); | - | ||||||||||||
3172 | break; | - | ||||||||||||
3173 | default: { | - | ||||||||||||
3174 | #if defined(Q_OS_WIN) | - | ||||||||||||
3175 | // Retrieve the system error message for the last-error code. | - | ||||||||||||
3176 | # ifndef Q_OS_WINRT | - | ||||||||||||
3177 | wchar_t *string = 0; | - | ||||||||||||
3178 | FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, | - | ||||||||||||
3179 | NULL, | - | ||||||||||||
3180 | errorCode, | - | ||||||||||||
3181 | MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), | - | ||||||||||||
3182 | (LPWSTR)&string, | - | ||||||||||||
3183 | 0, | - | ||||||||||||
3184 | NULL); | - | ||||||||||||
3185 | ret = QString::fromWCharArray(string); | - | ||||||||||||
3186 | LocalFree((HLOCAL)string); | - | ||||||||||||
3187 | # else // !Q_OS_WINRT | - | ||||||||||||
3188 | __declspec(thread) static wchar_t errorString[4096]; | - | ||||||||||||
3189 | FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, | - | ||||||||||||
3190 | NULL, | - | ||||||||||||
3191 | errorCode, | - | ||||||||||||
3192 | MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), | - | ||||||||||||
3193 | errorString, | - | ||||||||||||
3194 | ARRAYSIZE(errorString), | - | ||||||||||||
3195 | NULL); | - | ||||||||||||
3196 | ret = QString::fromWCharArray(errorString); | - | ||||||||||||
3197 | # endif // Q_OS_WINRT | - | ||||||||||||
3198 | - | |||||||||||||
3199 | if (ret.isEmpty() && errorCode == ERROR_MOD_NOT_FOUND) | - | ||||||||||||
3200 | ret = QString::fromLatin1("The specified module could not be found."); | - | ||||||||||||
3201 | #elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_QNX) | - | ||||||||||||
3202 | QByteArray buf(1024, '\0'); | - | ||||||||||||
3203 | ret = fromstrerror_helper(strerror_r(errorCode, buf.data(), buf.size()), buf); | - | ||||||||||||
3204 | #else | - | ||||||||||||
3205 | ret = QString::fromLocal8Bit(strerror(errorCode)); | - | ||||||||||||
3206 | #endif | - | ||||||||||||
3207 | break; } | - | ||||||||||||
3208 | } | - | ||||||||||||
3209 | if (s) | - | ||||||||||||
3210 | // ######## this breaks moc build currently | - | ||||||||||||
3211 | // ret = QCoreApplication::translate("QIODevice", s); | - | ||||||||||||
3212 | ret = QString::fromLatin1(s); | - | ||||||||||||
3213 | return ret.trimmed(); | - | ||||||||||||
3214 | } | - | ||||||||||||
3215 | - | |||||||||||||
3216 | // In the C runtime on all platforms access to the environment is not thread-safe. We | - | ||||||||||||
3217 | // add thread-safety for the Qt wrappers. | - | ||||||||||||
3218 | static QBasicMutex environmentMutex; | - | ||||||||||||
3219 | - | |||||||||||||
3220 | // getenv is declared as deprecated in VS2005. This function | - | ||||||||||||
3221 | // makes use of the new secure getenv function. | - | ||||||||||||
3222 | /*! | - | ||||||||||||
3223 | \relates <QtGlobal> | - | ||||||||||||
3224 | - | |||||||||||||
3225 | Returns the value of the environment variable with name \a | - | ||||||||||||
3226 | varName. To get the variable string, use QByteArray::constData(). | - | ||||||||||||
3227 | - | |||||||||||||
3228 | \note qgetenv() was introduced because getenv() from the standard | - | ||||||||||||
3229 | C library was deprecated in VC2005 (and later versions). qgetenv() | - | ||||||||||||
3230 | uses the new replacement function in VC, and calls the standard C | - | ||||||||||||
3231 | library's implementation on all other platforms. | - | ||||||||||||
3232 | - | |||||||||||||
3233 | \sa qputenv(), qEnvironmentVariableIsSet(), qEnvironmentVariableIsEmpty() | - | ||||||||||||
3234 | */ | - | ||||||||||||
3235 | QByteArray qgetenv(const char *varName) | - | ||||||||||||
3236 | { | - | ||||||||||||
3237 | QMutexLocker locker(&environmentMutex); | - | ||||||||||||
3238 | #if defined(_MSC_VER) && _MSC_VER >= 1400 | - | ||||||||||||
3239 | size_t requiredSize = 0; | - | ||||||||||||
3240 | QByteArray buffer; | - | ||||||||||||
3241 | getenv_s(&requiredSize, 0, 0, varName); | - | ||||||||||||
3242 | if (requiredSize == 0) | - | ||||||||||||
3243 | return buffer; | - | ||||||||||||
3244 | buffer.resize(int(requiredSize)); | - | ||||||||||||
3245 | getenv_s(&requiredSize, buffer.data(), requiredSize, varName); | - | ||||||||||||
3246 | // requiredSize includes the terminating null, which we don't want. | - | ||||||||||||
3247 | Q_ASSERT(buffer.endsWith('\0')); | - | ||||||||||||
3248 | buffer.chop(1); | - | ||||||||||||
3249 | return buffer; | - | ||||||||||||
3250 | #else | - | ||||||||||||
3251 | return QByteArray(::getenv(varName)); | - | ||||||||||||
3252 | #endif | - | ||||||||||||
3253 | } | - | ||||||||||||
3254 | - | |||||||||||||
3255 | /*! | - | ||||||||||||
3256 | \relates <QtGlobal> | - | ||||||||||||
3257 | \since 5.1 | - | ||||||||||||
3258 | - | |||||||||||||
3259 | Returns whether the environment variable \a varName is empty. | - | ||||||||||||
3260 | - | |||||||||||||
3261 | Equivalent to | - | ||||||||||||
3262 | \code | - | ||||||||||||
3263 | qgetenv(varName).isEmpty() | - | ||||||||||||
3264 | \endcode | - | ||||||||||||
3265 | except that it's potentially much faster, and can't throw exceptions. | - | ||||||||||||
3266 | - | |||||||||||||
3267 | \sa qgetenv(), qEnvironmentVariableIsSet() | - | ||||||||||||
3268 | */ | - | ||||||||||||
3269 | bool qEnvironmentVariableIsEmpty(const char *varName) Q_DECL_NOEXCEPT | - | ||||||||||||
3270 | { | - | ||||||||||||
3271 | QMutexLocker locker(&environmentMutex); | - | ||||||||||||
3272 | #if defined(_MSC_VER) && _MSC_VER >= 1400 | - | ||||||||||||
3273 | // we provide a buffer that can only hold the empty string, so | - | ||||||||||||
3274 | // when the env.var isn't empty, we'll get an ERANGE error (buffer | - | ||||||||||||
3275 | // too small): | - | ||||||||||||
3276 | size_t dummy; | - | ||||||||||||
3277 | char buffer = '\0'; | - | ||||||||||||
3278 | return getenv_s(&dummy, &buffer, 1, varName) != ERANGE; | - | ||||||||||||
3279 | #else | - | ||||||||||||
3280 | const char * const value = ::getenv(varName); | - | ||||||||||||
3281 | return !value || !*value; executed 1243771 times by 517 tests: return !value || !*value; Executed by:
| 1243771 | ||||||||||||
3282 | #endif | - | ||||||||||||
3283 | } | - | ||||||||||||
3284 | - | |||||||||||||
3285 | /*! | - | ||||||||||||
3286 | \relates <QtGlobal> | - | ||||||||||||
3287 | \since 5.5 | - | ||||||||||||
3288 | - | |||||||||||||
3289 | Returns the numerical value of the environment variable \a varName. | - | ||||||||||||
3290 | If \a ok is not null, sets \c{*ok} to \c true or \c false depending | - | ||||||||||||
3291 | on the success of the conversion. | - | ||||||||||||
3292 | - | |||||||||||||
3293 | Equivalent to | - | ||||||||||||
3294 | \code | - | ||||||||||||
3295 | qgetenv(varName).toInt() | - | ||||||||||||
3296 | \endcode | - | ||||||||||||
3297 | except that it's much faster, and can't throw exceptions. | - | ||||||||||||
3298 | - | |||||||||||||
3299 | \sa qgetenv(), qEnvironmentVariableIsSet() | - | ||||||||||||
3300 | */ | - | ||||||||||||
3301 | int qEnvironmentVariableIntValue(const char *varName, bool *ok) Q_DECL_NOEXCEPT | - | ||||||||||||
3302 | { | - | ||||||||||||
3303 | QMutexLocker locker(&environmentMutex); | - | ||||||||||||
3304 | #if defined(_MSC_VER) && _MSC_VER >= 1400 | - | ||||||||||||
3305 | // we provide a buffer that can hold any int value: | - | ||||||||||||
3306 | static const int NumBinaryDigitsPerOctalDigit = 3; | - | ||||||||||||
3307 | static const int MaxDigitsForOctalInt = | - | ||||||||||||
3308 | (std::numeric_limits<uint>::digits + NumBinaryDigitsPerOctalDigit - 1) / NumBinaryDigitsPerOctalDigit; | - | ||||||||||||
3309 | char buffer[MaxDigitsForOctalInt + 2]; // +1 for NUL +1 for optional '-' | - | ||||||||||||
3310 | size_t dummy; | - | ||||||||||||
3311 | if (getenv_s(&dummy, buffer, sizeof buffer, varName) != 0) { | - | ||||||||||||
3312 | if (ok) | - | ||||||||||||
3313 | *ok = false; | - | ||||||||||||
3314 | return 0; | - | ||||||||||||
3315 | } | - | ||||||||||||
3316 | #else | - | ||||||||||||
3317 | const char * const buffer = ::getenv(varName); | - | ||||||||||||
3318 | if (!buffer || !*buffer) {
| 2-2761 | ||||||||||||
3319 | if (ok)
| 1260-1503 | ||||||||||||
3320 | *ok = false; executed 1503 times by 503 tests: *ok = false; Executed by:
| 1503 | ||||||||||||
3321 | return 0; executed 2763 times by 507 tests: return 0; Executed by:
| 2763 | ||||||||||||
3322 | } | - | ||||||||||||
3323 | #endif | - | ||||||||||||
3324 | bool ok_ = true; | - | ||||||||||||
3325 | const qlonglong value = qstrtoll(buffer, Q_NULLPTR, 0, &ok_); | - | ||||||||||||
3326 | if (int(value) != value) { // this is the check in QByteArray::toInt(), keep it in sync
| 14-29 | ||||||||||||
3327 | if (ok)
| 7 | ||||||||||||
3328 | *ok = false; executed 7 times by 1 test: *ok = false; Executed by:
| 7 | ||||||||||||
3329 | return 0; executed 14 times by 1 test: return 0; Executed by:
| 14 | ||||||||||||
3330 | } else if (ok) {
| 14-15 | ||||||||||||
3331 | *ok = ok_; | - | ||||||||||||
3332 | } executed 15 times by 2 tests: end of block Executed by:
| 15 | ||||||||||||
3333 | return int(value); executed 29 times by 2 tests: return int(value); Executed by:
| 29 | ||||||||||||
3334 | } | - | ||||||||||||
3335 | - | |||||||||||||
3336 | /*! | - | ||||||||||||
3337 | \relates <QtGlobal> | - | ||||||||||||
3338 | \since 5.1 | - | ||||||||||||
3339 | - | |||||||||||||
3340 | Returns whether the environment variable \a varName is set. | - | ||||||||||||
3341 | - | |||||||||||||
3342 | Equivalent to | - | ||||||||||||
3343 | \code | - | ||||||||||||
3344 | !qgetenv(varName).isNull() | - | ||||||||||||
3345 | \endcode | - | ||||||||||||
3346 | except that it's potentially much faster, and can't throw exceptions. | - | ||||||||||||
3347 | - | |||||||||||||
3348 | \sa qgetenv(), qEnvironmentVariableIsEmpty() | - | ||||||||||||
3349 | */ | - | ||||||||||||
3350 | bool qEnvironmentVariableIsSet(const char *varName) Q_DECL_NOEXCEPT | - | ||||||||||||
3351 | { | - | ||||||||||||
3352 | QMutexLocker locker(&environmentMutex); | - | ||||||||||||
3353 | #if defined(_MSC_VER) && _MSC_VER >= 1400 | - | ||||||||||||
3354 | size_t requiredSize = 0; | - | ||||||||||||
3355 | (void)getenv_s(&requiredSize, 0, 0, varName); | - | ||||||||||||
3356 | return requiredSize != 0; | - | ||||||||||||
3357 | #else | - | ||||||||||||
3358 | return ::getenv(varName) != 0; executed 1985 times by 178 tests: return ::getenv(varName) != 0; Executed by:
| 1985 | ||||||||||||
3359 | #endif | - | ||||||||||||
3360 | } | - | ||||||||||||
3361 | - | |||||||||||||
3362 | /*! | - | ||||||||||||
3363 | \relates <QtGlobal> | - | ||||||||||||
3364 | - | |||||||||||||
3365 | This function sets the \a value of the environment variable named | - | ||||||||||||
3366 | \a varName. It will create the variable if it does not exist. It | - | ||||||||||||
3367 | returns 0 if the variable could not be set. | - | ||||||||||||
3368 | - | |||||||||||||
3369 | Calling qputenv with an empty value removes the environment variable on | - | ||||||||||||
3370 | Windows, and makes it set (but empty) on Unix. Prefer using qunsetenv() | - | ||||||||||||
3371 | for fully portable behavior. | - | ||||||||||||
3372 | - | |||||||||||||
3373 | \note qputenv() was introduced because putenv() from the standard | - | ||||||||||||
3374 | C library was deprecated in VC2005 (and later versions). qputenv() | - | ||||||||||||
3375 | uses the replacement function in VC, and calls the standard C | - | ||||||||||||
3376 | library's implementation on all other platforms. | - | ||||||||||||
3377 | - | |||||||||||||
3378 | \sa qgetenv() | - | ||||||||||||
3379 | */ | - | ||||||||||||
3380 | bool qputenv(const char *varName, const QByteArray& value) | - | ||||||||||||
3381 | { | - | ||||||||||||
3382 | QMutexLocker locker(&environmentMutex); | - | ||||||||||||
3383 | #if defined(_MSC_VER) && _MSC_VER >= 1400 | - | ||||||||||||
3384 | return _putenv_s(varName, value.constData()) == 0; | - | ||||||||||||
3385 | #elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0) >= 200112L) || defined(Q_OS_HAIKU) | - | ||||||||||||
3386 | // POSIX.1-2001 has setenv | - | ||||||||||||
3387 | return setenv(varName, value.constData(), true) == 0; | - | ||||||||||||
3388 | #else | - | ||||||||||||
3389 | QByteArray buffer(varName); | - | ||||||||||||
3390 | buffer += '='; | - | ||||||||||||
3391 | buffer += value; | - | ||||||||||||
3392 | char* envVar = qstrdup(buffer.constData()); | - | ||||||||||||
3393 | int result = putenv(envVar); | - | ||||||||||||
3394 | if (result != 0) // error. we have to delete the string. | - | ||||||||||||
3395 | delete[] envVar; | - | ||||||||||||
3396 | return result == 0; | - | ||||||||||||
3397 | #endif | - | ||||||||||||
3398 | } | - | ||||||||||||
3399 | - | |||||||||||||
3400 | /*! | - | ||||||||||||
3401 | \relates <QtGlobal> | - | ||||||||||||
3402 | - | |||||||||||||
3403 | This function deletes the variable \a varName from the environment. | - | ||||||||||||
3404 | - | |||||||||||||
3405 | Returns \c true on success. | - | ||||||||||||
3406 | - | |||||||||||||
3407 | \since 5.1 | - | ||||||||||||
3408 | - | |||||||||||||
3409 | \sa qputenv(), qgetenv() | - | ||||||||||||
3410 | */ | - | ||||||||||||
3411 | bool qunsetenv(const char *varName) | - | ||||||||||||
3412 | { | - | ||||||||||||
3413 | QMutexLocker locker(&environmentMutex); | - | ||||||||||||
3414 | #if defined(_MSC_VER) && _MSC_VER >= 1400 | - | ||||||||||||
3415 | return _putenv_s(varName, "") == 0; | - | ||||||||||||
3416 | #elif (defined(_POSIX_VERSION) && (_POSIX_VERSION-0) >= 200112L) || defined(Q_OS_BSD4) || defined(Q_OS_HAIKU) | - | ||||||||||||
3417 | // POSIX.1-2001, BSD and Haiku have unsetenv | - | ||||||||||||
3418 | return unsetenv(varName) == 0; | - | ||||||||||||
3419 | #elif defined(Q_CC_MINGW) | - | ||||||||||||
3420 | // On mingw, putenv("var=") removes "var" from the environment | - | ||||||||||||
3421 | QByteArray buffer(varName); | - | ||||||||||||
3422 | buffer += '='; | - | ||||||||||||
3423 | return putenv(buffer.constData()) == 0; | - | ||||||||||||
3424 | #else | - | ||||||||||||
3425 | // Fallback to putenv("var=") which will insert an empty var into the | - | ||||||||||||
3426 | // environment and leak it | - | ||||||||||||
3427 | QByteArray buffer(varName); | - | ||||||||||||
3428 | buffer += '='; | - | ||||||||||||
3429 | char *envVar = qstrdup(buffer.constData()); | - | ||||||||||||
3430 | return putenv(envVar) == 0; | - | ||||||||||||
3431 | #endif | - | ||||||||||||
3432 | } | - | ||||||||||||
3433 | - | |||||||||||||
3434 | #if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && (_POSIX_THREAD_SAFE_FUNCTIONS - 0 > 0) | - | ||||||||||||
3435 | - | |||||||||||||
3436 | # if defined(Q_OS_INTEGRITY) && defined(__GHS_VERSION_NUMBER) && (__GHS_VERSION_NUMBER < 500) | - | ||||||||||||
3437 | // older versions of INTEGRITY used a long instead of a uint for the seed. | - | ||||||||||||
3438 | typedef long SeedStorageType; | - | ||||||||||||
3439 | # else | - | ||||||||||||
3440 | typedef uint SeedStorageType; | - | ||||||||||||
3441 | # endif | - | ||||||||||||
3442 | - | |||||||||||||
3443 | typedef QThreadStorage<SeedStorageType *> SeedStorage; | - | ||||||||||||
3444 | Q_GLOBAL_STATIC(SeedStorage, randTLS) // Thread Local Storage for seed value | - | ||||||||||||
3445 | - | |||||||||||||
3446 | #elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK) | - | ||||||||||||
3447 | typedef QThreadStorage<QJNIObjectPrivate> AndroidRandomStorage; | - | ||||||||||||
3448 | Q_GLOBAL_STATIC(AndroidRandomStorage, randomTLS) | - | ||||||||||||
3449 | #endif | - | ||||||||||||
3450 | - | |||||||||||||
3451 | /*! | - | ||||||||||||
3452 | \relates <QtGlobal> | - | ||||||||||||
3453 | \since 4.2 | - | ||||||||||||
3454 | - | |||||||||||||
3455 | Thread-safe version of the standard C++ \c srand() function. | - | ||||||||||||
3456 | - | |||||||||||||
3457 | Sets the argument \a seed to be used to generate a new random number sequence of | - | ||||||||||||
3458 | pseudo random integers to be returned by qrand(). | - | ||||||||||||
3459 | - | |||||||||||||
3460 | The sequence of random numbers generated is deterministic per thread. For example, | - | ||||||||||||
3461 | if two threads call qsrand(1) and subsequently call qrand(), the threads will get | - | ||||||||||||
3462 | the same random number sequence. | - | ||||||||||||
3463 | - | |||||||||||||
3464 | \sa qrand() | - | ||||||||||||
3465 | */ | - | ||||||||||||
3466 | void qsrand(uint seed) | - | ||||||||||||
3467 | { | - | ||||||||||||
3468 | #if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && (_POSIX_THREAD_SAFE_FUNCTIONS - 0 > 0) | - | ||||||||||||
3469 | SeedStorage *seedStorage = randTLS(); | - | ||||||||||||
3470 | if (seedStorage) {
| 0-30 | ||||||||||||
3471 | SeedStorageType *pseed = seedStorage->localData(); | - | ||||||||||||
3472 | if (!pseed)
| 7-23 | ||||||||||||
3473 | seedStorage->setLocalData(pseed = new SeedStorageType); executed 23 times by 2 tests: seedStorage->setLocalData(pseed = new SeedStorageType); Executed by:
| 23 | ||||||||||||
3474 | *pseed = seed; | - | ||||||||||||
3475 | } else { executed 30 times by 6 tests: end of block Executed by:
| 30 | ||||||||||||
3476 | //global static seed storage should always exist, | - | ||||||||||||
3477 | //except after being deleted by QGlobalStaticDeleter. | - | ||||||||||||
3478 | //But since it still can be called from destructor of another | - | ||||||||||||
3479 | //global static object, fallback to srand(seed) | - | ||||||||||||
3480 | srand(seed); | - | ||||||||||||
3481 | } never executed: end of block | 0 | ||||||||||||
3482 | #elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK) | - | ||||||||||||
3483 | if (randomTLS->hasLocalData()) { | - | ||||||||||||
3484 | randomTLS->localData().callMethod<void>("setSeed", "(J)V", jlong(seed)); | - | ||||||||||||
3485 | return; | - | ||||||||||||
3486 | } | - | ||||||||||||
3487 | - | |||||||||||||
3488 | QJNIObjectPrivate random("java/util/Random", | - | ||||||||||||
3489 | "(J)V", | - | ||||||||||||
3490 | jlong(seed)); | - | ||||||||||||
3491 | if (!random.isValid()) { | - | ||||||||||||
3492 | srand(seed); | - | ||||||||||||
3493 | return; | - | ||||||||||||
3494 | } | - | ||||||||||||
3495 | - | |||||||||||||
3496 | randomTLS->setLocalData(random); | - | ||||||||||||
3497 | #else | - | ||||||||||||
3498 | // On Windows srand() and rand() already use Thread-Local-Storage | - | ||||||||||||
3499 | // to store the seed between calls | - | ||||||||||||
3500 | // this is also valid for QT_NO_THREAD | - | ||||||||||||
3501 | srand(seed); | - | ||||||||||||
3502 | #endif | - | ||||||||||||
3503 | } | - | ||||||||||||
3504 | - | |||||||||||||
3505 | /*! | - | ||||||||||||
3506 | \relates <QtGlobal> | - | ||||||||||||
3507 | \since 4.2 | - | ||||||||||||
3508 | - | |||||||||||||
3509 | Thread-safe version of the standard C++ \c rand() function. | - | ||||||||||||
3510 | - | |||||||||||||
3511 | Returns a value between 0 and \c RAND_MAX (defined in \c <cstdlib> and | - | ||||||||||||
3512 | \c <stdlib.h>), the next number in the current sequence of pseudo-random | - | ||||||||||||
3513 | integers. | - | ||||||||||||
3514 | - | |||||||||||||
3515 | Use \c qsrand() to initialize the pseudo-random number generator with | - | ||||||||||||
3516 | a seed value. | - | ||||||||||||
3517 | - | |||||||||||||
3518 | \sa qsrand() | - | ||||||||||||
3519 | */ | - | ||||||||||||
3520 | int qrand() | - | ||||||||||||
3521 | { | - | ||||||||||||
3522 | #if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && (_POSIX_THREAD_SAFE_FUNCTIONS - 0 > 0) | - | ||||||||||||
3523 | SeedStorage *seedStorage = randTLS(); | - | ||||||||||||
3524 | if (seedStorage) {
| 1-20183031 | ||||||||||||
3525 | SeedStorageType *pseed = seedStorage->localData(); | - | ||||||||||||
3526 | if (!pseed) {
| 649-20182382 | ||||||||||||
3527 | seedStorage->setLocalData(pseed = new SeedStorageType); | - | ||||||||||||
3528 | *pseed = 1; | - | ||||||||||||
3529 | } executed 649 times by 48 tests: end of block Executed by:
| 649 | ||||||||||||
3530 | return rand_r(pseed); executed 20183031 times by 50 tests: return rand_r(pseed); Executed by:
| 20183031 | ||||||||||||
3531 | } else { | - | ||||||||||||
3532 | //global static seed storage should always exist, | - | ||||||||||||
3533 | //except after being deleted by QGlobalStaticDeleter. | - | ||||||||||||
3534 | //But since it still can be called from destructor of another | - | ||||||||||||
3535 | //global static object, fallback to rand() | - | ||||||||||||
3536 | return rand(); executed 1 time by 1 test: return rand(); Executed by:
| 1 | ||||||||||||
3537 | } | - | ||||||||||||
3538 | #elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK) | - | ||||||||||||
3539 | AndroidRandomStorage *randomStorage = randomTLS(); | - | ||||||||||||
3540 | if (!randomStorage) | - | ||||||||||||
3541 | return rand(); | - | ||||||||||||
3542 | - | |||||||||||||
3543 | if (randomStorage->hasLocalData()) { | - | ||||||||||||
3544 | return randomStorage->localData().callMethod<jint>("nextInt", | - | ||||||||||||
3545 | "(I)I", | - | ||||||||||||
3546 | RAND_MAX); | - | ||||||||||||
3547 | } | - | ||||||||||||
3548 | - | |||||||||||||
3549 | QJNIObjectPrivate random("java/util/Random", | - | ||||||||||||
3550 | "(J)V", | - | ||||||||||||
3551 | jlong(1)); | - | ||||||||||||
3552 | - | |||||||||||||
3553 | if (!random.isValid()) | - | ||||||||||||
3554 | return rand(); | - | ||||||||||||
3555 | - | |||||||||||||
3556 | randomStorage->setLocalData(random); | - | ||||||||||||
3557 | return random.callMethod<jint>("nextInt", "(I)I", RAND_MAX); | - | ||||||||||||
3558 | #else | - | ||||||||||||
3559 | // On Windows srand() and rand() already use Thread-Local-Storage | - | ||||||||||||
3560 | // to store the seed between calls | - | ||||||||||||
3561 | // this is also valid for QT_NO_THREAD | - | ||||||||||||
3562 | return rand(); | - | ||||||||||||
3563 | #endif | - | ||||||||||||
3564 | } | - | ||||||||||||
3565 | - | |||||||||||||
3566 | /*! | - | ||||||||||||
3567 | \macro forever | - | ||||||||||||
3568 | \relates <QtGlobal> | - | ||||||||||||
3569 | - | |||||||||||||
3570 | This macro is provided for convenience for writing infinite | - | ||||||||||||
3571 | loops. | - | ||||||||||||
3572 | - | |||||||||||||
3573 | Example: | - | ||||||||||||
3574 | - | |||||||||||||
3575 | \snippet code/src_corelib_global_qglobal.cpp 31 | - | ||||||||||||
3576 | - | |||||||||||||
3577 | It is equivalent to \c{for (;;)}. | - | ||||||||||||
3578 | - | |||||||||||||
3579 | If you're worried about namespace pollution, you can disable this | - | ||||||||||||
3580 | macro by adding the following line to your \c .pro file: | - | ||||||||||||
3581 | - | |||||||||||||
3582 | \snippet code/src_corelib_global_qglobal.cpp 32 | - | ||||||||||||
3583 | - | |||||||||||||
3584 | \sa Q_FOREVER | - | ||||||||||||
3585 | */ | - | ||||||||||||
3586 | - | |||||||||||||
3587 | /*! | - | ||||||||||||
3588 | \macro Q_FOREVER | - | ||||||||||||
3589 | \relates <QtGlobal> | - | ||||||||||||
3590 | - | |||||||||||||
3591 | Same as \l{forever}. | - | ||||||||||||
3592 | - | |||||||||||||
3593 | This macro is available even when \c no_keywords is specified | - | ||||||||||||
3594 | using the \c .pro file's \c CONFIG variable. | - | ||||||||||||
3595 | - | |||||||||||||
3596 | \sa foreach() | - | ||||||||||||
3597 | */ | - | ||||||||||||
3598 | - | |||||||||||||
3599 | /*! | - | ||||||||||||
3600 | \macro foreach(variable, container) | - | ||||||||||||
3601 | \relates <QtGlobal> | - | ||||||||||||
3602 | - | |||||||||||||
3603 | This macro is used to implement Qt's \c foreach loop. The \a | - | ||||||||||||
3604 | variable parameter is a variable name or variable definition; the | - | ||||||||||||
3605 | \a container parameter is a Qt container whose value type | - | ||||||||||||
3606 | corresponds to the type of the variable. See \l{The foreach | - | ||||||||||||
3607 | Keyword} for details. | - | ||||||||||||
3608 | - | |||||||||||||
3609 | If you're worried about namespace pollution, you can disable this | - | ||||||||||||
3610 | macro by adding the following line to your \c .pro file: | - | ||||||||||||
3611 | - | |||||||||||||
3612 | \snippet code/src_corelib_global_qglobal.cpp 33 | - | ||||||||||||
3613 | - | |||||||||||||
3614 | \note Since Qt 5.7, the use of this macro is discouraged. It will | - | ||||||||||||
3615 | be removed in a future version of Qt. Please use C++11 range-for, | - | ||||||||||||
3616 | possibly with qAsConst(), as needed. | - | ||||||||||||
3617 | - | |||||||||||||
3618 | \sa qAsConst() | - | ||||||||||||
3619 | */ | - | ||||||||||||
3620 | - | |||||||||||||
3621 | /*! | - | ||||||||||||
3622 | \macro Q_FOREACH(variable, container) | - | ||||||||||||
3623 | \relates <QtGlobal> | - | ||||||||||||
3624 | - | |||||||||||||
3625 | Same as foreach(\a variable, \a container). | - | ||||||||||||
3626 | - | |||||||||||||
3627 | This macro is available even when \c no_keywords is specified | - | ||||||||||||
3628 | using the \c .pro file's \c CONFIG variable. | - | ||||||||||||
3629 | - | |||||||||||||
3630 | \note Since Qt 5.7, the use of this macro is discouraged. It will | - | ||||||||||||
3631 | be removed in a future version of Qt. Please use C++11 range-for, | - | ||||||||||||
3632 | possibly with qAsConst(), as needed. | - | ||||||||||||
3633 | - | |||||||||||||
3634 | \sa qAsConst() | - | ||||||||||||
3635 | */ | - | ||||||||||||
3636 | - | |||||||||||||
3637 | /*! | - | ||||||||||||
3638 | \fn qAsConst(T &t) | - | ||||||||||||
3639 | \relates <QtGlobal> | - | ||||||||||||
3640 | \since 5.7 | - | ||||||||||||
3641 | - | |||||||||||||
3642 | Returns \a t cast to \c{const T}. | - | ||||||||||||
3643 | - | |||||||||||||
3644 | This function is a Qt implementation of C++17's std::as_const(), | - | ||||||||||||
3645 | a cast function like std::move(). But while std::move() turns | - | ||||||||||||
3646 | lvalues into rvalues, this function turns non-const lvalues into | - | ||||||||||||
3647 | const lvalues. Like std::as_const(), it doesn't work on rvalues, | - | ||||||||||||
3648 | because it cannot be efficiently implemented for rvalues without | - | ||||||||||||
3649 | leaving dangling references. | - | ||||||||||||
3650 | - | |||||||||||||
3651 | Its main use in Qt is to prevent implicitly-shared Qt containers | - | ||||||||||||
3652 | from detaching: | - | ||||||||||||
3653 | \code | - | ||||||||||||
3654 | QString s = ...; | - | ||||||||||||
3655 | for (QChar ch : s) // detaches 's' (performs a deep-copy if 's' was shared) | - | ||||||||||||
3656 | process(ch); | - | ||||||||||||
3657 | for (QChar ch : qAsConst(s)) // ok, no detach attempt | - | ||||||||||||
3658 | process(ch); | - | ||||||||||||
3659 | \endcode | - | ||||||||||||
3660 | - | |||||||||||||
3661 | Of course, in this case, you could (and probably should) have declared | - | ||||||||||||
3662 | \c s as \c const in the first place: | - | ||||||||||||
3663 | \code | - | ||||||||||||
3664 | const QString s = ...; | - | ||||||||||||
3665 | for (QChar ch : s) // ok, no detach attempt on const objects | - | ||||||||||||
3666 | process(ch); | - | ||||||||||||
3667 | \endcode | - | ||||||||||||
3668 | but often that is not easily possible. | - | ||||||||||||
3669 | - | |||||||||||||
3670 | It is important to note that qAsConst() does not copy its argument, | - | ||||||||||||
3671 | it just performs a \c{const_cast<const T&>(t)}. This is also the reason | - | ||||||||||||
3672 | why it is designed to fail for rvalues: The returned reference would go | - | ||||||||||||
3673 | stale too soon. So while this works (but detaches the returned object): | - | ||||||||||||
3674 | \code | - | ||||||||||||
3675 | for (QChar ch : funcReturningQString()) | - | ||||||||||||
3676 | process(ch); // OK, the returned object is kept alive for the loop's duration | - | ||||||||||||
3677 | \endcode | - | ||||||||||||
3678 | - | |||||||||||||
3679 | this would not: | - | ||||||||||||
3680 | \code | - | ||||||||||||
3681 | for (QChar ch : qAsConst(funcReturningQString())) | - | ||||||||||||
3682 | process(ch); // ERROR: ch is copied from deleted memory | - | ||||||||||||
3683 | \endcode | - | ||||||||||||
3684 | - | |||||||||||||
3685 | To prevent this construct from compiling (and failing at runtime), qAsConst() has | - | ||||||||||||
3686 | a second, deleted, overload which binds to rvalues. | - | ||||||||||||
3687 | */ | - | ||||||||||||
3688 | - | |||||||||||||
3689 | /*! | - | ||||||||||||
3690 | \fn qAsConst(const T &&t) | - | ||||||||||||
3691 | \relates <QtGlobal> | - | ||||||||||||
3692 | \since 5.7 | - | ||||||||||||
3693 | \overload | - | ||||||||||||
3694 | - | |||||||||||||
3695 | This overload is deleted to prevent a dangling reference in code like | - | ||||||||||||
3696 | \code | - | ||||||||||||
3697 | for (QChar ch : qAsConst(funcReturningQString())) | - | ||||||||||||
3698 | process(ch); // ERROR: ch is copied from deleted memory | - | ||||||||||||
3699 | \endcode | - | ||||||||||||
3700 | */ | - | ||||||||||||
3701 | - | |||||||||||||
3702 | /*! | - | ||||||||||||
3703 | \macro QT_TR_NOOP(sourceText) | - | ||||||||||||
3704 | \relates <QtGlobal> | - | ||||||||||||
3705 | - | |||||||||||||
3706 | Marks the string literal \a sourceText for dynamic translation in | - | ||||||||||||
3707 | the current context (class), i.e the stored \a sourceText will not | - | ||||||||||||
3708 | be altered. | - | ||||||||||||
3709 | - | |||||||||||||
3710 | The macro expands to \a sourceText. | - | ||||||||||||
3711 | - | |||||||||||||
3712 | Example: | - | ||||||||||||
3713 | - | |||||||||||||
3714 | \snippet code/src_corelib_global_qglobal.cpp 34 | - | ||||||||||||
3715 | - | |||||||||||||
3716 | The macro QT_TR_NOOP_UTF8() is identical except that it tells lupdate | - | ||||||||||||
3717 | that the source string is encoded in UTF-8. Corresponding variants | - | ||||||||||||
3718 | exist in the QT_TRANSLATE_NOOP() family of macros, too. | - | ||||||||||||
3719 | - | |||||||||||||
3720 | \sa QT_TRANSLATE_NOOP(), {Internationalization with Qt} | - | ||||||||||||
3721 | */ | - | ||||||||||||
3722 | - | |||||||||||||
3723 | /*! | - | ||||||||||||
3724 | \macro QT_TRANSLATE_NOOP(context, sourceText) | - | ||||||||||||
3725 | \relates <QtGlobal> | - | ||||||||||||
3726 | - | |||||||||||||
3727 | Marks the string literal \a sourceText for dynamic translation in | - | ||||||||||||
3728 | the given \a context; i.e, the stored \a sourceText will not be | - | ||||||||||||
3729 | altered. The \a context is typically a class and also needs to | - | ||||||||||||
3730 | be specified as string literal. | - | ||||||||||||
3731 | - | |||||||||||||
3732 | The macro expands to \a sourceText. | - | ||||||||||||
3733 | - | |||||||||||||
3734 | Example: | - | ||||||||||||
3735 | - | |||||||||||||
3736 | \snippet code/src_corelib_global_qglobal.cpp 35 | - | ||||||||||||
3737 | - | |||||||||||||
3738 | \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP3(), {Internationalization with Qt} | - | ||||||||||||
3739 | */ | - | ||||||||||||
3740 | - | |||||||||||||
3741 | /*! | - | ||||||||||||
3742 | \macro QT_TRANSLATE_NOOP3(context, sourceText, comment) | - | ||||||||||||
3743 | \relates <QtGlobal> | - | ||||||||||||
3744 | \since 4.4 | - | ||||||||||||
3745 | - | |||||||||||||
3746 | Marks the string literal \a sourceText for dynamic translation in the | - | ||||||||||||
3747 | given \a context and with \a comment, i.e the stored \a sourceText will | - | ||||||||||||
3748 | not be altered. The \a context is typically a class and also needs to | - | ||||||||||||
3749 | be specified as string literal. The string literal \a comment | - | ||||||||||||
3750 | will be available for translators using e.g. Qt Linguist. | - | ||||||||||||
3751 | - | |||||||||||||
3752 | The macro expands to anonymous struct of the two string | - | ||||||||||||
3753 | literals passed as \a sourceText and \a comment. | - | ||||||||||||
3754 | - | |||||||||||||
3755 | Example: | - | ||||||||||||
3756 | - | |||||||||||||
3757 | \snippet code/src_corelib_global_qglobal.cpp 36 | - | ||||||||||||
3758 | - | |||||||||||||
3759 | \sa QT_TR_NOOP(), QT_TRANSLATE_NOOP(), {Internationalization with Qt} | - | ||||||||||||
3760 | */ | - | ||||||||||||
3761 | - | |||||||||||||
3762 | /*! | - | ||||||||||||
3763 | \fn QString qtTrId(const char *id, int n = -1) | - | ||||||||||||
3764 | \relates <QtGlobal> | - | ||||||||||||
3765 | \reentrant | - | ||||||||||||
3766 | \since 4.6 | - | ||||||||||||
3767 | - | |||||||||||||
3768 | \brief The qtTrId function finds and returns a translated string. | - | ||||||||||||
3769 | - | |||||||||||||
3770 | Returns a translated string identified by \a id. | - | ||||||||||||
3771 | If no matching string is found, the id itself is returned. This | - | ||||||||||||
3772 | should not happen under normal conditions. | - | ||||||||||||
3773 | - | |||||||||||||
3774 | If \a n >= 0, all occurrences of \c %n in the resulting string | - | ||||||||||||
3775 | are replaced with a decimal representation of \a n. In addition, | - | ||||||||||||
3776 | depending on \a n's value, the translation text may vary. | - | ||||||||||||
3777 | - | |||||||||||||
3778 | Meta data and comments can be passed as documented for QObject::tr(). | - | ||||||||||||
3779 | In addition, it is possible to supply a source string template like that: | - | ||||||||||||
3780 | - | |||||||||||||
3781 | \tt{//% <C string>} | - | ||||||||||||
3782 | - | |||||||||||||
3783 | or | - | ||||||||||||
3784 | - | |||||||||||||
3785 | \tt{\\begincomment% <C string> \\endcomment} | - | ||||||||||||
3786 | - | |||||||||||||
3787 | Example: | - | ||||||||||||
3788 | - | |||||||||||||
3789 | \snippet code/src_corelib_global_qglobal.cpp qttrid | - | ||||||||||||
3790 | - | |||||||||||||
3791 | Creating QM files suitable for use with this function requires passing | - | ||||||||||||
3792 | the \c -idbased option to the \c lrelease tool. | - | ||||||||||||
3793 | - | |||||||||||||
3794 | \warning This method is reentrant only if all translators are | - | ||||||||||||
3795 | installed \e before calling this method. Installing or removing | - | ||||||||||||
3796 | translators while performing translations is not supported. Doing | - | ||||||||||||
3797 | so will probably result in crashes or other undesirable behavior. | - | ||||||||||||
3798 | - | |||||||||||||
3799 | \sa QObject::tr(), QCoreApplication::translate(), {Internationalization with Qt} | - | ||||||||||||
3800 | */ | - | ||||||||||||
3801 | - | |||||||||||||
3802 | /*! | - | ||||||||||||
3803 | \macro QT_TRID_NOOP(id) | - | ||||||||||||
3804 | \relates <QtGlobal> | - | ||||||||||||
3805 | \since 4.6 | - | ||||||||||||
3806 | - | |||||||||||||
3807 | \brief The QT_TRID_NOOP macro marks an id for dynamic translation. | - | ||||||||||||
3808 | - | |||||||||||||
3809 | The only purpose of this macro is to provide an anchor for attaching | - | ||||||||||||
3810 | meta data like to qtTrId(). | - | ||||||||||||
3811 | - | |||||||||||||
3812 | The macro expands to \a id. | - | ||||||||||||
3813 | - | |||||||||||||
3814 | Example: | - | ||||||||||||
3815 | - | |||||||||||||
3816 | \snippet code/src_corelib_global_qglobal.cpp qttrid_noop | - | ||||||||||||
3817 | - | |||||||||||||
3818 | \sa qtTrId(), {Internationalization with Qt} | - | ||||||||||||
3819 | */ | - | ||||||||||||
3820 | - | |||||||||||||
3821 | /*! | - | ||||||||||||
3822 | \macro Q_LIKELY(expr) | - | ||||||||||||
3823 | \relates <QtGlobal> | - | ||||||||||||
3824 | \since 4.8 | - | ||||||||||||
3825 | - | |||||||||||||
3826 | \brief Hints to the compiler that the enclosed condition, \a expr, is | - | ||||||||||||
3827 | likely to evaluate to \c true. | - | ||||||||||||
3828 | - | |||||||||||||
3829 | Use of this macro can help the compiler to optimize the code. | - | ||||||||||||
3830 | - | |||||||||||||
3831 | Example: | - | ||||||||||||
3832 | - | |||||||||||||
3833 | \snippet code/src_corelib_global_qglobal.cpp qlikely | - | ||||||||||||
3834 | - | |||||||||||||
3835 | \sa Q_UNLIKELY() | - | ||||||||||||
3836 | */ | - | ||||||||||||
3837 | - | |||||||||||||
3838 | /*! | - | ||||||||||||
3839 | \macro Q_UNLIKELY(expr) | - | ||||||||||||
3840 | \relates <QtGlobal> | - | ||||||||||||
3841 | \since 4.8 | - | ||||||||||||
3842 | - | |||||||||||||
3843 | \brief Hints to the compiler that the enclosed condition, \a expr, is | - | ||||||||||||
3844 | likely to evaluate to \c false. | - | ||||||||||||
3845 | - | |||||||||||||
3846 | Use of this macro can help the compiler to optimize the code. | - | ||||||||||||
3847 | - | |||||||||||||
3848 | Example: | - | ||||||||||||
3849 | - | |||||||||||||
3850 | \snippet code/src_corelib_global_qglobal.cpp qunlikely | - | ||||||||||||
3851 | - | |||||||||||||
3852 | \sa Q_LIKELY() | - | ||||||||||||
3853 | */ | - | ||||||||||||
3854 | - | |||||||||||||
3855 | /*! | - | ||||||||||||
3856 | \macro QT_POINTER_SIZE | - | ||||||||||||
3857 | \relates <QtGlobal> | - | ||||||||||||
3858 | - | |||||||||||||
3859 | Expands to the size of a pointer in bytes (4 or 8). This is | - | ||||||||||||
3860 | equivalent to \c sizeof(void *) but can be used in a preprocessor | - | ||||||||||||
3861 | directive. | - | ||||||||||||
3862 | */ | - | ||||||||||||
3863 | - | |||||||||||||
3864 | /*! | - | ||||||||||||
3865 | \macro QABS(n) | - | ||||||||||||
3866 | \relates <QtGlobal> | - | ||||||||||||
3867 | \obsolete | - | ||||||||||||
3868 | - | |||||||||||||
3869 | Use qAbs(\a n) instead. | - | ||||||||||||
3870 | - | |||||||||||||
3871 | \sa QMIN(), QMAX() | - | ||||||||||||
3872 | */ | - | ||||||||||||
3873 | - | |||||||||||||
3874 | /*! | - | ||||||||||||
3875 | \macro QMIN(x, y) | - | ||||||||||||
3876 | \relates <QtGlobal> | - | ||||||||||||
3877 | \obsolete | - | ||||||||||||
3878 | - | |||||||||||||
3879 | Use qMin(\a x, \a y) instead. | - | ||||||||||||
3880 | - | |||||||||||||
3881 | \sa QMAX(), QABS() | - | ||||||||||||
3882 | */ | - | ||||||||||||
3883 | - | |||||||||||||
3884 | /*! | - | ||||||||||||
3885 | \macro QMAX(x, y) | - | ||||||||||||
3886 | \relates <QtGlobal> | - | ||||||||||||
3887 | \obsolete | - | ||||||||||||
3888 | - | |||||||||||||
3889 | Use qMax(\a x, \a y) instead. | - | ||||||||||||
3890 | - | |||||||||||||
3891 | \sa QMIN(), QABS() | - | ||||||||||||
3892 | */ | - | ||||||||||||
3893 | - | |||||||||||||
3894 | /*! | - | ||||||||||||
3895 | \macro const char *qPrintable(const QString &str) | - | ||||||||||||
3896 | \relates <QtGlobal> | - | ||||||||||||
3897 | - | |||||||||||||
3898 | Returns \a str as a \c{const char *}. This is equivalent to | - | ||||||||||||
3899 | \a{str}.toLocal8Bit().constData(). | - | ||||||||||||
3900 | - | |||||||||||||
3901 | The char pointer will be invalid after the statement in which | - | ||||||||||||
3902 | qPrintable() is used. This is because the array returned by | - | ||||||||||||
3903 | QString::toLocal8Bit() will fall out of scope. | - | ||||||||||||
3904 | - | |||||||||||||
3905 | \note qDebug(), qInfo(), qWarning(), qCritical(), qFatal() expect | - | ||||||||||||
3906 | %s arguments to be UTF-8 encoded, while qPrintable() converts to | - | ||||||||||||
3907 | local 8-bit encoding. Therefore qUtf8Printable() should be used | - | ||||||||||||
3908 | for logging strings instead of qPrintable(). | - | ||||||||||||
3909 | - | |||||||||||||
3910 | \sa qUtf8Printable() | - | ||||||||||||
3911 | */ | - | ||||||||||||
3912 | - | |||||||||||||
3913 | /*! | - | ||||||||||||
3914 | \macro const char *qUtf8Printable(const QString &str) | - | ||||||||||||
3915 | \relates <QtGlobal> | - | ||||||||||||
3916 | \since 5.4 | - | ||||||||||||
3917 | - | |||||||||||||
3918 | Returns \a str as a \c{const char *}. This is equivalent to | - | ||||||||||||
3919 | \a{str}.toUtf8().constData(). | - | ||||||||||||
3920 | - | |||||||||||||
3921 | The char pointer will be invalid after the statement in which | - | ||||||||||||
3922 | qUtf8Printable() is used. This is because the array returned by | - | ||||||||||||
3923 | QString::toUtf8() will fall out of scope. | - | ||||||||||||
3924 | - | |||||||||||||
3925 | Example: | - | ||||||||||||
3926 | - | |||||||||||||
3927 | \snippet code/src_corelib_global_qglobal.cpp 37 | - | ||||||||||||
3928 | - | |||||||||||||
3929 | \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal() | - | ||||||||||||
3930 | */ | - | ||||||||||||
3931 | - | |||||||||||||
3932 | /*! | - | ||||||||||||
3933 | \macro const wchar_t *qUtf16Printable(const QString &str) | - | ||||||||||||
3934 | \relates <QtGlobal> | - | ||||||||||||
3935 | \since 5.7 | - | ||||||||||||
3936 | - | |||||||||||||
3937 | Returns \a str as a \c{const ushort *}, but cast to a \c{const wchar_t *} | - | ||||||||||||
3938 | to avoid warnings. This is equivalent to \a{str}.utf16() plus some casting. | - | ||||||||||||
3939 | - | |||||||||||||
3940 | The only useful thing you can do with the return value of this macro is to | - | ||||||||||||
3941 | pass it to QString::asprintf() for use in a \c{%ls} conversion. In particular, | - | ||||||||||||
3942 | the return value is \e{not} a valid \c{const wchar_t*}! | - | ||||||||||||
3943 | - | |||||||||||||
3944 | In general, the pointer will be invalid after the statement in which | - | ||||||||||||
3945 | qUtf16Printable() is used. This is because the pointer may have been | - | ||||||||||||
3946 | obtained from a temporary expression, which will fall out of scope. | - | ||||||||||||
3947 | - | |||||||||||||
3948 | Example: | - | ||||||||||||
3949 | - | |||||||||||||
3950 | \snippet code/src_corelib_global_qglobal.cpp qUtf16Printable | - | ||||||||||||
3951 | - | |||||||||||||
3952 | \sa qPrintable(), qDebug(), qInfo(), qWarning(), qCritical(), qFatal() | - | ||||||||||||
3953 | */ | - | ||||||||||||
3954 | - | |||||||||||||
3955 | /*! | - | ||||||||||||
3956 | \macro Q_DECLARE_TYPEINFO(Type, Flags) | - | ||||||||||||
3957 | \relates <QtGlobal> | - | ||||||||||||
3958 | - | |||||||||||||
3959 | You can use this macro to specify information about a custom type | - | ||||||||||||
3960 | \a Type. With accurate type information, Qt's \l{Container Classes} | - | ||||||||||||
3961 | {generic containers} can choose appropriate storage methods and | - | ||||||||||||
3962 | algorithms. | - | ||||||||||||
3963 | - | |||||||||||||
3964 | \a Flags can be one of the following: | - | ||||||||||||
3965 | - | |||||||||||||
3966 | \list | - | ||||||||||||
3967 | \li \c Q_PRIMITIVE_TYPE specifies that \a Type is a POD (plain old | - | ||||||||||||
3968 | data) type with no constructor or destructor, or else a type where | - | ||||||||||||
3969 | every bit pattern is a valid object and memcpy() creates a valid | - | ||||||||||||
3970 | independent copy of the object. | - | ||||||||||||
3971 | \li \c Q_MOVABLE_TYPE specifies that \a Type has a constructor | - | ||||||||||||
3972 | and/or a destructor but can be moved in memory using \c | - | ||||||||||||
3973 | memcpy(). Note: despite the name, this has nothing to do with move | - | ||||||||||||
3974 | constructors or C++ move semantics. | - | ||||||||||||
3975 | \li \c Q_COMPLEX_TYPE (the default) specifies that \a Type has | - | ||||||||||||
3976 | constructors and/or a destructor and that it may not be moved | - | ||||||||||||
3977 | in memory. | - | ||||||||||||
3978 | \endlist | - | ||||||||||||
3979 | - | |||||||||||||
3980 | Example of a "primitive" type: | - | ||||||||||||
3981 | - | |||||||||||||
3982 | \snippet code/src_corelib_global_qglobal.cpp 38 | - | ||||||||||||
3983 | - | |||||||||||||
3984 | An example of a non-POD "primitive" type is QUuid: Even though | - | ||||||||||||
3985 | QUuid has constructors (and therefore isn't POD), every bit | - | ||||||||||||
3986 | pattern still represents a valid object, and memcpy() can be used | - | ||||||||||||
3987 | to create a valid independent copy of a QUuid object. | - | ||||||||||||
3988 | - | |||||||||||||
3989 | Example of a movable type: | - | ||||||||||||
3990 | - | |||||||||||||
3991 | \snippet code/src_corelib_global_qglobal.cpp 39 | - | ||||||||||||
3992 | */ | - | ||||||||||||
3993 | - | |||||||||||||
3994 | /*! | - | ||||||||||||
3995 | \macro Q_UNUSED(name) | - | ||||||||||||
3996 | \relates <QtGlobal> | - | ||||||||||||
3997 | - | |||||||||||||
3998 | Indicates to the compiler that the parameter with the specified | - | ||||||||||||
3999 | \a name is not used in the body of a function. This can be used to | - | ||||||||||||
4000 | suppress compiler warnings while allowing functions to be defined | - | ||||||||||||
4001 | with meaningful parameter names in their signatures. | - | ||||||||||||
4002 | */ | - | ||||||||||||
4003 | - | |||||||||||||
4004 | struct QInternal_CallBackTable { | - | ||||||||||||
4005 | QVector<QList<qInternalCallback> > callbacks; | - | ||||||||||||
4006 | }; | - | ||||||||||||
4007 | - | |||||||||||||
4008 | Q_GLOBAL_STATIC(QInternal_CallBackTable, global_callback_table) | - | ||||||||||||
4009 | - | |||||||||||||
4010 | bool QInternal::registerCallback(Callback cb, qInternalCallback callback) | - | ||||||||||||
4011 | { | - | ||||||||||||
4012 | if (cb >= 0 && cb < QInternal::LastCallback) { | - | ||||||||||||
4013 | QInternal_CallBackTable *cbt = global_callback_table(); | - | ||||||||||||
4014 | cbt->callbacks.resize(cb + 1); | - | ||||||||||||
4015 | cbt->callbacks[cb].append(callback); | - | ||||||||||||
4016 | return true; | - | ||||||||||||
4017 | } | - | ||||||||||||
4018 | return false; | - | ||||||||||||
4019 | } | - | ||||||||||||
4020 | - | |||||||||||||
4021 | bool QInternal::unregisterCallback(Callback cb, qInternalCallback callback) | - | ||||||||||||
4022 | { | - | ||||||||||||
4023 | if (cb >= 0 && cb < QInternal::LastCallback) { | - | ||||||||||||
4024 | QInternal_CallBackTable *cbt = global_callback_table(); | - | ||||||||||||
4025 | return (bool) cbt->callbacks[cb].removeAll(callback); | - | ||||||||||||
4026 | } | - | ||||||||||||
4027 | return false; | - | ||||||||||||
4028 | } | - | ||||||||||||
4029 | - | |||||||||||||
4030 | bool QInternal::activateCallbacks(Callback cb, void **parameters) | - | ||||||||||||
4031 | { | - | ||||||||||||
4032 | Q_ASSERT_X(cb >= 0, "QInternal::activateCallback()", "Callback id must be a valid id"); | - | ||||||||||||
4033 | - | |||||||||||||
4034 | QInternal_CallBackTable *cbt = global_callback_table(); | - | ||||||||||||
4035 | if (cbt && cb < cbt->callbacks.size()) { | - | ||||||||||||
4036 | QList<qInternalCallback> callbacks = cbt->callbacks[cb]; | - | ||||||||||||
4037 | bool ret = false; | - | ||||||||||||
4038 | for (int i=0; i<callbacks.size(); ++i) | - | ||||||||||||
4039 | ret |= (callbacks.at(i))(parameters); | - | ||||||||||||
4040 | return ret; | - | ||||||||||||
4041 | } | - | ||||||||||||
4042 | return false; | - | ||||||||||||
4043 | } | - | ||||||||||||
4044 | - | |||||||||||||
4045 | /*! | - | ||||||||||||
4046 | \macro Q_BYTE_ORDER | - | ||||||||||||
4047 | \relates <QtGlobal> | - | ||||||||||||
4048 | - | |||||||||||||
4049 | This macro can be used to determine the byte order your system | - | ||||||||||||
4050 | uses for storing data in memory. i.e., whether your system is | - | ||||||||||||
4051 | little-endian or big-endian. It is set by Qt to one of the macros | - | ||||||||||||
4052 | Q_LITTLE_ENDIAN or Q_BIG_ENDIAN. You normally won't need to worry | - | ||||||||||||
4053 | about endian-ness, but you might, for example if you need to know | - | ||||||||||||
4054 | which byte of an integer or UTF-16 character is stored in the | - | ||||||||||||
4055 | lowest address. Endian-ness is important in networking, where | - | ||||||||||||
4056 | computers with different values for Q_BYTE_ORDER must pass data | - | ||||||||||||
4057 | back and forth. | - | ||||||||||||
4058 | - | |||||||||||||
4059 | Use this macro as in the following examples. | - | ||||||||||||
4060 | - | |||||||||||||
4061 | \snippet code/src_corelib_global_qglobal.cpp 40 | - | ||||||||||||
4062 | - | |||||||||||||
4063 | \sa Q_BIG_ENDIAN, Q_LITTLE_ENDIAN | - | ||||||||||||
4064 | */ | - | ||||||||||||
4065 | - | |||||||||||||
4066 | /*! | - | ||||||||||||
4067 | \macro Q_LITTLE_ENDIAN | - | ||||||||||||
4068 | \relates <QtGlobal> | - | ||||||||||||
4069 | - | |||||||||||||
4070 | This macro represents a value you can compare to the macro | - | ||||||||||||
4071 | Q_BYTE_ORDER to determine the endian-ness of your system. In a | - | ||||||||||||
4072 | little-endian system, the least significant byte is stored at the | - | ||||||||||||
4073 | lowest address. The other bytes follow in increasing order of | - | ||||||||||||
4074 | significance. | - | ||||||||||||
4075 | - | |||||||||||||
4076 | \snippet code/src_corelib_global_qglobal.cpp 41 | - | ||||||||||||
4077 | - | |||||||||||||
4078 | \sa Q_BYTE_ORDER, Q_BIG_ENDIAN | - | ||||||||||||
4079 | */ | - | ||||||||||||
4080 | - | |||||||||||||
4081 | /*! | - | ||||||||||||
4082 | \macro Q_BIG_ENDIAN | - | ||||||||||||
4083 | \relates <QtGlobal> | - | ||||||||||||
4084 | - | |||||||||||||
4085 | This macro represents a value you can compare to the macro | - | ||||||||||||
4086 | Q_BYTE_ORDER to determine the endian-ness of your system. In a | - | ||||||||||||
4087 | big-endian system, the most significant byte is stored at the | - | ||||||||||||
4088 | lowest address. The other bytes follow in decreasing order of | - | ||||||||||||
4089 | significance. | - | ||||||||||||
4090 | - | |||||||||||||
4091 | \snippet code/src_corelib_global_qglobal.cpp 42 | - | ||||||||||||
4092 | - | |||||||||||||
4093 | \sa Q_BYTE_ORDER, Q_LITTLE_ENDIAN | - | ||||||||||||
4094 | */ | - | ||||||||||||
4095 | - | |||||||||||||
4096 | /*! | - | ||||||||||||
4097 | \macro Q_GLOBAL_STATIC(type, name) | - | ||||||||||||
4098 | \internal | - | ||||||||||||
4099 | - | |||||||||||||
4100 | Declares a global static variable with the given \a type and \a name. | - | ||||||||||||
4101 | - | |||||||||||||
4102 | Use this macro to instantiate an object in a thread-safe way, creating | - | ||||||||||||
4103 | a global pointer that can be used to refer to it. | - | ||||||||||||
4104 | - | |||||||||||||
4105 | \warning This macro is subject to a race condition that can cause the object | - | ||||||||||||
4106 | to be constructed twice. However, if this occurs, the second instance will | - | ||||||||||||
4107 | be immediately deleted. | - | ||||||||||||
4108 | - | |||||||||||||
4109 | See also | - | ||||||||||||
4110 | \l{http://www.aristeia.com/publications.html}{"C++ and the perils of Double-Checked Locking"} | - | ||||||||||||
4111 | by Scott Meyers and Andrei Alexandrescu. | - | ||||||||||||
4112 | */ | - | ||||||||||||
4113 | - | |||||||||||||
4114 | /*! | - | ||||||||||||
4115 | \macro Q_GLOBAL_STATIC_WITH_ARGS(type, name, arguments) | - | ||||||||||||
4116 | \internal | - | ||||||||||||
4117 | - | |||||||||||||
4118 | Declares a global static variable with the specified \a type and \a name. | - | ||||||||||||
4119 | - | |||||||||||||
4120 | Use this macro to instantiate an object using the \a arguments specified | - | ||||||||||||
4121 | in a thread-safe way, creating a global pointer that can be used to refer | - | ||||||||||||
4122 | to it. | - | ||||||||||||
4123 | - | |||||||||||||
4124 | \warning This macro is subject to a race condition that can cause the object | - | ||||||||||||
4125 | to be constructed twice. However, if this occurs, the second instance will | - | ||||||||||||
4126 | be immediately deleted. | - | ||||||||||||
4127 | - | |||||||||||||
4128 | See also | - | ||||||||||||
4129 | \l{http://www.aristeia.com/publications.html}{"C++ and the perils of Double-Checked Locking"} | - | ||||||||||||
4130 | by Scott Meyers and Andrei Alexandrescu. | - | ||||||||||||
4131 | */ | - | ||||||||||||
4132 | - | |||||||||||||
4133 | /*! | - | ||||||||||||
4134 | \macro QT_NAMESPACE | - | ||||||||||||
4135 | \internal | - | ||||||||||||
4136 | - | |||||||||||||
4137 | If this macro is defined to \c ns all Qt classes are put in a namespace | - | ||||||||||||
4138 | called \c ns. Also, moc will output code putting metaobjects etc. | - | ||||||||||||
4139 | into namespace \c ns. | - | ||||||||||||
4140 | - | |||||||||||||
4141 | \sa QT_BEGIN_NAMESPACE, QT_END_NAMESPACE, | - | ||||||||||||
4142 | QT_PREPEND_NAMESPACE, QT_USE_NAMESPACE, | - | ||||||||||||
4143 | QT_BEGIN_INCLUDE_NAMESPACE, QT_END_INCLUDE_NAMESPACE, | - | ||||||||||||
4144 | QT_BEGIN_MOC_NAMESPACE, QT_END_MOC_NAMESPACE, | - | ||||||||||||
4145 | */ | - | ||||||||||||
4146 | - | |||||||||||||
4147 | /*! | - | ||||||||||||
4148 | \macro QT_PREPEND_NAMESPACE(identifier) | - | ||||||||||||
4149 | \internal | - | ||||||||||||
4150 | - | |||||||||||||
4151 | This macro qualifies \a identifier with the full namespace. | - | ||||||||||||
4152 | It expands to \c{::QT_NAMESPACE::identifier} if \c QT_NAMESPACE is defined | - | ||||||||||||
4153 | and only \a identifier otherwise. | - | ||||||||||||
4154 | - | |||||||||||||
4155 | \sa QT_NAMESPACE | - | ||||||||||||
4156 | */ | - | ||||||||||||
4157 | - | |||||||||||||
4158 | /*! | - | ||||||||||||
4159 | \macro QT_USE_NAMESPACE | - | ||||||||||||
4160 | \internal | - | ||||||||||||
4161 | - | |||||||||||||
4162 | This macro expands to using QT_NAMESPACE if QT_NAMESPACE is defined | - | ||||||||||||
4163 | and nothing otherwise. | - | ||||||||||||
4164 | - | |||||||||||||
4165 | \sa QT_NAMESPACE | - | ||||||||||||
4166 | */ | - | ||||||||||||
4167 | - | |||||||||||||
4168 | /*! | - | ||||||||||||
4169 | \macro QT_BEGIN_NAMESPACE | - | ||||||||||||
4170 | \internal | - | ||||||||||||
4171 | - | |||||||||||||
4172 | This macro expands to | - | ||||||||||||
4173 | - | |||||||||||||
4174 | \snippet code/src_corelib_global_qglobal.cpp begin namespace macro | - | ||||||||||||
4175 | - | |||||||||||||
4176 | if \c QT_NAMESPACE is defined and nothing otherwise. If should always | - | ||||||||||||
4177 | appear in the file-level scope and be followed by \c QT_END_NAMESPACE | - | ||||||||||||
4178 | at the same logical level with respect to preprocessor conditionals | - | ||||||||||||
4179 | in the same file. | - | ||||||||||||
4180 | - | |||||||||||||
4181 | As a rule of thumb, \c QT_BEGIN_NAMESPACE should appear in all Qt header | - | ||||||||||||
4182 | and Qt source files after the last \c{#include} line and before the first | - | ||||||||||||
4183 | declaration. | - | ||||||||||||
4184 | - | |||||||||||||
4185 | If that rule can't be followed because, e.g., \c{#include} lines and | - | ||||||||||||
4186 | declarations are wildly mixed, place \c QT_BEGIN_NAMESPACE before | - | ||||||||||||
4187 | the first declaration and wrap the \c{#include} lines in | - | ||||||||||||
4188 | \c QT_BEGIN_INCLUDE_NAMESPACE and \c QT_END_INCLUDE_NAMESPACE. | - | ||||||||||||
4189 | - | |||||||||||||
4190 | When using the \c QT_NAMESPACE feature in user code | - | ||||||||||||
4191 | (e.g., when building plugins statically linked to Qt) where | - | ||||||||||||
4192 | the user code is not intended to go into the \c QT_NAMESPACE | - | ||||||||||||
4193 | namespace, all forward declarations of Qt classes need to | - | ||||||||||||
4194 | be wrapped in \c QT_BEGIN_NAMESPACE and \c QT_END_NAMESPACE. | - | ||||||||||||
4195 | After that, a \c QT_USE_NAMESPACE should follow. | - | ||||||||||||
4196 | No further changes should be needed. | - | ||||||||||||
4197 | - | |||||||||||||
4198 | \sa QT_NAMESPACE | - | ||||||||||||
4199 | */ | - | ||||||||||||
4200 | - | |||||||||||||
4201 | /*! | - | ||||||||||||
4202 | \macro QT_END_NAMESPACE | - | ||||||||||||
4203 | \internal | - | ||||||||||||
4204 | - | |||||||||||||
4205 | This macro expands to | - | ||||||||||||
4206 | - | |||||||||||||
4207 | \snippet code/src_corelib_global_qglobal.cpp end namespace macro | - | ||||||||||||
4208 | - | |||||||||||||
4209 | if \c QT_NAMESPACE is defined and nothing otherwise. It is used to cancel | - | ||||||||||||
4210 | the effect of \c QT_BEGIN_NAMESPACE. | - | ||||||||||||
4211 | - | |||||||||||||
4212 | If a source file ends with a \c{#include} directive that includes a moc file, | - | ||||||||||||
4213 | \c QT_END_NAMESPACE should be placed before that \c{#include}. | - | ||||||||||||
4214 | - | |||||||||||||
4215 | \sa QT_NAMESPACE | - | ||||||||||||
4216 | */ | - | ||||||||||||
4217 | - | |||||||||||||
4218 | /*! | - | ||||||||||||
4219 | \macro QT_BEGIN_INCLUDE_NAMESPACE | - | ||||||||||||
4220 | \internal | - | ||||||||||||
4221 | - | |||||||||||||
4222 | This macro is equivalent to \c QT_END_NAMESPACE. | - | ||||||||||||
4223 | It only serves as syntactic sugar and is intended | - | ||||||||||||
4224 | to be used before #include lines within a | - | ||||||||||||
4225 | \c QT_BEGIN_NAMESPACE ... \c QT_END_NAMESPACE block. | - | ||||||||||||
4226 | - | |||||||||||||
4227 | \sa QT_NAMESPACE | - | ||||||||||||
4228 | */ | - | ||||||||||||
4229 | - | |||||||||||||
4230 | /*! | - | ||||||||||||
4231 | \macro QT_END_INCLUDE_NAMESPACE | - | ||||||||||||
4232 | \internal | - | ||||||||||||
4233 | - | |||||||||||||
4234 | This macro is equivalent to \c QT_BEGIN_NAMESPACE. | - | ||||||||||||
4235 | It only serves as syntactic sugar and is intended | - | ||||||||||||
4236 | to be used after #include lines within a | - | ||||||||||||
4237 | \c QT_BEGIN_NAMESPACE ... \c QT_END_NAMESPACE block. | - | ||||||||||||
4238 | - | |||||||||||||
4239 | \sa QT_NAMESPACE | - | ||||||||||||
4240 | */ | - | ||||||||||||
4241 | - | |||||||||||||
4242 | /*! | - | ||||||||||||
4243 | \macro QT_BEGIN_MOC_NAMESPACE | - | ||||||||||||
4244 | \internal | - | ||||||||||||
4245 | - | |||||||||||||
4246 | This macro is output by moc at the beginning of | - | ||||||||||||
4247 | moc files. It is equivalent to \c QT_USE_NAMESPACE. | - | ||||||||||||
4248 | - | |||||||||||||
4249 | \sa QT_NAMESPACE | - | ||||||||||||
4250 | */ | - | ||||||||||||
4251 | - | |||||||||||||
4252 | /*! | - | ||||||||||||
4253 | \macro QT_END_MOC_NAMESPACE | - | ||||||||||||
4254 | \internal | - | ||||||||||||
4255 | - | |||||||||||||
4256 | This macro is output by moc at the beginning of | - | ||||||||||||
4257 | moc files. It expands to nothing. | - | ||||||||||||
4258 | - | |||||||||||||
4259 | \sa QT_NAMESPACE | - | ||||||||||||
4260 | */ | - | ||||||||||||
4261 | - | |||||||||||||
4262 | /*! | - | ||||||||||||
4263 | \fn bool qFuzzyCompare(double p1, double p2) | - | ||||||||||||
4264 | \relates <QtGlobal> | - | ||||||||||||
4265 | \since 4.4 | - | ||||||||||||
4266 | \threadsafe | - | ||||||||||||
4267 | - | |||||||||||||
4268 | Compares the floating point value \a p1 and \a p2 and | - | ||||||||||||
4269 | returns \c true if they are considered equal, otherwise \c false. | - | ||||||||||||
4270 | - | |||||||||||||
4271 | Note that comparing values where either \a p1 or \a p2 is 0.0 will not work, | - | ||||||||||||
4272 | nor does comparing values where one of the values is NaN or infinity. | - | ||||||||||||
4273 | If one of the values is always 0.0, use qFuzzyIsNull instead. If one of the | - | ||||||||||||
4274 | values is likely to be 0.0, one solution is to add 1.0 to both values. | - | ||||||||||||
4275 | - | |||||||||||||
4276 | \snippet code/src_corelib_global_qglobal.cpp 46 | - | ||||||||||||
4277 | - | |||||||||||||
4278 | The two numbers are compared in a relative way, where the | - | ||||||||||||
4279 | exactness is stronger the smaller the numbers are. | - | ||||||||||||
4280 | */ | - | ||||||||||||
4281 | - | |||||||||||||
4282 | /*! | - | ||||||||||||
4283 | \fn bool qFuzzyCompare(float p1, float p2) | - | ||||||||||||
4284 | \relates <QtGlobal> | - | ||||||||||||
4285 | \since 4.4 | - | ||||||||||||
4286 | \threadsafe | - | ||||||||||||
4287 | - | |||||||||||||
4288 | Compares the floating point value \a p1 and \a p2 and | - | ||||||||||||
4289 | returns \c true if they are considered equal, otherwise \c false. | - | ||||||||||||
4290 | - | |||||||||||||
4291 | The two numbers are compared in a relative way, where the | - | ||||||||||||
4292 | exactness is stronger the smaller the numbers are. | - | ||||||||||||
4293 | */ | - | ||||||||||||
4294 | - | |||||||||||||
4295 | /*! | - | ||||||||||||
4296 | \macro QT_REQUIRE_VERSION(int argc, char **argv, const char *version) | - | ||||||||||||
4297 | \relates <QtGlobal> | - | ||||||||||||
4298 | - | |||||||||||||
4299 | This macro can be used to ensure that the application is run | - | ||||||||||||
4300 | against a recent enough version of Qt. This is especially useful | - | ||||||||||||
4301 | if your application depends on a specific bug fix introduced in a | - | ||||||||||||
4302 | bug-fix release (e.g., 4.0.2). | - | ||||||||||||
4303 | - | |||||||||||||
4304 | The \a argc and \a argv parameters are the \c main() function's | - | ||||||||||||
4305 | \c argc and \c argv parameters. The \a version parameter is a | - | ||||||||||||
4306 | string literal that specifies which version of Qt the application | - | ||||||||||||
4307 | requires (e.g., "4.0.2"). | - | ||||||||||||
4308 | - | |||||||||||||
4309 | Example: | - | ||||||||||||
4310 | - | |||||||||||||
4311 | \snippet code/src_gui_dialogs_qmessagebox.cpp 4 | - | ||||||||||||
4312 | */ | - | ||||||||||||
4313 | - | |||||||||||||
4314 | /*! | - | ||||||||||||
4315 | \macro Q_DECL_EXPORT | - | ||||||||||||
4316 | \relates <QtGlobal> | - | ||||||||||||
4317 | - | |||||||||||||
4318 | This macro marks a symbol for shared library export (see | - | ||||||||||||
4319 | \l{sharedlibrary.html}{Creating Shared Libraries}). | - | ||||||||||||
4320 | - | |||||||||||||
4321 | \sa Q_DECL_IMPORT | - | ||||||||||||
4322 | */ | - | ||||||||||||
4323 | - | |||||||||||||
4324 | /*! | - | ||||||||||||
4325 | \macro Q_DECL_IMPORT | - | ||||||||||||
4326 | \relates <QtGlobal> | - | ||||||||||||
4327 | - | |||||||||||||
4328 | This macro declares a symbol to be an import from a shared library (see | - | ||||||||||||
4329 | \l{sharedlibrary.html}{Creating Shared Libraries}). | - | ||||||||||||
4330 | - | |||||||||||||
4331 | \sa Q_DECL_EXPORT | - | ||||||||||||
4332 | */ | - | ||||||||||||
4333 | - | |||||||||||||
4334 | /*! | - | ||||||||||||
4335 | \macro Q_DECL_CONSTEXPR | - | ||||||||||||
4336 | \relates <QtGlobal> | - | ||||||||||||
4337 | - | |||||||||||||
4338 | This macro can be used to declare variable that should be constructed at compile-time, | - | ||||||||||||
4339 | or an inline function that can be computed at compile-time. | - | ||||||||||||
4340 | - | |||||||||||||
4341 | It expands to "constexpr" if your compiler supports that C++11 keyword, or to nothing | - | ||||||||||||
4342 | otherwise. | - | ||||||||||||
4343 | - | |||||||||||||
4344 | \sa Q_DECL_RELAXED_CONSTEXPR | - | ||||||||||||
4345 | */ | - | ||||||||||||
4346 | - | |||||||||||||
4347 | /*! | - | ||||||||||||
4348 | \macro Q_DECL_RELAXED_CONSTEXPR | - | ||||||||||||
4349 | \relates <QtGlobal> | - | ||||||||||||
4350 | - | |||||||||||||
4351 | This macro can be used to declare an inline function that can be computed | - | ||||||||||||
4352 | at compile-time according to the relaxed rules from C++14. | - | ||||||||||||
4353 | - | |||||||||||||
4354 | It expands to "constexpr" if your compiler supports C++14 relaxed constant | - | ||||||||||||
4355 | expressions, or to nothing otherwise. | - | ||||||||||||
4356 | - | |||||||||||||
4357 | \sa Q_DECL_CONSTEXPR | - | ||||||||||||
4358 | */ | - | ||||||||||||
4359 | - | |||||||||||||
4360 | /*! | - | ||||||||||||
4361 | \macro qDebug(const char *message, ...) | - | ||||||||||||
4362 | \relates <QtGlobal> | - | ||||||||||||
4363 | - | |||||||||||||
4364 | Calls the message handler with the debug message \a message. If no | - | ||||||||||||
4365 | message handler has been installed, the message is printed to | - | ||||||||||||
4366 | stderr. Under Windows the message is sent to the console, if it is a | - | ||||||||||||
4367 | console application; otherwise, it is sent to the debugger. On QNX, the | - | ||||||||||||
4368 | message is sent to slogger2. This function does nothing if \c QT_NO_DEBUG_OUTPUT | - | ||||||||||||
4369 | was defined during compilation. | - | ||||||||||||
4370 | - | |||||||||||||
4371 | If you pass the function a format string and a list of arguments, | - | ||||||||||||
4372 | it works in similar way to the C printf() function. The format | - | ||||||||||||
4373 | should be a Latin-1 string. | - | ||||||||||||
4374 | - | |||||||||||||
4375 | Example: | - | ||||||||||||
4376 | - | |||||||||||||
4377 | \snippet code/src_corelib_global_qglobal.cpp 24 | - | ||||||||||||
4378 | - | |||||||||||||
4379 | If you include \c <QtDebug>, a more convenient syntax is also | - | ||||||||||||
4380 | available: | - | ||||||||||||
4381 | - | |||||||||||||
4382 | \snippet code/src_corelib_global_qglobal.cpp 25 | - | ||||||||||||
4383 | - | |||||||||||||
4384 | With this syntax, the function returns a QDebug object that is | - | ||||||||||||
4385 | configured to use the QtDebugMsg message type. It automatically | - | ||||||||||||
4386 | puts a single space between each item, and outputs a newline at | - | ||||||||||||
4387 | the end. It supports many C++ and Qt types. | - | ||||||||||||
4388 | - | |||||||||||||
4389 | To suppress the output at run-time, install your own message handler | - | ||||||||||||
4390 | with qInstallMessageHandler(). | - | ||||||||||||
4391 | - | |||||||||||||
4392 | \sa qInfo(), qWarning(), qCritical(), qFatal(), qInstallMessageHandler(), | - | ||||||||||||
4393 | {Debugging Techniques} | - | ||||||||||||
4394 | */ | - | ||||||||||||
4395 | - | |||||||||||||
4396 | /*! | - | ||||||||||||
4397 | \macro qInfo(const char *message, ...) | - | ||||||||||||
4398 | \relates <QtGlobal> | - | ||||||||||||
4399 | \since 5.5 | - | ||||||||||||
4400 | - | |||||||||||||
4401 | Calls the message handler with the informational message \a message. If no | - | ||||||||||||
4402 | message handler has been installed, the message is printed to | - | ||||||||||||
4403 | stderr. Under Windows, the message is sent to the console, if it is a | - | ||||||||||||
4404 | console application; otherwise, it is sent to the debugger. On QNX the | - | ||||||||||||
4405 | message is sent to slogger2. This function does nothing if \c QT_NO_INFO_OUTPUT | - | ||||||||||||
4406 | was defined during compilation. | - | ||||||||||||
4407 | - | |||||||||||||
4408 | If you pass the function a format string and a list of arguments, | - | ||||||||||||
4409 | it works in similar way to the C printf() function. The format | - | ||||||||||||
4410 | should be a Latin-1 string. | - | ||||||||||||
4411 | - | |||||||||||||
4412 | Example: | - | ||||||||||||
4413 | - | |||||||||||||
4414 | \snippet code/src_corelib_global_qglobal.cpp qInfo_printf | - | ||||||||||||
4415 | - | |||||||||||||
4416 | If you include \c <QtDebug>, a more convenient syntax is also | - | ||||||||||||
4417 | available: | - | ||||||||||||
4418 | - | |||||||||||||
4419 | \snippet code/src_corelib_global_qglobal.cpp qInfo_stream | - | ||||||||||||
4420 | - | |||||||||||||
4421 | With this syntax, the function returns a QDebug object that is | - | ||||||||||||
4422 | configured to use the QtInfoMsg message type. It automatically | - | ||||||||||||
4423 | puts a single space between each item, and outputs a newline at | - | ||||||||||||
4424 | the end. It supports many C++ and Qt types. | - | ||||||||||||
4425 | - | |||||||||||||
4426 | To suppress the output at run-time, install your own message handler | - | ||||||||||||
4427 | with qInstallMessageHandler(). | - | ||||||||||||
4428 | - | |||||||||||||
4429 | \sa qDebug(), qWarning(), qCritical(), qFatal(), qInstallMessageHandler(), | - | ||||||||||||
4430 | {Debugging Techniques} | - | ||||||||||||
4431 | */ | - | ||||||||||||
4432 | - | |||||||||||||
4433 | /*! | - | ||||||||||||
4434 | \macro qWarning(const char *message, ...) | - | ||||||||||||
4435 | \relates <QtGlobal> | - | ||||||||||||
4436 | - | |||||||||||||
4437 | Calls the message handler with the warning message \a message. If no | - | ||||||||||||
4438 | message handler has been installed, the message is printed to | - | ||||||||||||
4439 | stderr. Under Windows, the message is sent to the debugger. | - | ||||||||||||
4440 | On QNX the message is sent to slogger2. This | - | ||||||||||||
4441 | function does nothing if \c QT_NO_WARNING_OUTPUT was defined | - | ||||||||||||
4442 | during compilation; it exits if the environment variable \c | - | ||||||||||||
4443 | QT_FATAL_WARNINGS is not empty. | - | ||||||||||||
4444 | - | |||||||||||||
4445 | This function takes a format string and a list of arguments, | - | ||||||||||||
4446 | similar to the C printf() function. The format should be a Latin-1 | - | ||||||||||||
4447 | string. | - | ||||||||||||
4448 | - | |||||||||||||
4449 | Example: | - | ||||||||||||
4450 | \snippet code/src_corelib_global_qglobal.cpp 26 | - | ||||||||||||
4451 | - | |||||||||||||
4452 | If you include <QtDebug>, a more convenient syntax is | - | ||||||||||||
4453 | also available: | - | ||||||||||||
4454 | - | |||||||||||||
4455 | \snippet code/src_corelib_global_qglobal.cpp 27 | - | ||||||||||||
4456 | - | |||||||||||||
4457 | This syntax inserts a space between each item, and | - | ||||||||||||
4458 | appends a newline at the end. | - | ||||||||||||
4459 | - | |||||||||||||
4460 | To suppress the output at runtime, install your own message handler | - | ||||||||||||
4461 | with qInstallMessageHandler(). | - | ||||||||||||
4462 | - | |||||||||||||
4463 | \sa qDebug(), qInfo(), qCritical(), qFatal(), qInstallMessageHandler(), | - | ||||||||||||
4464 | {Debugging Techniques} | - | ||||||||||||
4465 | */ | - | ||||||||||||
4466 | - | |||||||||||||
4467 | /*! | - | ||||||||||||
4468 | \macro qCritical(const char *message, ...) | - | ||||||||||||
4469 | \relates <QtGlobal> | - | ||||||||||||
4470 | - | |||||||||||||
4471 | Calls the message handler with the critical message \a message. If no | - | ||||||||||||
4472 | message handler has been installed, the message is printed to | - | ||||||||||||
4473 | stderr. Under Windows, the message is sent to the debugger. | - | ||||||||||||
4474 | On QNX the message is sent to slogger2 | - | ||||||||||||
4475 | - | |||||||||||||
4476 | It exits if the environment variable QT_FATAL_CRITICALS is not empty. | - | ||||||||||||
4477 | - | |||||||||||||
4478 | This function takes a format string and a list of arguments, | - | ||||||||||||
4479 | similar to the C printf() function. The format should be a Latin-1 | - | ||||||||||||
4480 | string. | - | ||||||||||||
4481 | - | |||||||||||||
4482 | Example: | - | ||||||||||||
4483 | \snippet code/src_corelib_global_qglobal.cpp 28 | - | ||||||||||||
4484 | - | |||||||||||||
4485 | If you include <QtDebug>, a more convenient syntax is | - | ||||||||||||
4486 | also available: | - | ||||||||||||
4487 | - | |||||||||||||
4488 | \snippet code/src_corelib_global_qglobal.cpp 29 | - | ||||||||||||
4489 | - | |||||||||||||
4490 | A space is inserted between the items, and a newline is | - | ||||||||||||
4491 | appended at the end. | - | ||||||||||||
4492 | - | |||||||||||||
4493 | To suppress the output at runtime, install your own message handler | - | ||||||||||||
4494 | with qInstallMessageHandler(). | - | ||||||||||||
4495 | - | |||||||||||||
4496 | \sa qDebug(), qInfo(), qWarning(), qFatal(), qInstallMessageHandler(), | - | ||||||||||||
4497 | {Debugging Techniques} | - | ||||||||||||
4498 | */ | - | ||||||||||||
4499 | - | |||||||||||||
4500 | /*! | - | ||||||||||||
4501 | \macro qFatal(const char *message, ...) | - | ||||||||||||
4502 | \relates <QtGlobal> | - | ||||||||||||
4503 | - | |||||||||||||
4504 | Calls the message handler with the fatal message \a message. If no | - | ||||||||||||
4505 | message handler has been installed, the message is printed to | - | ||||||||||||
4506 | stderr. Under Windows, the message is sent to the debugger. | - | ||||||||||||
4507 | On QNX the message is sent to slogger2 | - | ||||||||||||
4508 | - | |||||||||||||
4509 | If you are using the \b{default message handler} this function will | - | ||||||||||||
4510 | abort on Unix systems to create a core dump. On Windows, for debug builds, | - | ||||||||||||
4511 | this function will report a _CRT_ERROR enabling you to connect a debugger | - | ||||||||||||
4512 | to the application. | - | ||||||||||||
4513 | - | |||||||||||||
4514 | This function takes a format string and a list of arguments, | - | ||||||||||||
4515 | similar to the C printf() function. | - | ||||||||||||
4516 | - | |||||||||||||
4517 | Example: | - | ||||||||||||
4518 | \snippet code/src_corelib_global_qglobal.cpp 30 | - | ||||||||||||
4519 | - | |||||||||||||
4520 | To suppress the output at runtime, install your own message handler | - | ||||||||||||
4521 | with qInstallMessageHandler(). | - | ||||||||||||
4522 | - | |||||||||||||
4523 | \sa qDebug(), qInfo(), qWarning(), qCritical(), qInstallMessageHandler(), | - | ||||||||||||
4524 | {Debugging Techniques} | - | ||||||||||||
4525 | */ | - | ||||||||||||
4526 | - | |||||||||||||
4527 | /*! | - | ||||||||||||
4528 | \macro qMove(x) | - | ||||||||||||
4529 | \relates <QtGlobal> | - | ||||||||||||
4530 | - | |||||||||||||
4531 | It expands to "std::move" if your compiler supports that C++11 function, or to nothing | - | ||||||||||||
4532 | otherwise. | - | ||||||||||||
4533 | - | |||||||||||||
4534 | qMove takes an rvalue reference to its parameter \a x, and converts it to an xvalue. | - | ||||||||||||
4535 | */ | - | ||||||||||||
4536 | - | |||||||||||||
4537 | /*! | - | ||||||||||||
4538 | \macro Q_DECL_NOTHROW | - | ||||||||||||
4539 | \relates <QtGlobal> | - | ||||||||||||
4540 | \since 5.0 | - | ||||||||||||
4541 | - | |||||||||||||
4542 | This macro marks a function as never throwing, under no | - | ||||||||||||
4543 | circumstances. If the function does nevertheless throw, the | - | ||||||||||||
4544 | behaviour is undefined. | - | ||||||||||||
4545 | - | |||||||||||||
4546 | The macro expands to either "throw()", if that has some benefit on | - | ||||||||||||
4547 | the compiler, or to C++11 noexcept, if available, or to nothing | - | ||||||||||||
4548 | otherwise. | - | ||||||||||||
4549 | - | |||||||||||||
4550 | If you need C++11 noexcept semantics, don't use this macro, use | - | ||||||||||||
4551 | Q_DECL_NOEXCEPT/Q_DECL_NOEXCEPT_EXPR instead. | - | ||||||||||||
4552 | - | |||||||||||||
4553 | \sa Q_DECL_NOEXCEPT, Q_DECL_NOEXCEPT_EXPR() | - | ||||||||||||
4554 | */ | - | ||||||||||||
4555 | - | |||||||||||||
4556 | /*! | - | ||||||||||||
4557 | \macro QT_TERMINATE_ON_EXCEPTION(expr) | - | ||||||||||||
4558 | \relates <QtGlobal> | - | ||||||||||||
4559 | \internal | - | ||||||||||||
4560 | - | |||||||||||||
4561 | In general, use of the Q_DECL_NOEXCEPT macro is preferred over | - | ||||||||||||
4562 | Q_DECL_NOTHROW, because it exhibits well-defined behavior and | - | ||||||||||||
4563 | supports the more powerful Q_DECL_NOEXCEPT_EXPR variant. However, | - | ||||||||||||
4564 | use of Q_DECL_NOTHROW has the advantage that Windows builds | - | ||||||||||||
4565 | benefit on a wide range or compiler versions that do not yet | - | ||||||||||||
4566 | support the C++11 noexcept feature. | - | ||||||||||||
4567 | - | |||||||||||||
4568 | It may therefore be beneficial to use Q_DECL_NOTHROW and emulate | - | ||||||||||||
4569 | the C++11 behavior manually with an embedded try/catch. | - | ||||||||||||
4570 | - | |||||||||||||
4571 | Qt provides the QT_TERMINATE_ON_EXCEPTION(expr) macro for this | - | ||||||||||||
4572 | purpose. It either expands to \c expr (if Qt is compiled without | - | ||||||||||||
4573 | exception support or the compiler supports C++11 noexcept | - | ||||||||||||
4574 | semantics) or to | - | ||||||||||||
4575 | \code | - | ||||||||||||
4576 | try { expr; } catch(...) { qTerminate(); } | - | ||||||||||||
4577 | \endcode | - | ||||||||||||
4578 | otherwise. | - | ||||||||||||
4579 | - | |||||||||||||
4580 | Since this macro expands to just \c expr if the compiler supports | - | ||||||||||||
4581 | C++11 noexcept, expecting the compiler to take over responsibility | - | ||||||||||||
4582 | of calling std::terminate() in that case, it should not be used | - | ||||||||||||
4583 | outside Q_DECL_NOTHROW functions. | - | ||||||||||||
4584 | - | |||||||||||||
4585 | \sa Q_DECL_NOEXCEPT, Q_DECL_NOTHROW, qTerminate() | - | ||||||||||||
4586 | */ | - | ||||||||||||
4587 | - | |||||||||||||
4588 | /*! | - | ||||||||||||
4589 | \macro Q_DECL_NOEXCEPT | - | ||||||||||||
4590 | \relates <QtGlobal> | - | ||||||||||||
4591 | \since 5.0 | - | ||||||||||||
4592 | - | |||||||||||||
4593 | This macro marks a function as never throwing. If the function | - | ||||||||||||
4594 | does nevertheless throw, the behaviour is defined: | - | ||||||||||||
4595 | std::terminate() is called. | - | ||||||||||||
4596 | - | |||||||||||||
4597 | The macro expands to C++11 noexcept, if available, or to nothing | - | ||||||||||||
4598 | otherwise. | - | ||||||||||||
4599 | - | |||||||||||||
4600 | If you need the operator version of C++11 noexcept, use | - | ||||||||||||
4601 | Q_DECL_NOEXCEPT_EXPR(x). | - | ||||||||||||
4602 | - | |||||||||||||
4603 | If you don't need C++11 noexcept semantics, e.g. because your | - | ||||||||||||
4604 | function can't possibly throw, don't use this macro, use | - | ||||||||||||
4605 | Q_DECL_NOTHROW instead. | - | ||||||||||||
4606 | - | |||||||||||||
4607 | \sa Q_DECL_NOTHROW, Q_DECL_NOEXCEPT_EXPR() | - | ||||||||||||
4608 | */ | - | ||||||||||||
4609 | - | |||||||||||||
4610 | /*! | - | ||||||||||||
4611 | \macro Q_DECL_NOEXCEPT_EXPR(x) | - | ||||||||||||
4612 | \relates <QtGlobal> | - | ||||||||||||
4613 | \since 5.0 | - | ||||||||||||
4614 | - | |||||||||||||
4615 | This macro marks a function as non-throwing if \a x is \c true. If | - | ||||||||||||
4616 | the function does nevertheless throw, the behaviour is defined: | - | ||||||||||||
4617 | std::terminate() is called. | - | ||||||||||||
4618 | - | |||||||||||||
4619 | The macro expands to C++11 noexcept(x), if available, or to | - | ||||||||||||
4620 | nothing otherwise. | - | ||||||||||||
4621 | - | |||||||||||||
4622 | If you need the always-true version of C++11 noexcept, use | - | ||||||||||||
4623 | Q_DECL_NOEXCEPT. | - | ||||||||||||
4624 | - | |||||||||||||
4625 | If you don't need C++11 noexcept semantics, e.g. because your | - | ||||||||||||
4626 | function can't possibly throw, don't use this macro, use | - | ||||||||||||
4627 | Q_DECL_NOTHROW instead. | - | ||||||||||||
4628 | - | |||||||||||||
4629 | \sa Q_DECL_NOTHROW, Q_DECL_NOEXCEPT | - | ||||||||||||
4630 | */ | - | ||||||||||||
4631 | - | |||||||||||||
4632 | /*! | - | ||||||||||||
4633 | \macro Q_DECL_OVERRIDE | - | ||||||||||||
4634 | \since 5.0 | - | ||||||||||||
4635 | \relates <QtGlobal> | - | ||||||||||||
4636 | - | |||||||||||||
4637 | This macro can be used to declare an overriding virtual | - | ||||||||||||
4638 | function. Use of this markup will allow the compiler to generate | - | ||||||||||||
4639 | an error if the overriding virtual function does not in fact | - | ||||||||||||
4640 | override anything. | - | ||||||||||||
4641 | - | |||||||||||||
4642 | It expands to "override" if your compiler supports that C++11 | - | ||||||||||||
4643 | contextual keyword, or to nothing otherwise. | - | ||||||||||||
4644 | - | |||||||||||||
4645 | The macro goes at the end of the function, usually after the | - | ||||||||||||
4646 | \c{const}, if any: | - | ||||||||||||
4647 | \code | - | ||||||||||||
4648 | // generate error if this doesn't actually override anything: | - | ||||||||||||
4649 | virtual void MyWidget::paintEvent(QPaintEvent*) Q_DECL_OVERRIDE; | - | ||||||||||||
4650 | \endcode | - | ||||||||||||
4651 | - | |||||||||||||
4652 | \sa Q_DECL_FINAL | - | ||||||||||||
4653 | */ | - | ||||||||||||
4654 | - | |||||||||||||
4655 | /*! | - | ||||||||||||
4656 | \macro Q_DECL_FINAL | - | ||||||||||||
4657 | \since 5.0 | - | ||||||||||||
4658 | \relates <QtGlobal> | - | ||||||||||||
4659 | - | |||||||||||||
4660 | This macro can be used to declare an overriding virtual or a class | - | ||||||||||||
4661 | as "final", with Java semantics. Further-derived classes can then | - | ||||||||||||
4662 | no longer override this virtual function, or inherit from this | - | ||||||||||||
4663 | class, respectively. | - | ||||||||||||
4664 | - | |||||||||||||
4665 | It expands to "final" if your compiler supports that C++11 | - | ||||||||||||
4666 | contextual keyword, or something non-standard if your compiler | - | ||||||||||||
4667 | supports something close enough to the C++11 semantics, or to | - | ||||||||||||
4668 | nothing otherwise. | - | ||||||||||||
4669 | - | |||||||||||||
4670 | The macro goes at the end of the function, usually after the | - | ||||||||||||
4671 | \c{const}, if any: | - | ||||||||||||
4672 | \code | - | ||||||||||||
4673 | // more-derived classes no longer permitted to override this: | - | ||||||||||||
4674 | virtual void MyWidget::paintEvent(QPaintEvent*) Q_DECL_FINAL; | - | ||||||||||||
4675 | \endcode | - | ||||||||||||
4676 | - | |||||||||||||
4677 | For classes, it goes in front of the \c{:} in the class | - | ||||||||||||
4678 | definition, if any: | - | ||||||||||||
4679 | \code | - | ||||||||||||
4680 | class QRect Q_DECL_FINAL { // cannot be derived from | - | ||||||||||||
4681 | // ... | - | ||||||||||||
4682 | }; | - | ||||||||||||
4683 | \endcode | - | ||||||||||||
4684 | - | |||||||||||||
4685 | \sa Q_DECL_OVERRIDE | - | ||||||||||||
4686 | */ | - | ||||||||||||
4687 | - | |||||||||||||
4688 | /*! | - | ||||||||||||
4689 | \macro Q_FORWARD_DECLARE_OBJC_CLASS(classname) | - | ||||||||||||
4690 | \since 5.2 | - | ||||||||||||
4691 | \relates <QtGlobal> | - | ||||||||||||
4692 | - | |||||||||||||
4693 | Forward-declares an Objective-C \a classname in a manner such that it can be | - | ||||||||||||
4694 | compiled as either Objective-C or C++. | - | ||||||||||||
4695 | - | |||||||||||||
4696 | This is primarily intended for use in header files that may be included by | - | ||||||||||||
4697 | both Objective-C and C++ source files. | - | ||||||||||||
4698 | */ | - | ||||||||||||
4699 | - | |||||||||||||
4700 | /*! | - | ||||||||||||
4701 | \macro Q_FORWARD_DECLARE_CF_TYPE(type) | - | ||||||||||||
4702 | \since 5.2 | - | ||||||||||||
4703 | \relates <QtGlobal> | - | ||||||||||||
4704 | - | |||||||||||||
4705 | Forward-declares a Core Foundation \a type. This includes the actual | - | ||||||||||||
4706 | type and the ref type. For example, Q_FORWARD_DECLARE_CF_TYPE(CFString) | - | ||||||||||||
4707 | declares __CFString and CFStringRef. | - | ||||||||||||
4708 | */ | - | ||||||||||||
4709 | - | |||||||||||||
4710 | /*! | - | ||||||||||||
4711 | \macro Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(type) | - | ||||||||||||
4712 | \since 5.2 | - | ||||||||||||
4713 | \relates <QtGlobal> | - | ||||||||||||
4714 | - | |||||||||||||
4715 | Forward-declares a mutable Core Foundation \a type. This includes the actual | - | ||||||||||||
4716 | type and the ref type. For example, Q_FORWARD_DECLARE_MUTABLE_CF_TYPE(CFMutableString) | - | ||||||||||||
4717 | declares __CFMutableString and CFMutableStringRef. | - | ||||||||||||
4718 | */ | - | ||||||||||||
4719 | - | |||||||||||||
4720 | QT_END_NAMESPACE | - | ||||||||||||
Source code | Switch to Preprocessed file |