12#if defined(LK_ENGINE_STATIC_LIB)
15# if defined(LK_ENGINE_CORE)
16# define CORE_API __declspec(dllexport)
18# define CORE_API __declspec(dllimport)
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
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
35# error "Unsupported compiler"
46#if defined(FORCEINLINE)
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
78#if defined(SPDLOG_USE_STD_FORMAT)
79# define LK_FMT_LIB std
81# define LK_FMT_LIB fmt
84#define LK_FMT LK_FMT_LIB
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__))
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__))
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)
100# define LK_STRUCT_OFFSET(InStruct, InMember)
105# if (defined(__clang__) || defined(__GNUC__)) && LK_PLATFORM_LINUX
106# define LK_LIKELY(x) __builtin_expect(!!(x), 1)
108# define LK_LIKELY(x) (!!(x))
113# if (defined(__clang__) || defined(__GNUC__)) && LK_PLATFORM_LINUX
114# define LK_UNLIKELY(x) __builtin_expect(!!(x), 0)
116# define LK_UNLIKELY(x) (!!(x))
120#define LK_GET_FIRST_ARG(Arg, ...) Arg
122#include "LkEngine/Core/LObject/Enum.h"
129 enum class EClassFlag : uint32_t
132 Abstract = LK_BIT(1),
134 LK_ENUM_CLASS(EClassFlag);
164 static constexpr const char* ToString(
const EClassType ClassType)
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";
177 static constexpr const char* ToString(
const ELogFormat Format)
181 case ELogFormat::Compact:
return "Compact";
182 case ELogFormat::Verbose:
return "Verbose";
188 namespace Core::Internal
194 FORCEINLINE
constexpr const char*
RemovePrefix(
const char* Str,
const char Prefix =
'L')
196 return (Str[0] == Prefix) ? Str + 1 : Str;
226#define LCLASS(Class) \
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() \
234 return ::LkEngine::LClass::Get(::LkEngine::LType<Class>::ID()); \
236 virtual const ::LkEngine::LClass* ObjectRegistration() override \
238 if (!LObject_bRegistered) \
240 ::LkEngine::LClass* ObjectClass = ::LkEngine::LClass::Register<Class>(#Class); \
243 LObject_bRegistered = true; \
245 return ObjectClass; \
247 return ::LkEngine::LClass::Get(::LkEngine::LType<Class>::ID()); \
249 inline static bool LObject_bRegistered = false; \
250 inline static ::LkEngine::EClassType LObject_Type = ::LkEngine::EClassType::LClass;
261#define LSTRUCT(Struct) \
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() \
269 return ::LkEngine::LClass::Get(::LkEngine::LType<Struct>::ID()); \
271 virtual const ::LkEngine::LClass* ObjectRegistration() override \
273 if (!LObject_bRegistered) \
275 ::LkEngine::LClass* ObjectClass = ::LkEngine::LClass::Register<Struct>(#Struct); \
278 LObject_bRegistered = true; \
280 return ObjectClass; \
282 return ::LkEngine::LClass::Get(::LkEngine::LType<Struct>::ID()); \
284 inline static bool LObject_bRegistered = false; \
285 inline static ::LkEngine::EClassType LObject_Type = ::LkEngine::EClassType::LStruct;
297#define LOBJECT_REGISTER(...) \
298 ::LkEngine::LClass* ClassObject = const_cast<::LkEngine::LClass*>(::LkEngine::LClass::Get(typeid(this))); \
301 ClassObject = const_cast<::LkEngine::LClass*>(ObjectRegistration()); \
302 if (!IsClassValid()) \
304 ::LkEngine::LObjectBase::SetClass(const_cast<::LkEngine::LClass*>(ClassObject)); \
316#define LASSET(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(); } \
329#define LASSET_REGISTER(...) \
330 LClass* ClassObject = const_cast<LClass*>(LClass::Get(typeid(this))); \
333 ClassObject = const_cast<LClass*>(ObjectRegistration()); \
334 LObjectBase::SetClass(const_cast<LClass*>(ClassObject)); \
355#define LPANEL_REGISTER(...) \
356 LOBJECT_REGISTER(__VA_ARGS__);
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
EClassType
Definition CoreMacros.h:143
ELogFormat
Definition CoreMacros.h:157