269 lines
8.5 KiB
C++
269 lines
8.5 KiB
C++
/***
|
|
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
|
|
|
File: AuroraMacros.hpp
|
|
File: AU_MACROS.hpp
|
|
Date: 2021-6-10
|
|
Author: Reece
|
|
***/
|
|
#pragma once
|
|
|
|
#define AU_DEF(type) inline type() = default;
|
|
|
|
#define AU_COPY(type) inline type(const type&) = default; inline type &operator=(const type &) = default;
|
|
#define AU_MOVE(type) inline type(type&&) = default; inline type &operator=(type &&) = default;
|
|
#define AU_COPY_MOVE(type) AU_COPY(type) AU_MOVE(type)
|
|
#define AU_COPY_MOVE_DEF(type) AU_COPY(type) AU_MOVE(type) AU_DEF(type)
|
|
|
|
#define AU_NO_COPY(type) inline type(const type&) = delete;
|
|
#define AU_NO_MOVE(type) inline type(type&&) = delete;
|
|
#define AU_NO_COPY_NO_MOVE(type) AU_NO_COPY(type) AU_NO_MOVE(type)
|
|
|
|
#if !defined(AU_SHARED_FROM_THIS)
|
|
#define AU_SHARED_FROM_THIS (AuStaticPointerCast<AuRemovePointer_t<decltype(this)>>(this->SharedFromThis()))
|
|
#endif
|
|
|
|
#if !defined(AU_WEAK_FROM_THIS)
|
|
#define AU_WEAK_FROM_THIS (AuWPtr<AuRemovePointer_t<decltype(this)>>(AuStaticPointerCast<AuRemovePointer_t<decltype(this)>>(this->SharedFromThis())))
|
|
#endif
|
|
|
|
#define AU_BRACKET_SCOPE(...) __VA_ARGS__
|
|
|
|
#if !defined(AU_TEMPLATE_ENABLE_WHEN)
|
|
#define AU_TEMPLATE_ENABLE_WHEN(...) typename AuEnableIf<__VA_ARGS__>::type* = nullptr
|
|
#endif
|
|
|
|
#define AU_WHAT(n) n
|
|
|
|
/// @hideinitializer
|
|
#define _AU_STRINGIFY(in) #in
|
|
#define AU_STRINGIFY(in) _AU_STRINGIFY(in)
|
|
|
|
/// @hideinitializer
|
|
#define _AU_CONCAT(a, b) a ## b
|
|
#define AU_CONCAT(a, b) _AU_CONCAT(a, b)
|
|
|
|
/// @hideinitializer
|
|
#define _AUKCON_STRINGIFY_X(in) AU_STRINGIFY(in)
|
|
|
|
#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 *); \
|
|
static inline void name ## Destroy(type *val) \
|
|
{ \
|
|
name ## Release(val); \
|
|
} \
|
|
\
|
|
struct CppDeleter ## name \
|
|
{ \
|
|
inline void operator()(type *t) \
|
|
{ \
|
|
if (!t) return; \
|
|
name ## Release(t); \
|
|
} \
|
|
}; \
|
|
\
|
|
using name ## Unique_t = AURORA_RUNTIME_AU_UNIQUE_PTR<type, CppDeleter ## name>; \
|
|
template <class ... T> \
|
|
name ## Unique_t name ## Unique(T... args) \
|
|
{ \
|
|
return name ## Unique_t(name ## New(args...)); \
|
|
} \
|
|
\
|
|
using name ## Shared_t = AuSPtr<type>; \
|
|
template <class ... T> \
|
|
name ## Shared_t name ## Shared(T... args) \
|
|
{ \
|
|
auto ptr = name ## New(args...); \
|
|
if (!ptr) return {}; \
|
|
return name ## Shared_t(ptr, name ## Release); \
|
|
}
|
|
#endif
|
|
|
|
#if !defined(AU_SHARED_API)
|
|
#define AU_SHARED_API(name, type, ...) AU_SHARED_API_EX(, name, type, ##__VA_ARGS__)
|
|
#endif
|
|
|
|
#if !defined(AU_NOINLINE)
|
|
#if defined(AURORA_COMPILER_MSVC)
|
|
#define AU_NOINLINE __declspec(noinline)
|
|
#else
|
|
#define AU_NOINLINE __attribute__((noinline))
|
|
#endif
|
|
#endif
|
|
|
|
#if !defined(AU_INLINE)
|
|
#if defined(AURORA_COMPILER_MSVC)
|
|
#define AU_INLINE __forceinline
|
|
#else
|
|
#define AU_INLINE __attribute__((always_inline))
|
|
#endif
|
|
#endif
|
|
|
|
#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
|
|
|
|
#if !defined(NO__NEW)
|
|
// new... the way it should be.
|
|
// not sure who thought it would be a good idea to add tags in the placement new syntax
|
|
#if !defined(_new)
|
|
#define _new new (std::nothrow)
|
|
#endif
|
|
#endif
|
|
|
|
#if !defined(NO_C_CLASS_MACROS)
|
|
// C-like inline and static for classes/structures (hence the c-prefix... class)
|
|
|
|
#if !defined(cstatic)
|
|
#define cstatic inline static
|
|
#endif
|
|
|
|
#if !defined(cinline)
|
|
#define cinline AU_INLINE
|
|
#endif
|
|
#endif
|
|
|
|
#if !defined(NO__INLINE)
|
|
// an actual inline pseudo-keyword without the requirement of mucho-texto
|
|
#if !defined(auline)
|
|
#define auline AU_INLINE
|
|
#endif
|
|
#endif
|
|
|
|
#if !defined(AU_FWD)
|
|
#define AU_FWD(var) AuForward<decltype(var)>(var)
|
|
#endif
|
|
|
|
#if !defined(AU_ALIGN)
|
|
#if defined(AURORA_COMPILER_MSVC)
|
|
#define AU_ALIGN(uSize) __declspec(align(uSize))
|
|
#else
|
|
#define AU_ALIGN(uSize) __attribute__((aligned(uSize)))
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(_AURORA_MISSING_STD_EXCEPTION)
|
|
|
|
#define AuStringException AuString
|
|
|
|
#else
|
|
|
|
struct AuStringException : std::exception
|
|
{
|
|
inline AuStringException(const char *str) : pNullString(str)
|
|
{
|
|
|
|
}
|
|
|
|
inline const char *what() const noexcept override
|
|
{
|
|
return pNullString;
|
|
}
|
|
|
|
const char *pNullString;
|
|
};
|
|
#endif
|
|
|
|
struct AuStringOwnedException : AuStringException
|
|
{
|
|
inline AuStringOwnedException(const char *str) noexcept : AuStringException("")
|
|
{
|
|
buffer = str;
|
|
this->pNullString = buffer.c_str();
|
|
}
|
|
|
|
inline AuStringOwnedException(const std::string &str) noexcept : AuStringException("")
|
|
{
|
|
buffer = str;
|
|
this->pNullString = buffer.c_str();
|
|
}
|
|
|
|
inline AuStringOwnedException(std::string &&str) noexcept : AuStringException("")
|
|
{
|
|
buffer = std::move(str);
|
|
this->pNullString = buffer.c_str();
|
|
}
|
|
|
|
std::string buffer;
|
|
};
|
|
|
|
#if !defined(AU_THROW_CONST_STRING)
|
|
#define AU_THROW_CONST_STRING(var) throw AuStringException(var)
|
|
#endif
|
|
|
|
#if !defined(AU_THROW_STRING)
|
|
#define AU_THROW_STRING(var) throw AuStringOwnedException(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(...) __VA_ARGS__
|
|
|
|
#if !defined(AU_STRIP_BRACKETS)
|
|
#define AU_STRIP_BRACKETS(X) AU_WHAT(AU_STRIP_BRACKETS_IMPL X)
|
|
#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)
|
|
#define AuBindThis(method, ...) std::bind(method, this, ## __VA_ARGS__)
|
|
#endif
|
|
|
|
#if !defined(AuSharedFromThis)
|
|
#define AuSharedFromThis() AU_SHARED_FROM_THIS
|
|
#endif
|
|
|
|
#if !defined(AuWeakFromThis)
|
|
#define AuWeakFromThis() AU_SHARED_FROM_THIS
|
|
#endif
|
|
|
|
#define AU_EMIT_FIRST_COMMA_FIRST(n)n
|
|
#define AU_EMIT_FIRST_COMMA_OTHERS(n),n
|
|
|
|
#include "Objects/Objects.hpp"
|