/*** 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) #define AU_OPERATOR_COPY(type) inline type &operator =(const type ©) { AuResetMember(*this, copy); return *this; } #define AU_OPERATOR_MOVE(type) inline type &operator =(type &&move) { AuResetMember(*this, AuMove(move)); return *this; } #define AU_OPERATOR_COPY_MOVE(type) AU_OPERATOR_COPY(type) AU_OPERATOR_MOVE(type) #if !defined(AU_SHARED_FROM_THIS) #define AU_SHARED_FROM_THIS (AuStaticPointerCast>(this->SharedFromThis())) #endif #if !defined(AU_WEAK_FROM_THIS) #define AU_WEAK_FROM_THIS (AuWPtr>(AU_SHARED_FROM_THIS)) #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; \ template \ name ## Unique_t name ## Unique(T &&... args) \ { \ return name ## Unique_t(name ## New(AuForward(args)...)); \ } \ \ using name ## Shared_t = AuSPtr; \ template \ name ## Shared_t name ## Shared(T &&... args) \ { \ auto ptr = name ## New(AuForward(args)...); \ if (!ptr) \ { \ return {}; \ } \ AUROXTL_COMMODITY_TRY \ { \ return name ## Shared_t(ptr, name ## Release); \ } \ AUROXTL_COMMODITY_CATCH \ { \ return {}; \ } \ } #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(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_WEAK_FROM_THIS #endif #if !defined(AuSharedPointerFromThis) #define AuSharedPointerFromThis(pPtr) (AuSPtr>(AuSharedFromThis(), pPtr)) #endif #if !defined(AuSharedPointerFromShared) #define AuSharedPointerFromShared(pPtr, pParentShared) (AuSPtr>(pParentShared, pPtr)) #endif #define AU_EMIT_FIRST_COMMA_FIRST(n)n #define AU_EMIT_FIRST_COMMA_OTHERS(n),n #include "Objects/Objects.hpp"