[*] Clean up and expand AuroraMacros.hpp

This commit is contained in:
Reece Wilson 2021-10-25 18:06:01 +01:00
parent fab9856adb
commit 8a9d9b67e8

View File

@ -21,7 +21,9 @@
#define AU_BRACKET_SCOPE(...) __VA_ARGS__ #define AU_BRACKET_SCOPE(...) __VA_ARGS__
#define AU_TEMPLATE_ENABLE_WHEN(...) typename std::enable_if<__VA_ARGS__>::type* = nullptr #if !defined(AU_TEMPLATE_ENABLE_WHEN)
#define AU_TEMPLATE_ENABLE_WHEN(...) typename std::enable_if<__VA_ARGS__>::type* = nullptr
#endif
/// @hideinitializer /// @hideinitializer
#define AU_STRINGIFY_(in) #in #define AU_STRINGIFY_(in) #in
@ -34,84 +36,124 @@
/// @hideinitializer /// @hideinitializer
#define _AUKCON_STRINGIFY_X(in) AU_STRINGIFY(in) #define _AUKCON_STRINGIFY_X(in) AU_STRINGIFY(in)
#define AU_SHARED_API_EX(vis, name, type, ...) \ #if !defined(AU_SHARED_API_EX)
\ #define AU_SHARED_API_EX(vis, name, type, ...) \
vis type *name ## New(__VA_ARGS__); \ \
vis void name ## Release(type *); \ vis type *name ## New(__VA_ARGS__); \
static inline void name ## Destroy(type *val) \ vis void name ## Release(type *); \
{ \ static inline void name ## Destroy(type *val) \
name ## Release(val); \ { \
} \ name ## Release(val); \
\ } \
struct CppDeleter ## name \ \
{ \ struct CppDeleter ## name \
void operator()(type *t) \ { \
{ \ void operator()(type *t) \
name ## Release(t); \ { \
} \ name ## Release(t); \
}; \ } \
\ }; \
using name ## Unique_t = AURORA_RUNTIME_AU_UNIQUE_PTR<type, CppDeleter ## name>; \ \
template<typename ... T> \ using name ## Unique_t = AURORA_RUNTIME_AU_UNIQUE_PTR<type, CppDeleter ## name>; \
name ## Unique_t name ## Unique(T... args) \ template<typename ... T> \
{ \ name ## Unique_t name ## Unique(T... args) \
return name ## Unique_t(name ## New(args...)); \ { \
} \ return name ## Unique_t(name ## New(args...)); \
\ } \
using name ## Shared_t = std::shared_ptr<type>; \ \
template<typename ... T> \ using name ## Shared_t = std::shared_ptr<type>; \
name ## Shared_t name ## Shared(T... args) \ template<typename ... T> \
{ \ name ## Shared_t name ## Shared(T... args) \
return name ## Shared_t(name ## New(args...), name ## Release); \ { \
} return name ## Shared_t(name ## New(args...), name ## Release); \
}
#define AU_SHARED_API(name, type, ...) AU_SHARED_API_EX(, name, type, #__VA_ARGS__)
#if defined(AURORA_COMPILER_MSVC)
#define AU_NOINLINE __declspec(noinline)
#else
#define AU_NOINLINE __attribute__((noinline))
#endif #endif
#if defined(AURORA_COMPILER_MSVC) #if !defined(AU_SHARED_API)
#define AU_INLINE __declspec(__forceinline) #define AU_SHARED_API(name, type, ...) AU_SHARED_API_EX(, name, type, #__VA_ARGS__)
#else
#define AU_INLINE __attribute__((always_inline))
#endif #endif
#if defined(AURORA_COMPILER_MSVC) #if !defined(AU_NOINLINE)
#define AU_NORETURN __declspec(noreturn) #if defined(AURORA_COMPILER_MSVC)
#elif (defined(AURORA_COMPILER_CLANG) || defined(AURORA_COMPILER_GCC)) #define AU_NOINLINE __declspec(noinline)
#define AU_NORETURN __attribute__((noreturn)) #else
#elif defined(AU_LANG_CPP) #define AU_NOINLINE __attribute__((noinline))
#define AU_NORETURN [[noreturn]] #endif
#else
#define AU_NORETURN
#endif #endif
#if defined(AURORA_PLATFORM_WIN32) #if !defined(AU_INLINE)
#define AU_ALLOC __declspec(allocator) #if defined(AURORA_COMPILER_MSVC)
#elif defined(AURORA_COMPILER_CLANG) #define AU_INLINE __declspec(__forceinline)
#define AU_ALLOC __declspec(allocator) #else
#elif defined(AURORA_COMPILER_GCC) #define AU_INLINE __attribute__((always_inline))
#define AU_ALLOC __attribute__((malloc)) #endif
#else #endif
#define AU_ALLOC
#if !defined(AU_NORETURN)
#if defined(AURORA_COMPILER_MSVC)
#define AU_NORETURN __declspec(noreturn)
#elif (defined(AURORA_COMPILER_CLANG) || defined(AURORA_COMPILER_GCC))
#define AU_NORETURN __attribute__((noreturn))
#elif defined(AU_LANG_CPP)
#define AU_NORETURN [[noreturn]]
#else
#define AU_NORETURN
#endif
#endif
#if !defined(AU_ALLOC)
#if defined(AURORA_PLATFORM_WIN32)
#define AU_ALLOC __declspec(allocator)
#elif defined(AURORA_COMPILER_CLANG)
#define AU_ALLOC __declspec(allocator)
#elif defined(AURORA_COMPILER_GCC)
#define AU_ALLOC __attribute__((malloc))
#else
#define AU_ALLOC
#endif
#endif #endif
#if !defined(NO__NEW) #if !defined(NO__NEW)
#define _new new (std::nothrow) #if !defined(_new)
#define _new new (std::nothrow)
#endif
#endif #endif
#define AU_FWD(var) std::forward<decltype(var)>(var) #if !defined(AU_FWD)
#define AU_ITERATE_ARRAY(index, arry) AuUInt index = 0; index < AuArraySize(arry); index++ #define AU_FWD(var) std::forward<decltype(var)>(var)
#endif
#define AU_ITERATE_ARRAY(index, arry) AuUInt index = 0; index < AuArraySize(arry); index++
#define AU_ITERATE_N(index, n) AuUInt index = 0; index < n; index++
#define AU_ITERATE_N_TO_X(index, n, x) AuUInt index = n; index < x; index++
#define AU_ITERATE_BACKWARDS(index, lastIdx) AuUInt index = lastIdx; index <= 0; index--
#define AU_ITR_ARRAY AU_ITERATE_ARRAY
#define AU_ITR_N AU_ITERATE_N
#define AU_ITR_N_TO_X AU_ITERATE_N_TO_X
#define AU_ITR_BACKWARDS AU_ITERATE_BACKWARDS
#define AU_STRIP_BRACKETS_IMPL(X) X #define AU_STRIP_BRACKETS_IMPL(X) X
#define AU_STRIP_BRACKETS(X) AU_STRIP_BRACKETS_IMPL(AU_BRACKET_SCOPE X)
#define AU_EMIT_FIRST(a, b) a #if !defined(AU_STRIP_BRACKETS)
#define AU_EMIT_SECOND(a, b) b #define AU_STRIP_BRACKETS(X) AU_STRIP_BRACKETS_IMPL(AU_BRACKET_SCOPE X)
#define AU_EMIT_BOTH(a, b) a b #endif
#if !defined(AU_STRIP)
#define AU_STRIP AU_STRIP_BRACKETS
#endif
#if !defined(AU_EMIT_FIRST)
#define AU_EMIT_FIRST(a, b)a
#endif
#if !defined(AU_EMIT_SECOND)
#define AU_EMIT_SECOND(a, b)b
#endif
#if !defined(AU_EMIT_BOTH)
#define AU_EMIT_BOTH(a, b)a, a
#endif
#if !defined(AuBindThis) #if !defined(AuBindThis)
#define AuBindThis(method, ...) std::bind(method, this, ## __VA_ARGS__) #define AuBindThis(method, ...) std::bind(method, this, ## __VA_ARGS__)
@ -124,3 +166,13 @@ name ## Shared_t name ## Shared(T... args) \
#if !defined(AuWeakFromThis) #if !defined(AuWeakFromThis)
#define AuWeakFromThis() AU_SHARED_FROM_THIS #define AuWeakFromThis() AU_SHARED_FROM_THIS
#endif #endif
#define AU_DEFINE_CTOR_ONE(thisType, pairTypeName) \
inline thisType(AU_EMIT_FIRST pairTypeName && AU_EMIT_SECOND pairTypeName) : AU_EMIT_SECOND pairTypeName (AU_EMIT_SECOND pairTypeName) {} \
inline thisType(const AU_EMIT_FIRST pairTypeName & AU_EMIT_SECOND pairTypeName) : AU_EMIT_SECOND pairTypeName (AU_EMIT_SECOND pairTypeName) {}
#define AU_DEFINE_CTOR_TWO(thisType, pairTypeName, pairTypeName2) \
inline thisType(AU_EMIT_FIRST pairTypeName && AU_EMIT_SECOND pairTypeName, AU_EMIT_FIRST pairTypeName2 && AU_EMIT_SECOND pairTypeName2) : AU_EMIT_SECOND pairTypeName (AU_EMIT_SECOND pairTypeName), AU_EMIT_SECOND pairTypeName2 (AU_EMIT_SECOND pairTypeName2) {} \
inline thisType(const AU_EMIT_FIRST pairTypeName & AU_EMIT_SECOND pairTypeName, AU_EMIT_FIRST pairTypeName2 && AU_EMIT_SECOND pairTypeName2) : AU_EMIT_SECOND pairTypeName (AU_EMIT_SECOND pairTypeName), AU_EMIT_SECOND pairTypeName2 (AU_EMIT_SECOND pairTypeName2) {} \
inline thisType(AU_EMIT_FIRST pairTypeName && AU_EMIT_SECOND pairTypeName, const AU_EMIT_FIRST pairTypeName2 & AU_EMIT_SECOND pairTypeName2) : AU_EMIT_SECOND pairTypeName (AU_EMIT_SECOND pairTypeName), AU_EMIT_SECOND pairTypeName2 (AU_EMIT_SECOND pairTypeName2) {} \
inline thisType(const AU_EMIT_FIRST pairTypeName & AU_EMIT_SECOND pairTypeName, const AU_EMIT_FIRST pairTypeName2 & AU_EMIT_SECOND pairTypeName2) : AU_EMIT_SECOND pairTypeName (AU_EMIT_SECOND pairTypeName), AU_EMIT_SECOND pairTypeName2 (AU_EMIT_SECOND pairTypeName2) {}