LkEngine 0.1.2
 
Loading...
Searching...
No Matches
CoreMacros.h
Go to the documentation of this file.
1
5#pragma once
6
7#include <cassert>
8#include <typeinfo>
9#include <regex>
10
11/* Needs to be fixed. */
12#if defined(LK_ENGINE_STATIC_LIB)
13# define CORE_API
14#else
15# if defined(LK_ENGINE_CORE)
16# define CORE_API __declspec(dllexport)
17# else
18# define CORE_API __declspec(dllimport)
19# endif
20#endif
21
22#define LK_UNUSED(Arg) ((void)(Arg))
23#define LK_ARRAYSIZE(Array) (static_cast<int>((sizeof(Array) / sizeof(*(Array)))))
24#define LK_BIT(x) (1 << x)
25#define LK_STRINGIFY(x) #x
26#define LK_TEXT(Text) L##Text /* Wide string. */
27
28#if defined(LK_ENGINE_MSVC)
29# define LK_FUNCSIG __FUNCSIG__
30# define LK_MALLOC _malloca
31#elif defined(LK_ENGINE_GCC) || defined(LK_ENGINE_CLANG)
32# define LK_FUNCSIG __PRETTY_FUNCTION__
33# define LK_MALLOC alloca
34#else
35# error "Unsupported compiler"
36#endif
37
38#if defined(STDCALL)
39# undef STDCALL
40#endif
41
42#if defined(VARARGS)
43# undef VARARGS
44#endif
45
46#if defined(FORCEINLINE)
47# undef FORCEINLINE
48#endif
49
58#if defined(LK_PLATFORM_WINDOWS)
59# define FORCEINLINE __forceinline
60# define VARARGS __cdecl
61# define STDCALL __stdcall
65#elif defined(LK_ENGINE_GCC)
66# define VARARGS __attribute__((cdecl))
67# define FORCEINLINE inline __attribute__((always_inline))
68# define STDCALL __attribute__((stdcall))
72#elif defined(LK_ENGINE_CLANG)
73# define FORCEINLINE __forceinline
74# define VARARGS __cdecl
75# define STDCALL __stdcall
76#endif
77
78#if defined(SPDLOG_USE_STD_FORMAT)
79# define LK_FMT_LIB std
80#else
81# define LK_FMT_LIB fmt
82#endif
83
84#define LK_FMT LK_FMT_LIB
85
86#define LK_MARK_FUNC_NOT_IMPLEMENTED(...) \
87 LK_CORE_ASSERT(false, "[ FUNCTION NOT IMPLEMENTED ]\n{}" __VA_OPT__("\n{}"), LK_FUNCSIG __VA_OPT__(, __VA_ARGS__))
88
89#define LK_MARK_FUNC_FOR_REMOVAL(...) \
90 LK_CORE_ASSERT(false, "[ FUNCTION IS DEPRECATED AND IS TO BE REMOVED ]\n{}" __VA_OPT__("\n\t{}"), LK_FUNCSIG __VA_OPT__(, __VA_ARGS__))
91
92#if defined(_MSC_VER)
93# define LK_ASSUME(x) __assume(x)
94# define LK_STRUCT_OFFSET(InStruct, InMember) offsetof(InStruct, InMember)
95#elif defined(__clang__)
96# define LK_ASSUME(x) __builtin_assume(x)
97# define LK_STRUCT_OFFSET(InStruct, InMember) __builtin_offsetof(InStruct, InMember)
98#else
99# define LK_ASSUME(x)
100# define LK_STRUCT_OFFSET(InStruct, InMember)
101#endif
102
103/* Branch prediction hints. */
104#ifndef LK_LIKELY
105# if (defined(__clang__) || defined(__GNUC__)) && LK_PLATFORM_LINUX
106# define LK_LIKELY(x) __builtin_expect(!!(x), 1)
107# else
108# define LK_LIKELY(x) (!!(x))
109# endif
110#endif
111
112#ifndef LK_UNLIKELY
113# if (defined(__clang__) || defined(__GNUC__)) && LK_PLATFORM_LINUX
114# define LK_UNLIKELY(x) __builtin_expect(!!(x), 0)
115# else
116# define LK_UNLIKELY(x) (!!(x))
117# endif
118#endif
119
120#define LK_GET_FIRST_ARG(Arg, ...) Arg
121
122#include "LkEngine/Core/LObject/Enum.h"
123
124namespace LkEngine
125{
129 enum class EClassFlag : uint32_t
130 {
131 None = LK_BIT(0),
132 Abstract = LK_BIT(1),
133 };
134 LK_ENUM_CLASS(EClassFlag);
135
142 enum class EClassType : uint64_t
143 {
144 LField = LK_BIT(0),
145 LEnum = LK_BIT(1),
146 LStruct = LK_BIT(2),
147 LClass = LK_BIT(3),
148 LObject = LK_BIT(4),
149 };
150 LK_ENUM_CLASS(EClassType);
151
156 enum class ELogFormat : uint8_t
157 {
158 Compact = 0,
159 Verbose
160 };
161
162 namespace Enum
163 {
164 static constexpr const char* ToString(const EClassType ClassType)
165 {
166 switch (ClassType)
167 {
168 case EClassType::LField: return "LField";
169 case EClassType::LEnum: return "LEnum";
170 case EClassType::LStruct: return "LStruct";
171 case EClassType::LClass: return "LClass";
172 case EClassType::LObject: return "LObject";
173 }
174 return nullptr;
175 }
176
177 static constexpr const char* ToString(const ELogFormat Format)
178 {
179 switch (Format)
180 {
181 case ELogFormat::Compact: return "Compact";
182 case ELogFormat::Verbose: return "Verbose";
183 }
184 return nullptr;
185 }
186 }
187
188 namespace Core::Internal
189 {
194 FORCEINLINE constexpr const char* RemovePrefix(const char* Str, const char Prefix = 'L')
195 {
196 return (Str[0] == Prefix) ? Str + 1 : Str;
197 }
198 }
199
200}
201
226#define LCLASS(Class) \
227 public: \
228 using BaseClass = LObject; \
229 using ThisClass = Class; \
230 virtual std::string ClassName() const override { return #Class; } \
231 static std::string_view StaticClassName() { return #Class; } \
232 static const ::LkEngine::LClass* StaticClass() \
233 { \
234 return ::LkEngine::LClass::Get(::LkEngine::LType<Class>::ID()); \
235 } \
236 virtual const ::LkEngine::LClass* ObjectRegistration() override \
237 { \
238 if (!LObject_bRegistered) \
239 { \
240 ::LkEngine::LClass* ObjectClass = ::LkEngine::LClass::Register<Class>(#Class); \
241 if (ObjectClass) \
242 { \
243 LObject_bRegistered = true; \
244 } \
245 return ObjectClass; \
246 } \
247 return ::LkEngine::LClass::Get(::LkEngine::LType<Class>::ID()); \
248 } \
249 inline static bool LObject_bRegistered = false; \
250 inline static ::LkEngine::EClassType LObject_Type = ::LkEngine::EClassType::LClass;
251
252
261#define LSTRUCT(Struct) \
262 public: \
263 using BaseClass = LObject; \
264 using ThisStruct = Struct; \
265 virtual std::string ClassName() const override { return #Struct; } \
266 static std::string_view StaticClassName() { return #Struct; } \
267 static const ::LkEngine::LClass* StaticClass() \
268 { \
269 return ::LkEngine::LClass::Get(::LkEngine::LType<Struct>::ID()); \
270 } \
271 virtual const ::LkEngine::LClass* ObjectRegistration() override \
272 { \
273 if (!LObject_bRegistered) \
274 { \
275 ::LkEngine::LClass* ObjectClass = ::LkEngine::LClass::Register<Struct>(#Struct); \
276 if (ObjectClass) \
277 { \
278 LObject_bRegistered = true; \
279 } \
280 return ObjectClass; \
281 } \
282 return ::LkEngine::LClass::Get(::LkEngine::LType<Struct>::ID()); \
283 } \
284 inline static bool LObject_bRegistered = false; \
285 inline static ::LkEngine::EClassType LObject_Type = ::LkEngine::EClassType::LStruct;
286
287
297#define LOBJECT_REGISTER(...) \
298 ::LkEngine::LClass* ClassObject = const_cast<::LkEngine::LClass*>(::LkEngine::LClass::Get(typeid(this))); \
299 if (!ClassObject) \
300 { \
301 ClassObject = const_cast<::LkEngine::LClass*>(ObjectRegistration()); \
302 if (!IsClassValid()) \
303 { \
304 ::LkEngine::LObjectBase::SetClass(const_cast<::LkEngine::LClass*>(ClassObject)); \
305 } \
306 } \
307
308
316#define LASSET(Class) \
317 public: \
318 LCLASS(Class); \
319 FORCEINLINE virtual bool IsAsset() const override { return true; } \
320 template<typename AssetType = Class> \
321 std::enable_if<!std::is_same_v<AssetType, LAsset>, EAssetType> \
322 FORCEINLINE GetAssetType() const { return GetStaticType(); } \
323
329#define LASSET_REGISTER(...) \
330 LClass* ClassObject = const_cast<LClass*>(LClass::Get(typeid(this))); \
331 if (!ClassObject) \
332 { \
333 ClassObject = const_cast<LClass*>(ObjectRegistration()); \
334 LObjectBase::SetClass(const_cast<LClass*>(ClassObject)); \
335 } \
336
337
345#define LPANEL(...) \
346 LCLASS(__VA_ARGS__);
347
355#define LPANEL_REGISTER(...) \
356 LOBJECT_REGISTER(__VA_ARGS__);
357
FORCEINLINE constexpr const char * RemovePrefix(const char *Str, const char Prefix='L')
Remove a single character from the start of a string.
Definition CoreMacros.h:194
Definition Class.h:17
Definition Object.h:46
Definition Asset.h:11
EClassType
Definition CoreMacros.h:143
ELogFormat
Definition CoreMacros.h:157