SPARK  0.1.0
A general purpose game engine written in C++.
Loading...
Searching...
No Matches
Macros.h
1#pragma once
2
3#include "spark/base/Platforms.h"
4
5#include "spark/log/Logger.h"
6
11#define SPARK_UNUSED(x) (void)(x)
12
17#define SPARK_STATIC_UNREACHABLE(TplParam, Message) \
18 static_assert(!std::is_same_v<TplParam, TplParam>, Message)
19
24#if defined(SPARK_COMPILER_MSVC)
25#define SPARK_DO_PRAGMA(pragma) __pragma(pragma)
26#elif defined(SPARK_COMPILER_GCC) || defined(SPARK_COMPILER_CLANG) || defined(SPARK_COMPILER_CLANG_ANALYSER)
27 #define SPARK_DO_PRAGMA(pragma) _Pragma(#pragma)
28#else
29 #define SPARK_DO_PRAGMA(pragma)
30#endif
31
35#if defined(SPARK_COMPILER_MSVC)
36#define SPARK_WARNING_PUSH SPARK_DO_PRAGMA(warning(push))
37#define SPARK_WARNING_POP SPARK_DO_PRAGMA(warning(pop))
38#elif defined(SPARK_COMPILER_GCC)
39 #define SPARK_WARNING_PUSH SPARK_DO_PRAGMA(GCC diagnostic push)
40 #define SPARK_WARNING_POP SPARK_DO_PRAGMA(GCC diagnostic pop)
41#elif defined(SPARK_COMPILER_CLANG) || defined(SPARK_COMPILER_CLANG_ANALYSER)
42 #define SPARK_WARNING_PUSH SPARK_DO_PRAGMA(clang diagnostic push)
43 #define SPARK_WARNING_POP SPARK_DO_PRAGMA(clang diagnostic pop)
44#else
45 #define SPARK_WARNING_PUSH
46 #define SPARK_WARNING_POP
47#endif
48
53#ifdef SPARK_COMPILER_MSVC
54#define SPARK_DISABLE_MSVC_WARNING(warningValue) SPARK_DO_PRAGMA(warning(disable: warningValue))
55#define SPARK_SUPPRESS_MSVC_WARNING(warningValue) SPARK_DO_PRAGMA(warning(suppress: warningValue))
56#define SPARK_DISABLE_GCC_WARNING(warningValue)
57#define SPARK_DISABLE_CLANG_WARNING(warningValue)
58#elif defined(SPARK_COMPILER_GCC)
59 #define SPARK_DISABLE_MSVC_WARNING(warningValue)
60 #define SPARK_SUPPRESS_MSVC_WARNING(warningValue)
61 #define SPARK_DISABLE_GCC_WARNING(warningValue) SPARK_DO_PRAGMA(GCC diagnostic ignored #warningValue)
62 #define SPARK_DISABLE_CLANG_WARNING(warningValue)
63#elif defined(SPARK_COMPILER_CLANG)
64 #define SPARK_DISABLE_MSVC_WARNING(warningValue)
65 #define SPARK_SUPPRESS_MSVC_WARNING(warningValue)
66 #define SPARK_DISABLE_GCC_WARNING(warningValue)
67 #define SPARK_DISABLE_CLANG_WARNING(warningValue) SPARK_DO_PRAGMA(clang diagnostic ignored #warningValue)
68#else
69 #define SPARK_DISABLE_MSVC_WARNING(warningValue)
70 #define SPARK_SUPPRESS_MSVC_WARNING(warningValue)
71 #define SPARK_DISABLE_GCC_WARNING(warningValue)
72 #define SPARK_DISABLE_CLANG_WARNING(warningValue)
73#endif
74
78#ifdef SPARK_COMPILER_MSVC
79#define SPARK_DEBUG_BREAK __debugbreak()
80#elif defined(SPARK_COMPILER_GCC) || defined(SPARK_COMPILER_CLANG)
81 #define SPARK_DEBUG_BREAK __builtin_trap()
82#else
83 #define SPARK_DEBUG_BREAK
84#endif
85
90#define BIT(X) (1 << X)
91
96#define SPARK_DEFINE_ENUM_FLAGS(T) \
97 inline T operator| (const T lhs, const T rhs) { using _base_t = std::underlying_type_t<T>; return static_cast<T>(static_cast<_base_t>(lhs) | static_cast<_base_t>(rhs)); } \
98 inline T& operator|= (T& lhs, const T& rhs) { lhs = lhs | rhs; return lhs; } \
99 inline T operator& (const T lhs, const T rhs) { using _base_t = std::underlying_type_t<T>; return static_cast<T>(static_cast<_base_t>(lhs) & static_cast<_base_t>(rhs)); } \
100 inline T& operator&= (T& lhs, const T& rhs) { lhs = lhs & rhs; return lhs; }
101
102#define SPARK_OFFSET_OF(struct, member) ((std::size_t)&reinterpret_cast<char const volatile&>((((struct*)0)->member)))
103
104/*
105 * Define assertions macros
106 * TODO: Add support for custom assertion handlers
107 * TODO: Add support for custom assertion messages
108 * TODO: Add support for disabling assertions globally
109*/
110#define SPARK_CORE_ASSERT(cond) \
111 if (!(cond)) \
112 { \
113 spark::log::critical("Assertion Failed: {0}", #cond); \
114 SPARK_DEBUG_BREAK; \
115 }
116
117#define SPARK_ASSERT(cond) \
118 if (!(cond)) \
119 { \
120 spark::log::critical("Assertion Failed: {0}", #cond); \
121 SPARK_DEBUG_BREAK; \
122 }