Enigma
3.2.0
A Simple, Reliable and Efficient Encryption Tool
Macros.hpp
Go to the documentation of this file.
1
#pragma once
2
#ifndef ENIGMA_MACROS_H
3
#define ENIGMA_MACROS_H
4
6
#ifdef ENIGMA_DEBUG
7
#define ENIGMA_ENABLE_ASSERTS true
8
#endif
10
11
13
#define NS_ENIGMA_BEGIN namespace Enigma {
14
#define NS_ENIGMA_END }
16
17
19
#define USING_NS_ENIGMA using namespace Enigma;
20
#define enigma Enigma
22
23
25
#define ENIGMA_BIND_FUN(fun) [this](auto&&...args) -> decltype(auto) { return this->fun(std::forward<decltype(args)>(args)...); }
26
//
27
28
30
#ifdef ENIGMA_ENABLE_ASSERTS
31
#define ENIGMA_ASSERT(x, ...) \
32
if (!(x)) { \
33
ENIGMA_ERROR("Assertion Failed: {0}"
, __VA_ARGS__); \
34
ENIGMA_DEBUG_BREAK(); \
35
}
36
#else
37
#define ENIGMA_ASSERT(x, ...)
38
#define ENIGMA_ASSERT(x, ...)
39
#endif
40
41
#define ENIGMA_ASSERT_OR_THROW(x, msg) \
42
if (!(x)) { \
43
throw std::runtime_error(msg); \
44
}
45
46
#define ENIGMA_ASSERT_OR_RETURN(x, msg, ret) \
47
if (!(x)) { \
48
return ret; \
49
} \
50
52
54
#define ENIGMA_SAFE_DELETE_PTR(ptr) \
55
if ((ptr)) { \
56
delete (ptr); \
57
(ptr) = nullptr; \
58
}
59
60
#define ENIGMA_SAFE_DELETE_ARRAY_PTR(ptr) \
61
if ((ptr)) { \
62
delete[] (ptr); \
63
(ptr) = nullptr; \
64
}
65
66
#define ENIGMA_SAFE_DELETE_LIST_PTR(list) \
67
if (((list)[0])) { \
68
for (auto& ptr: list) \
69
ENIGMA_SAFE_DELETE_PTR(ptr); \
70
} \
71
74
#define BIT(x) (1 << x)
76
78
#define ENIGMA_ARRAY_SIZE(arr) static_cast<::Enigma::std::size_t>(sizeof(arr) / sizeof((arr)[0]))
80
82
#define ENIGMA_IS_BETWEEN(v, mi, ma) (v >= mi && v <= ma)
84
88
#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600)) || defined(__ghs__)
89
#define ENIGMA_CURRENT_FUNCTION __PRETTY_FUNCTION__
90
#elif defined(__DMC__) && (__DMC__ >= 0x810)
91
#define ENIGMA_CURRENT_FUNCTION __PRETTY_FUNCTION__
92
#elif defined(__FUNCSIG__)
93
#define ENIGMA_CURRENT_FUNCTION __FUNCSIG__
94
#elif (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 600)) || (defined(__IBMCPP__) && (__IBMCPP__ >= 500))
95
#define ENIGMA_CURRENT_FUNCTION __FUNCTION__
96
#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x550)
97
#define ENIGMA_CURRENT_FUNCTION __FUNC__
98
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
99
#define ENIGMA_CURRENT_FUNCTION __func__
100
#elif defined(__cplusplus) && (__cplusplus >= 201103)
101
#define ENIGMA_CURRENT_FUNCTION __func__
102
#elif defined(_MSC_VER)
103
#define ENIGMA_CURRENT_FUNCTION __FUNCTION__
104
#else
105
#define ENIGMA_CURRENT_FUNCTION "<unknown function>"
106
#endif
108
109
111
#define ENIGMA_NON_COPYABLE(Class) \
112
Class& operator=(const Class& obj) = delete; \
113
Class(const Class& obj) = delete;
114
#define ENIGMA_NON_MOVEABLE(Class) \
115
Class& operator=(Class&& obj) = delete;
117
118
120
#define ENIGMA_STATIC_CLASS(Class) \
121
public: \
122
ENIGMA_NON_COPYABLE(Class) \
123
ENIGMA_NON_MOVEABLE(Class) \
124
Class() = delete; \
125
~Class() = delete; \
126
\
127
private:
129
130
132
#define ENIGMA_BEGIN_TIMER(var) const auto var = std::chrono::steady_clock::now()
133
#define ENIGMA_END_TIMER(var, type, unit) std::chrono::duration_cast<std::chrono::duration<type, unit>>(std::chrono::steady_clock::now() - var).count()
134
// example: double ms = ENIGMA_END_TIMER(t1, double, std::milli);
136
137
139
#if defined(ENIGMA_DEBUG)
140
//#define ENIGMA_TRACE_CURRENT_FUNCTION() ENIGMA_TRACE(::Enigma::StringUtils::Cleanup(::Enigma::StringUtils::Cleanup(::Enigma::StringUtils::Cleanup(ENIGMA_CURRENT_FUNCTION, " __cdecl"), "struct"), "class"))
141
#define ENIGMA_TRACE_CURRENT_FUNCTION() ENIGMA_TRACE(ENIGMA_CURRENT_FUNCTION)
142
#else
143
#define ENIGMA_TRACE_CURRENT_FUNCTION()
144
#endif
146
148
#define ENIGMA_ENUM_DECLARE_BEGIN_END(begin) \
149
__HALT__, \
150
BEGIN = begin, \
151
END = __HALT__ - 1
153
155
#define ENIGMA_ENUM_CLASS_BITWISE_OPERATORS(_enum, _type) \
156
friend inline constexpr _enum operator~(const _enum i) noexcept { return static_cast<_enum>(~static_cast<const _type>(i)); } \
157
friend inline constexpr _enum operator|(const _enum a, const _enum b) noexcept { return static_cast<_enum>(static_cast<const _type>(a) | static_cast<const _type>(b)); } \
158
friend inline constexpr _enum operator&(const _enum a, const _enum b) noexcept { return static_cast<_enum>(static_cast<const _type>(a) & static_cast<const _type>(b)); } \
159
friend inline constexpr _enum operator^(const _enum a, const _enum b) noexcept { return static_cast<_enum>(static_cast<const _type>(a) ^ static_cast<const _type>(b)); } \
160
friend inline constexpr _enum& operator|=(_enum& a, const _enum b) noexcept { \
161
a = a | b; \
162
return a; \
163
} \
164
friend inline constexpr _enum& operator&=(_enum& a, const _enum b) noexcept { \
165
a = a & b; \
166
return a; \
167
} \
168
friend inline constexpr _enum& operator^=(_enum& a, const _enum b) noexcept { \
169
a = a ^ b; \
170
return a; \
171
}
172
173
175
176
177
//static void TimedFunction(
178
// const std::function<void()>& onStart,
179
// const std::function<void()>& func,
180
// const std::function<void(::Enigma::double)>& onFinish)
181
//{
182
// onStart();
183
// ENIGMA_BEGIN_TIMER(t1);
184
// func();
185
// ::Enigma::double elapsed = ENIGMA_END_TIMER(t1, double, std::milli) / 1000.0;
186
// onFinish(elapsed);
187
//}
188
189
190
#endif
// !ENIGMA_MACROS_H
src
Core
Macros.hpp
Generated on Sat Oct 19 2024 20:10:46 for Enigma by
1.9.1