// Copyright 2013 Dolphin Emulator Project / 2014 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include "common/common_types.h" /// Textually concatenates two tokens. The double-expansion is required by the C preprocessor. #define CONCAT2(x, y) DO_CONCAT2(x, y) #define DO_CONCAT2(x, y) x##y // helper macro to properly align structure members. // Calling INSERT_PADDING_BYTES will add a new member variable with a name like "pad121", // depending on the current source line to make sure variable names are unique. #define INSERT_PADDING_BYTES(num_bytes) u8 CONCAT2(pad, __LINE__)[(num_bytes)] #define INSERT_PADDING_WORDS(num_words) u32 CONCAT2(pad, __LINE__)[(num_words)] // Inlining #ifdef _WIN32 #define FORCE_INLINE __forceinline #else #define FORCE_INLINE inline __attribute__((always_inline)) #endif #ifdef _MSC_VER #define CITRA_NO_INLINE __declspec(noinline) #else #define CITRA_NO_INLINE __attribute__((noinline)) #endif #ifdef _MSC_VER #define CITRA_NO_RETURN __declspec(noreturn) #else #define CITRA_NO_RETURN __attribute__((noreturn)) #endif #ifdef _MSC_VER extern "C" { __declspec(dllimport) void __stdcall DebugBreak(void); } #define Crash() DebugBreak() #else #define Crash() __builtin_trap() #endif #ifdef _MSC_VER // Locale Cross-Compatibility #define locale_t _locale_t #endif // _MSC_VER #define DECLARE_ENUM_FLAG_OPERATORS(type) \ [[nodiscard]] constexpr type operator|(type a, type b) noexcept { \ using T = std::underlying_type_t; \ return static_cast(static_cast(a) | static_cast(b)); \ } \ [[nodiscard]] constexpr type operator&(type a, type b) noexcept { \ using T = std::underlying_type_t; \ return static_cast(static_cast(a) & static_cast(b)); \ } \ [[nodiscard]] constexpr type operator^(type a, type b) noexcept { \ using T = std::underlying_type_t; \ return static_cast(static_cast(a) ^ static_cast(b)); \ } \ [[nodiscard]] constexpr type operator<<(type a, type b) noexcept { \ using T = std::underlying_type_t; \ return static_cast(static_cast(a) << static_cast(b)); \ } \ [[nodiscard]] constexpr type operator>>(type a, type b) noexcept { \ using T = std::underlying_type_t; \ return static_cast(static_cast(a) >> static_cast(b)); \ } \ constexpr type& operator|=(type& a, type b) noexcept { \ a = a | b; \ return a; \ } \ constexpr type& operator&=(type& a, type b) noexcept { \ a = a & b; \ return a; \ } \ constexpr type& operator^=(type& a, type b) noexcept { \ a = a ^ b; \ return a; \ } \ constexpr type& operator<<=(type& a, type b) noexcept { \ a = a << b; \ return a; \ } \ constexpr type& operator>>=(type& a, type b) noexcept { \ a = a >> b; \ return a; \ } \ [[nodiscard]] constexpr type operator~(type key) noexcept { \ using T = std::underlying_type_t; \ return static_cast(~static_cast(key)); \ } \ [[nodiscard]] constexpr bool True(type key) noexcept { \ using T = std::underlying_type_t; \ return static_cast(key) != 0; \ } \ [[nodiscard]] constexpr bool False(type key) noexcept { \ using T = std::underlying_type_t; \ return static_cast(key) == 0; \ }