mirror of
https://github.com/NohamR/RMHook-Win.git
synced 2026-05-25 19:59:46 +00:00
113 lines
3.7 KiB
C++
113 lines
3.7 KiB
C++
// Copyright (C) 2022 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
|
|
|
|
#ifndef QASSERT_H
|
|
#define QASSERT_H
|
|
|
|
#include <QtCore/qcompilerdetection.h>
|
|
#include <QtCore/qtconfigmacros.h>
|
|
#include <QtCore/qtcoreexports.h>
|
|
|
|
#if 0
|
|
#pragma qt_class(QtAssert)
|
|
#pragma qt_sync_stop_processing
|
|
#endif
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
#ifndef Q_CC_MSVC
|
|
Q_NORETURN
|
|
#endif
|
|
Q_DECL_COLD_FUNCTION
|
|
Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line) noexcept;
|
|
|
|
#if !defined(Q_ASSERT)
|
|
# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
|
|
# define Q_ASSERT(cond) static_cast<void>(false && (cond))
|
|
# else
|
|
# define Q_ASSERT(cond) ((cond) ? static_cast<void>(0) : qt_assert(#cond, __FILE__, __LINE__))
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef Q_CC_MSVC
|
|
Q_NORETURN
|
|
#endif
|
|
Q_DECL_COLD_FUNCTION
|
|
Q_CORE_EXPORT
|
|
void qt_assert_x(const char *where, const char *what, const char *file, int line) noexcept;
|
|
|
|
#if !defined(Q_ASSERT_X)
|
|
# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
|
|
# define Q_ASSERT_X(cond, where, what) static_cast<void>(false && (cond))
|
|
# else
|
|
# define Q_ASSERT_X(cond, where, what) ((cond) ? static_cast<void>(0) : qt_assert_x(where, what, __FILE__, __LINE__))
|
|
# endif
|
|
#endif
|
|
|
|
Q_NORETURN Q_CORE_EXPORT void qt_check_pointer(const char *, int) noexcept;
|
|
Q_NORETURN Q_DECL_COLD_FUNCTION
|
|
Q_CORE_EXPORT void qBadAlloc();
|
|
|
|
#ifdef QT_NO_EXCEPTIONS
|
|
# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
|
|
# define Q_CHECK_PTR(p) qt_noop()
|
|
# else
|
|
# define Q_CHECK_PTR(p) do {if (!(p)) qt_check_pointer(__FILE__,__LINE__);} while (false)
|
|
# endif
|
|
#else
|
|
# define Q_CHECK_PTR(p) do { if (!(p)) qBadAlloc(); } while (false)
|
|
#endif
|
|
|
|
template <typename T>
|
|
inline T *q_check_ptr(T *p) { Q_CHECK_PTR(p); return p; }
|
|
|
|
// Q_UNREACHABLE_IMPL() and Q_ASSUME_IMPL() used below are defined in qcompilerdetection.h
|
|
#define Q_UNREACHABLE() \
|
|
do {\
|
|
Q_ASSERT_X(false, "Q_UNREACHABLE()", "Q_UNREACHABLE was reached");\
|
|
Q_UNREACHABLE_IMPL();\
|
|
} while (false)
|
|
|
|
#ifndef Q_UNREACHABLE_RETURN
|
|
# ifdef Q_COMPILER_COMPLAINS_ABOUT_RETURN_AFTER_UNREACHABLE
|
|
# define Q_UNREACHABLE_RETURN(...) Q_UNREACHABLE()
|
|
# else
|
|
# define Q_UNREACHABLE_RETURN(...) do { Q_UNREACHABLE(); return __VA_ARGS__; } while (0)
|
|
# endif
|
|
#endif
|
|
|
|
#define Q_ASSUME(Expr) \
|
|
[] (bool valueOfExpression) {\
|
|
Q_ASSERT_X(valueOfExpression, "Q_ASSUME()", "Assumption in Q_ASSUME(\"" #Expr "\") was not correct");\
|
|
Q_ASSUME_IMPL(valueOfExpression);\
|
|
}(Expr)
|
|
|
|
// Don't use these in C++ mode, use static_assert directly.
|
|
// These are here only to keep old code compiling.
|
|
# define Q_STATIC_ASSERT(Condition) static_assert(bool(Condition), #Condition)
|
|
# define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
|
|
|
|
#elif defined(Q_COMPILER_STATIC_ASSERT)
|
|
// C11 mode - using the _S version in case <assert.h> doesn't do the right thing
|
|
# define Q_STATIC_ASSERT(Condition) _Static_assert(!!(Condition), #Condition)
|
|
# define Q_STATIC_ASSERT_X(Condition, Message) _Static_assert(!!(Condition), Message)
|
|
#else
|
|
// C89 & C99 version
|
|
# define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
|
|
# define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
|
|
# ifdef __COUNTER__
|
|
# define Q_STATIC_ASSERT(Condition) \
|
|
typedef char Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __COUNTER__) [(Condition) ? 1 : -1];
|
|
# else
|
|
# define Q_STATIC_ASSERT(Condition) \
|
|
typedef char Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) [(Condition) ? 1 : -1];
|
|
# endif /* __COUNTER__ */
|
|
# define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
|
|
#endif // __cplusplus
|
|
|
|
QT_END_NAMESPACE
|
|
|
|
#endif // QASSERT_H
|