Simplifying macros to fix VS' broken preprocessor.

This commit is contained in:
Ben Vanik 2014-01-12 14:06:00 -08:00
parent 123444078f
commit 6129e1eb7a
26 changed files with 76 additions and 83 deletions

View File

@ -2587,7 +2587,7 @@ uint32_t IntCode_MUL_HI_I32_I32(IntCodeState& ics, const IntCode* i) {
return IA_NEXT;
}
uint32_t IntCode_MUL_HI_I64_I64(IntCodeState& ics, const IntCode* i) {
#if !XE_COMPILER(MSVC)
#if !XE_COMPILER_MSVC
// GCC can, in theory, do this:
__int128 v =
(__int128)ics.rf[i->src1_reg].i64 * (__int128)ics.rf[i->src2_reg].i64;
@ -2622,7 +2622,7 @@ uint32_t IntCode_MUL_HI_I32_I32_U(IntCodeState& ics, const IntCode* i) {
return IA_NEXT;
}
uint32_t IntCode_MUL_HI_I64_I64_U(IntCodeState& ics, const IntCode* i) {
#if !XE_COMPILER(MSVC)
#if !XE_COMPILER_MSVC
// GCC can, in theory, do this:
__int128 v =
(__int128)ics.rf[i->src1_reg].i64 * (__int128)ics.rf[i->src2_reg].i64;

View File

@ -20,7 +20,7 @@
#include <xenia/types.h>
#if 0 && XE_COMPILER(MSVC) && defined(UNICODE) && UNICODE
#if 0 && XE_COMPILER_MSVC && defined(UNICODE) && UNICODE
// http://msdn.microsoft.com/en-us/library/b0084kay.aspx
#if !defined(__WFILE__)
#define WIDEN2(x) L##x
@ -38,7 +38,7 @@
#define __XE_ASSERT(expr) assert(expr)
#if XE_OPTION(ENABLE_ASSERTS)
#if XE_OPTION_ENABLE_ASSERTS
#define XEASSERTCORE(expr) __XE_ASSERT(expr)
#else
#define XEASSERTCORE(expr) XE_EMPTY_MACRO
@ -54,12 +54,12 @@
#define XEASSERTNOTNULL(expr) XEASSERTCORE( (expr) != NULL )
#if XE_COMPILER(MSVC)
#if XE_COMPILER_MSVC
// http://msdn.microsoft.com/en-us/library/bb918086.aspx
// TODO(benvanik): if 2010+, use static_assert?
// http://msdn.microsoft.com/en-us/library/dd293588.aspx
#define XESTATICASSERT(expr, message) _STATIC_ASSERT(expr)
//#elif XE_COMPILER(GNUC)
//#elif XE_COMPILER_GNUC
// http://stackoverflow.com/questions/3385515/static-assert-in-c
//#define XESTATICASSERT(expr, message) ({ extern int __attribute__((error("assertion failure: '" #expr "' not true - " #message))) compile_time_check(); ((expr)?0:compile_time_check()),0; })
#else

View File

@ -17,7 +17,7 @@
// These functions are modeled off of the Apple OSAtomic routines
// http://developer.apple.com/library/mac/#documentation/DriversKernelHardware/Reference/libkern_ref/OSAtomic_h/
#if XE_LIKE(OSX)
#if XE_LIKE_OSX
#include <libkern/OSAtomic.h>
#define xe_atomic_inc_32(value) \
@ -41,7 +41,7 @@ typedef OSQueueHead xe_atomic_stack_t;
#define xe_atomic_stack_dequeue(stack, offset) \
OSAtomicDequeue((OSQueueHead*)stack, offset)
#elif XE_LIKE(WIN32)
#elif XE_LIKE_WIN32
#define xe_atomic_inc_32(value) \
InterlockedIncrement((volatile LONG*)value)
@ -73,7 +73,7 @@ XEFORCEINLINE void* xe_atomic_stack_dequeue(xe_atomic_stack_t* stack,
}
}
#elif XE_LIKE(POSIX)
#elif XE_LIKE_POSIX
#define xe_atomic_inc_32(value) \
__sync_add_and_fetch(value, 1)

View File

@ -14,11 +14,11 @@
#include <xenia/types.h>
#if XE_COMPILER(MSVC)
#if XE_COMPILER_MSVC
#define XESWAP16 _byteswap_ushort
#define XESWAP32 _byteswap_ulong
#define XESWAP64 _byteswap_uint64
#elif XE_LIKE(OSX)
#elif XE_LIKE_OSX
#include <libkern/OSByteOrder.h>
#define XESWAP16 OSSwapInt16
#define XESWAP32 OSSwapInt32
@ -30,7 +30,7 @@
#endif
#if XE_CPU(BIGENDIAN)
#if XE_CPU_BIGENDIAN
#define XESWAP16BE(p) (p)
#define XESWAP32BE(p) (p)
#define XESWAP64BE(p) (p)
@ -47,7 +47,7 @@
#endif
#if XE_CPU(BIGENDIAN)
#if XE_CPU_BIGENDIAN
#define XESWAPF32BE(p) (p)
#define XESWAPF64BE(p) (p)
XEFORCEINLINE float XESWAPF32LE(float value) {

View File

@ -11,8 +11,6 @@
#define XENIA_CONFIG_H_
#define XE_OPTION(NAME) (defined XE_OPTION_##NAME && XE_OPTION_##NAME)
// Enable compile-time and runtime-time assertions.
#define XE_OPTION_ENABLE_ASSERTS 1

View File

@ -29,7 +29,7 @@ namespace xe {
#include <xenia/core/thread.h>
#include <xenia/core/window.h>
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
#include <xenia/core/win32_window.h>
#endif // WIN32

View File

@ -299,7 +299,7 @@ uint32_t xe_crc32(const void* data, size_t length, uint32_t previous_crc) {
// Process eight bytes at once (Slicing-by-8).
const uint32_t* current = (const uint32_t*)data;
while (length >= 8) {
#if XE_CPU(BIGENDIAN)
#if XE_CPU_BIGENDIAN
uint32_t one = *current++ ^ XESWAP32(crc);
uint32_t two = *current++;
crc = xe_crc32_lookup_[0][ two & 0xFF] ^

View File

@ -17,7 +17,7 @@ typedef struct xe_file {
} xe_file_t;
#if XE_LIKE(WIN32)
#if XE_LIKE_WIN32
#define fseeko _fseeki64
#define ftello _ftelli64
#endif // WIN32
@ -37,7 +37,7 @@ xe_file_ref xe_file_open(const xe_file_mode mode, const xechar_t *path) {
}
XEIGNORE(xestrcat(mode_string, XECOUNT(mode_string), XT("b")));
#if XE_LIKE(WIN32) && XE_WCHAR
#if XE_LIKE_WIN32 && XE_WCHAR
XEEXPECTZERO(_wfopen_s((FILE**)&file->handle, path, mode_string));
#else
file->handle = fopen(path, mode_string);

View File

@ -85,13 +85,13 @@ XEFORCEINLINE uint32_t UNALIGNED_LOAD32(const char *p) {
}
#endif
#if XE_CPU(BIGENDIAN)
#if XE_CPU_BIGENDIAN
#define uint32_t_in_expected_order(x) (XESWAP32(x))
#define uint64_in_expected_order(x) (XESWAP64(x))
#else
#define uint32_t_in_expected_order(x) (x)
#define uint64_in_expected_order(x) (x)
#endif // XE_CPU(BIGENDIAN)
#endif // XE_CPU_BIGENDIAN
#if !defined(LIKELY)
#if HAVE_BUILTIN_EXPECT

View File

@ -23,7 +23,7 @@ void xe_path_join(const xechar_t* left, const xechar_t* right,
void xe_path_get_absolute(const xechar_t* path, xechar_t* out_abs_path,
size_t abs_path_size) {
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
#if XE_WCHAR
_wfullpath(out_abs_path, path, abs_path_size);
#else

View File

@ -49,7 +49,7 @@ void xe_thread_release(xe_thread_ref thread) {
xe_ref_release((xe_ref)thread, (xe_ref_dealloc_t)xe_thread_dealloc);
}
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
// http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
#pragma pack(push,8)
@ -113,7 +113,7 @@ void xe_thread_join(xe_thread_ref thread) {
static void* xe_thread_callback_pthreads(void* param) {
xe_thread_t* thread = reinterpret_cast<xe_thread_t*>(param);
#if XE_LIKE(OSX)
#if XE_LIKE_OSX
XEIGNORE(pthread_setname_np(thread->name));
#else
pthread_setname_np(pthread_self(), thread->name);

View File

@ -20,7 +20,7 @@ using namespace xe::cpu;
// TODO(benvanik): move xbox.h out
#include <xenia/xbox.h>
#if !XE_PLATFORM(WIN32)
#if !XE_PLATFORM_WIN32
#include <sys/mman.h>
#endif // WIN32

View File

@ -9,7 +9,7 @@
#include <xenia/debug/protocols/ws/simple_sha1.h>
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
#include <winsock2.h>
#else
#include <arpa/inet.h>

View File

@ -21,7 +21,7 @@
#include <xenia/kernel/xboxkrnl_module.h>
#include <xenia/kernel/objects/xuser_module.h>
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
// Required for wslay.
typedef SSIZE_T ssize_t;
#endif // WIN32

View File

@ -32,7 +32,7 @@ GraphicsSystem* xe::gpu::CreateNop(Emulator* emulator) {
}
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
#include <xenia/gpu/d3d11/d3d11_gpu.h>
GraphicsSystem* xe::gpu::CreateD3D11(Emulator* emulator) {
return xe::gpu::d3d11::Create(emulator);
@ -43,7 +43,7 @@ GraphicsSystem* xe::gpu::CreateD3D11(Emulator* emulator) {
GraphicsSystem* xe::gpu::Create(Emulator* emulator) {
if (FLAGS_gpu.compare("nop") == 0) {
return CreateNop(emulator);
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
} else if (FLAGS_gpu.compare("d3d11") == 0) {
return CreateD3D11(emulator);
#endif // WIN32
@ -51,7 +51,7 @@ GraphicsSystem* xe::gpu::Create(Emulator* emulator) {
// Create best available.
GraphicsSystem* best = NULL;
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
best = CreateD3D11(emulator);
if (best) {
return best;

View File

@ -24,7 +24,7 @@ GraphicsSystem* Create(Emulator* emulator);
GraphicsSystem* CreateNop(Emulator* emulator);
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
GraphicsSystem* CreateD3D11(Emulator* emulator);
#endif // WIN32

View File

@ -21,7 +21,7 @@ DEFINE_string(hid, "any",
#include <xenia/hid/nop/nop_hid.h>
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
#include <xenia/hid/xinput/xinput_hid.h>
#endif // WIN32
@ -32,7 +32,7 @@ InputSystem* xe::hid::Create(Emulator* emulator) {
if (FLAGS_hid.compare("nop") == 0) {
input_system->AddDriver(xe::hid::nop::Create(input_system));
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
} else if (FLAGS_hid.compare("xinput") == 0) {
input_system->AddDriver(xe::hid::xinput::Create(input_system));
#endif // WIN32
@ -42,7 +42,7 @@ InputSystem* xe::hid::Create(Emulator* emulator) {
// NOTE: in any mode we create as many as we can, falling back to nop.
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
InputDriver* xinput_driver = xe::hid::xinput::Create(input_system);
if (xinput_driver) {
input_system->AddDriver(xinput_driver);

View File

@ -147,7 +147,7 @@ void XThread::set_name(const char* name) {
}
name_ = xestrdupa(name);
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
// Do the nasty set for us.
#pragma pack(push, 8)
typedef struct tagTHREADNAME_INFO {
@ -249,7 +249,7 @@ X_STATUS XThread::Exit(int exit_code) {
return X_STATUS_SUCCESS;
}
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
static uint32_t __stdcall XThreadStartCallbackWin32(void* param) {
XThread* thread = reinterpret_cast<XThread*>(param);
@ -308,7 +308,7 @@ X_STATUS XThread::PlatformCreate() {
int result_code;
if (creation_params_.creation_flags & X_CREATE_SUSPENDED) {
#if XE_PLATFORM(OSX)
#if XE_PLATFORM_OSX
result_code = pthread_create_suspended_np(
reinterpret_cast<pthread_t*>(&thread_handle_),
&attr,

View File

@ -465,7 +465,7 @@ uint32_t xeKeTlsAlloc() {
uint32_t tls_index;
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
tls_index = TlsAlloc();
#else
pthread_key_t key;
@ -501,7 +501,7 @@ int KeTlsFree(uint32_t tls_index) {
int result_code = 0;
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
result_code = TlsFree(tls_index);
#else
result_code = pthread_key_delete(tls_index) == 0;
@ -531,7 +531,7 @@ uint64_t xeKeTlsGetValue(uint32_t tls_index) {
uint64_t value = 0;
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
value = (uint64_t)TlsGetValue(tls_index);
#else
value = (uint64_t)pthread_getspecific(tls_index);
@ -567,7 +567,7 @@ int xeKeTlsSetValue(uint32_t tls_index, uint64_t tls_value) {
int result_code = 0;
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
result_code = TlsSetValue(tls_index, (LPVOID)tls_value);
#else
result_code = pthread_setspecific(tls_index, (void*)tls_value) == 0;

View File

@ -16,7 +16,7 @@
#include <xenia/string.h>
#if XE_COMPILER(GNUC)
#if XE_COMPILER_GNUC
#define XE_LOG_LINE_ATTRIBUTE __attribute__ ((format (printf, 5, 6)))
#else
#define XE_LOG_LINE_ATTRIBUTE
@ -26,7 +26,7 @@ void xe_log_line(const char* file_path, const uint32_t line_number,
const char* fmt, ...) XE_LOG_LINE_ATTRIBUTE;
#undef XE_LOG_LINE_ATTRIBUTE
#if XE_OPTION(ENABLE_LOGGING)
#if XE_OPTION_ENABLE_LOGGING
#define XELOGCORE(level, fmt, ...) xe_log_line( \
XE_CURRENT_FILE, XE_CURRENT_LINE, XE_CURRENT_FUNCTION, level, \
fmt, ##__VA_ARGS__)
@ -34,52 +34,52 @@ void xe_log_line(const char* file_path, const uint32_t line_number,
#define XELOGCORE(level, fmt, ...) XE_EMPTY_MACRO
#endif // ENABLE_LOGGING
#if XE_OPTION(LOG_ERROR)
#if XE_OPTION_LOG_ERROR
#define XELOGE(fmt, ...) XELOGCORE('!', fmt, ##__VA_ARGS__)
#else
#define XELOGE(fmt, ...) XE_EMPTY_MACRO
#endif
#if XE_OPTION(LOG_WARNING)
#if XE_OPTION_LOG_WARNING
#define XELOGW(fmt, ...) XELOGCORE('w', fmt, ##__VA_ARGS__)
#else
#define XELOGW(fmt, ...) XE_EMPTY_MACRO
#endif
#if XE_OPTION(LOG_INFO)
#if XE_OPTION_LOG_INFO
#define XELOGI(fmt, ...) XELOGCORE('i', fmt, ##__VA_ARGS__)
#else
#define XELOGI(fmt, ...) XE_EMPTY_MACRO
#endif
#if XE_OPTION(LOG_DEBUG)
#if XE_OPTION_LOG_DEBUG
#define XELOGD(fmt, ...) XELOGCORE('d', fmt, ##__VA_ARGS__)
#else
#define XELOGD(fmt, ...) XE_EMPTY_MACRO
#endif
#if XE_OPTION(LOG_CPU)
#if XE_OPTION_LOG_CPU
#define XELOGCPU(fmt, ...) XELOGCORE('C', fmt, ##__VA_ARGS__)
#else
#define XELOGCPU(fmt, ...) XE_EMPTY_MACRO
#endif
#if XE_OPTION(LOG_SDB)
#if XE_OPTION_LOG_SDB
#define XELOGSDB(fmt, ...) XELOGCORE('S', fmt, ##__VA_ARGS__)
#else
#define XELOGSDB(fmt, ...) XE_EMPTY_MACRO
#endif
#if XE_OPTION(LOG_APU)
#if XE_OPTION_LOG_APU
#define XELOGAPU(fmt, ...) XELOGCORE('A', fmt, ##__VA_ARGS__)
#else
#define XELOGAPU(fmt, ...) XE_EMPTY_MACRO
#endif
#if XE_OPTION(LOG_GPU)
#if XE_OPTION_LOG_GPU
#define XELOGGPU(fmt, ...) XELOGCORE('G', fmt, ##__VA_ARGS__)
#else
#define XELOGGPU(fmt, ...) XE_EMPTY_MACRO
#endif
#if XE_OPTION(LOG_KERNEL)
#if XE_OPTION_LOG_KERNEL
#define XELOGKERNEL(fmt, ...) XELOGCORE('K', fmt, ##__VA_ARGS__)
#else
#define XELOGKERNEL(fmt, ...) XE_EMPTY_MACRO
#endif
#if XE_OPTION(LOG_FS)
#if XE_OPTION_LOG_FS
#define XELOGFS(fmt, ...) XELOGCORE('F', fmt, ##__VA_ARGS__)
#else
#define XELOGFS(fmt, ...) XE_EMPTY_MACRO

View File

@ -21,7 +21,7 @@ typedef int (*user_main_t)(int argc, xechar_t** argv);
}
#if XE_LIKE(WIN32) && defined(UNICODE) && UNICODE
#if XE_LIKE_WIN32 && defined(UNICODE) && UNICODE
int xe_main_thunk(
int argc, wchar_t* argv[],

View File

@ -23,11 +23,6 @@ XE_COMPILER: GNUC | MSVC | INTEL | UNKNOWN
XE_CPU: 32BIT | 64BIT | BIGENDIAN | LITTLEENDIAN
*/
#define XE_PLATFORM(NAME) (defined XE_PLATFORM_##NAME && XE_PLATFORM_##NAME )
#define XE_LIKE(NAME) (defined XE_LIKE_##NAME && XE_LIKE_##NAME )
#define XE_PROFILE(NAME) (defined XE_PROFILE_##NAME && XE_PROFILE_##NAME )
#define XE_COMPILER(NAME) (defined XE_COMPILER_##NAME && XE_COMPILER_##NAME )
#define XE_CPU(NAME) (defined XE_CPU_##NAME && XE_CPU_##NAME )
#if defined(__APPLE__)
#include <TargetConditionals.h>
@ -133,13 +128,13 @@ XE_CPU: 32BIT | 64BIT | BIGENDIAN | LITTLEENDIAN
#define XE_DEBUG 1
#endif // DEBUG
#if XE_CPU(32BIT)
#if XE_CPU_32BIT
#define XE_ALIGNMENT 8
#else
#define XE_ALIGNMENT 16
#endif // 32BIT
#if XE_LIKE(WIN32) && defined(UNICODE) && UNICODE
#if XE_LIKE_WIN32 && defined(UNICODE) && UNICODE
int xe_main_thunk(
int argc, wchar_t* argv[],
void* user_main, const char* usage);

View File

@ -13,7 +13,7 @@
#include <xenia/platform.h>
#if XE_PLATFORM(WINCE) || XE_PLATFORM(WIN32)
#if XE_PLATFORM_WINCE || XE_PLATFORM_WIN32
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
@ -24,17 +24,17 @@
#undef max
#endif // WINCE || WIN32
#if XE_PLATFORM(XBOX360)
#if XE_PLATFORM_XBOX360
#include <xtl.h>
#include <xboxmath.h>
#endif // XBOX360
#if XE_COMPILER(MSVC)
#if XE_COMPILER_MSVC
// Disable warning C4068: unknown pragma
#pragma warning(disable : 4068)
#endif // MSVC
#if XE_LIKE(POSIX)
#if XE_LIKE_POSIX
#include <unistd.h>
#include <endian.h>
#endif // POSIX
@ -56,7 +56,7 @@
#include <assert.h>
#include <stdint.h>
#if XE_COMPILER(MSVC)
#if XE_COMPILER_MSVC
#include <memory>
#include <unordered_map>
#else

View File

@ -12,7 +12,7 @@
#include <xenia/common.h>
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
char* xestrcasestra(const char* str, const char* substr) {
const size_t len = xestrlena(substr);

View File

@ -19,7 +19,7 @@
#define XEInvalidSize ((size_t)(-1))
#if !XE_LIKE(WIN32)
#if !XE_LIKE_WIN32
int strncpy_s(char* dest, size_t destLength, const char* source, size_t count);
#define strcpy_s(dest, destLength, source) !(strcpy(dest, source) == dest + (destLength*0))
#define strcat_s(dest, destLength, source) !(strcat(dest, source) == dest + (destLength*0))
@ -62,7 +62,7 @@ char* xestrcasestra(const char* str, const char* substr);
#define xesnprintfa(buffer, bufferCount, format, ...) _snprintf_s(buffer, bufferCount, bufferCount, format, ##__VA_ARGS__)
#define xevsnprintfa(buffer, bufferCount, format, args) vsnprintf(buffer, bufferCount, format, args)
#if XE_PLATFORM(WIN32) && defined(UNICODE) && UNICODE
#if XE_PLATFORM_WIN32 && defined(UNICODE) && UNICODE
typedef wchar_t xechar_t;
#define XE_WCHAR 1
@ -115,7 +115,7 @@ typedef char xechar_t;
#define XT XETEXT
#define XTS XESTRFORMAT
#if XE_LIKE(WIN32)
#if XE_LIKE_WIN32
#define XE_PATH_SEPARATOR ((xechar_t)'\\')
#define XE_MAX_PATH _MAX_PATH
#else

View File

@ -39,13 +39,13 @@ using std::tr1::shared_ptr;
class name; \
} } } }
#if XE_COMPILER(MSVC)
#if XE_COMPILER_MSVC
#define XEASSUME(expr) __analysis_assume(expr)
#else
#define XEASSUME(expr)
#endif // MSVC
#if XE_COMPILER(MSVC)
#if XE_COMPILER_MSVC
#define XECDECL __cdecl
#else
#define XECDECL
@ -61,11 +61,11 @@ using std::tr1::shared_ptr;
#define XEEXTERNC_END
#endif // __cplusplus
#if XE_COMPILER(MSVC)
#if XE_COMPILER_MSVC
// http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx
#define XEFORCEINLINE static __forceinline
#define XENOINLINE __declspec(noinline)
#elif XE_COMPILER(GNUC)
#elif XE_COMPILER_GNUC
// http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
#if (__GNUC__ >= 4)
#define XEFORCEINLINE static __inline__ __attribute__((always_inline))
@ -78,7 +78,7 @@ using std::tr1::shared_ptr;
#define XENOINLINE
#endif // MSVC
#if XE_COMPILER(MSVC)
#if XE_COMPILER_MSVC
#define XEPACKEDSTRUCT(name, value) \
__pragma(pack(push, 1)) struct name##_s value __pragma(pack(pop)); \
typedef struct name##_s name;
@ -87,7 +87,7 @@ using std::tr1::shared_ptr;
#define XEPACKEDUNION(name, value) \
__pragma(pack(push, 1)) union name##_s value __pragma(pack(pop)); \
typedef union name##_s name;
#elif XE_COMPILER(GNUC)
#elif XE_COMPILER_GNUC
#define XEPACKEDSTRUCT(name, value) \
struct __attribute__((packed)) name
#define XEPACKEDSTRUCTANONYMOUS(value) \
@ -96,11 +96,11 @@ using std::tr1::shared_ptr;
union __attribute__((packed)) name
#endif // MSVC
#if XE_COMPILER(MSVC)
#if XE_COMPILER_MSVC
// http://msdn.microsoft.com/en-us/library/83ythb65.aspx
#define XECACHEALIGN __declspec(align(XE_ALIGNMENT))
#define XECACHEALIGN64 __declspec(align(64))
#elif XE_COMPILER(GNUC)
#elif XE_COMPILER_GNUC
// http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
#define XECACHEALIGN __attribute__ ((aligned(XE_ALIGNMENT)))
#define XECACHEALIGN64 __attribute__ ((aligned(64)))
@ -110,20 +110,20 @@ using std::tr1::shared_ptr;
#endif // MSVC
typedef XECACHEALIGN volatile void xe_aligned_void_t;
#if XE_COMPILER(MSVC)
#if XE_COMPILER_MSVC
// http://msdn.microsoft.com/en-us/library/ms175773.aspx
#define XECOUNT(array) _countof(array)
#elif XE_COMPILER(GNUC)
#elif XE_COMPILER_GNUC
#define XECOUNT(array) (sizeof(array) / sizeof(__typeof__(array[0])))
#else
#define XECOUNT(array) (sizeof(array) / sizeof(array[0]))
#endif // MSVC
#if !defined(MIN)
#if XE_COMPILER(GNUC)
#if XE_COMPILER_GNUC
#define MIN(A, B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); (__a < __b) ? __a : __b; })
#define MAX(A, B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); (__a < __b) ? __b : __a; })
//#elif XE_COMPILER(MSVC)
//#elif XE_COMPILER_MSVC
// TODO(benvanik): experiment with decltype:
// http://msdn.microsoft.com/en-us/library/dd537655.aspx
#else
@ -134,7 +134,7 @@ typedef XECACHEALIGN volatile void xe_aligned_void_t;
#endif // GNUC
#endif // !MIN
#if XE_PLATFORM(WIN32)
#if XE_PLATFORM_WIN32
#define XESAFERELEASE(p) if (p) { p->Release(); }
#endif // WIN32