/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuroraMacros.hpp Date: 2021-6-10 Author: Reece ***/ #pragma once #define AU_NO_COPY(type) type(type&) = delete; #define AU_NO_MOVE(type) type(type&&) = delete; #define AU_NO_COPY_NO_MOVE(type) AU_NO_COPY(type) AU_NO_MOVE(type) #define AU_SHARED_FROM_THIS (std::static_pointer_cast>(this->shared_from_this())) #define AU_WEAK_FROM_THIS (AuWPtr>(std::static_pointer_cast>(this->shared_from_this()))) /// @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) #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 \ { \ void operator()(type *t) \ { \ 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(args...)); \ } \ \ using name ## Shared_t = std::shared_ptr; \ template \ name ## Shared_t name ## Shared(T... args) \ { \ 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 #if defined(AURORA_COMPILER_MSVC) #define AU_INLINE __declspec(__forceinline) #else #define AU_INLINE __attribute__((always_inline)) #endif #if defined(AURORA_COMPILER_MSVC) #define AU_NORETURN __declspec(noreturn) #else #define AU_NORETURN [[noreturn]] #endif #if defined(AURORA_PLATFORM_WIN32) #define AU_ALLOC __declspec(allocator) #elif defined(AURORA_COMPILER_CLANG) #define AU_ALLOC __declspec(allocator) #elif defined(AURORA_COMPILER_COMMUNISM) #define AU_ALLOC __attribute__((malloc)) #else #define AU_ALLOC #endif #if !defined(NO__NEW) #define _new new (std::nothrow) #endif //#define AU_FWD(var) std::forward(var)