2#if !defined(__RADRR_CORE2H__)
3#define __RADRR_CORE2H__
10 #define RAD_PTRBITS 64
11 #define RAD_PTRBYTES 8
12 #define RAD_TWOPTRBYTES 16
14 #define RAD_PTRBITS 32
15 #define RAD_PTRBYTES 4
16 #define RAD_TWOPTRBYTES 8
19#if defined(__RADMAC__)
20 #define RR_BREAK() __builtin_trap()
21 #define RAD_GUARANTEED_SSE3
23 #define RAD_USES_SSSE3
25#if defined(__RADIPHONE__)
26 #define RR_BREAK() __builtin_trap()
27 #define RAD_GUARANTEED_SSE3
30#if defined(__RADANDROID__)
31 #define RR_BREAK() __builtin_trap()
34#if defined(__RADLINUX__)
35 #define RR_BREAK() __builtin_trap()
37#if defined(__RADQNX__)
38 #define RR_BREAK() __builtin_trap()
40#if defined(__RADWINRT__)
44 #define RR_BREAK __debugbreak
50 #define RR_BREAK __debugbreak
53#if defined(__RADEMSCRIPTEN__)
54 #define RR_BREAK() __builtin_trap()
58 #error "No rr_break defined!"
63 #define RAD_UINTr RAD_U64
64 #define RAD_SINTr RAD_S64
66 #define RAD_UINTr RAD_U32
67 #define RAD_SINTr RAD_S32
76#define RRSTRIPPABLE __declspec(selectany)
77#define RRSTRIPPABLEPUB __declspec(selectany)
79#define RRSTRIPPABLE static
80#define RRSTRIPPABLEPUB
87 #if (_MSC_VER >= 1300)
88 #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var
95 #ifndef RAD_USES_SSSE3
96 #define RAD_USES_SSSE3
99 #define RADFORCEINLINE __forceinline
100 #define RADASSUME(exp) __assume(exp)
102#elif defined(__clang__)
104 #define RAD_ALIGN(type,var,num) type __attribute__ ((aligned (num))) var
106 #define RADFORCEINLINE inline
108 #define RADFORCEINLINE inline __attribute((always_inline))
111 #ifndef RAD_USES_SSE3
112 #define RAD_USES_SSE3 __attribute__((target("sse3")))
114 #if !defined(RAD_USES_SSSE3) && !defined(__RADIPHONE__)
115 #define RAD_USES_SSSE3 __attribute__((target("ssse3")))
118 #if __has_builtin(__builtin_assume)
119 #define RADASSUME(exp) __builtin_assume(exp)
121 #define RADASSUME(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) __builtin_unreachable(); )
124#elif (defined(__GCC__) || defined(__GNUC__)) || defined(ANDROID)
126 #define RAD_ALIGN(type,var,num) type __attribute__ ((aligned (num))) var
128 #define RADFORCEINLINE inline
130 #define RADFORCEINLINE inline __attribute((always_inline))
133 #define __RAD_GCC_VERSION__ (__GNUC__ * 10000 \
134 + __GNUC_MINOR__ * 100 \
135 + __GNUC_PATCHLEVEL__)
137 #if __RAD_GCC_VERSION__ >= 40500
138 #define RADASSUME(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) __builtin_unreachable(); )
140 #define RADASSUME(exp)
143 #if __RAD_GCC_VERSION__ >= 40600
144 #ifndef RAD_USES_SSE3
145 #define RAD_USES_SSE3 __attribute__((target("sse3")))
147 #ifndef RAD_USES_SSSE3
148 #define RAD_USES_SSSE3 __attribute__((target("ssse3")))
152 #ifdef RAD_USES_SSSE3
153 #undef RAD_USES_SSSE3
158 #define RADASSUME(exp) !! no RADASSUME defined !!
159 #define RADFORCEINLINE !! no RADFORCEINLINE defined !!
171 #define RAD_STATEMENT_START \
174 #define RAD_STATEMENT_END_FALSE \
175 __pragma(warning(push)) \
176 __pragma(warning(disable:4127)) \
178 __pragma(warning(pop))
180 #define RAD_STATEMENT_END_TRUE \
181 __pragma(warning(push)) \
182 __pragma(warning(disable:4127)) \
184 __pragma(warning(pop))
187 #define RAD_USE_STANDARD_LOOP_CONSTRUCT
190 #define RAD_USE_STANDARD_LOOP_CONSTRUCT
193#ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT
194 #define RAD_STATEMENT_START \
197 #define RAD_STATEMENT_END_FALSE \
198 } while ( (void)0,0 )
200 #define RAD_STATEMENT_END_TRUE \
201 } while ( (void)1,1 )
204#define RAD_STATEMENT_WRAPPER( code ) \
205 RAD_STATEMENT_START \
207 RAD_STATEMENT_END_FALSE
209#define RAD_INFINITE_LOOP( code ) \
210 RAD_STATEMENT_START \
212 RAD_STATEMENT_END_TRUE
218#if defined(_MSC_VER) && _MSC_VER >= 1600
219 #define RR_UNUSED_VARIABLE(x) (void) (x)
221 #define RR_UNUSED_VARIABLE(x) (void)(sizeof(x))
226#define RR_STRINGIZE( L ) #L
227#define RR_DO_MACRO( M, X ) M(X)
228#define RR_STRINGIZE_DELAY( X ) RR_DO_MACRO( RR_STRINGIZE, X )
229#define RR_LINESTRING RR_STRINGIZE_DELAY( __LINE__ )
231#define RR_CAT(X,Y) X ## Y
233#define RR_STRING_JOIN3(arg1, arg2, arg3) RR_STRING_JOIN_DELAY3(arg1, arg2, arg3)
234#define RR_STRING_JOIN_DELAY3(arg1, arg2, arg3) RR_STRING_JOIN_IMMEDIATE3(arg1, arg2, arg3)
235#define RR_STRING_JOIN_IMMEDIATE3(arg1, arg2, arg3) arg1 ## arg2 ## arg3
241 #define RR_MIN(a,b) ( (a) < (b) ? (a) : (b) )
245 #define RR_MAX(a,b) ( (a) > (b) ? (a) : (b) )
249 #define RR_ABS(a) ( ((a) < 0) ? -(a) : (a) )
253 #define RR_CLAMP(val,lo,hi) RR_MAX( RR_MIN(val,hi), lo )
259#define RR_ARRAY_SIZE(array) ( sizeof(array)/sizeof(array[0]) )
262#define RR_MEMBER_OFFSET(type,member) offsetof(type, member)
265#define RR_MEMBER_SIZE(type,member) ( sizeof( ((type *) 0)->member) )
268#define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) )
269#define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) )
273#define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) )
287 #define RR_PREFETCH_SEQUENTIAL(ptr,offset)
288 #define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset)
289#elif defined(__RADANDROID__)
290 #define RR_PREFETCH_SEQUENTIAL(ptr,offset)
291 #define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset)
292#elif defined(__RADWINRT__)
293 #define RR_PREFETCH_SEQUENTIAL(ptr,offset) __prefetch((char *)(ptr) + (int)(offset))
294 #define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset)
295#elif defined(__RADARM__)
296 #define RR_PREFETCH_SEQUENTIAL(ptr,offset)
297 #define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset)
300 #ifndef RR_PREFETCH_SEQUENTIAL
301 #define RR_PREFETCH_SEQUENTIAL(ptr,offset) !! NO PREFETCH DEFINED !!
303 #ifndef RR_PREFETCH_WRITE_INVALIDATE
304 #define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) !! NO PREFETCH DEFINED !!
312#if (defined(_DEBUG) && !defined(NDEBUG)) || defined(ASSERT_IN_RELEASE)
313 #define RR_DO_ASSERTS
339 #define RR_ASSERT(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_BREAK(); } )
341 #define RR_ASSERT(exp) (void)0
344#define rrAssert RR_ASSERT
345#define rrassert RR_ASSERT
350 #pragma warning( disable : 4127)
369#ifdef RR_GET_RESTRICT
370 #define RR_GET_PTR_POST RADRESTRICT
372#ifndef RR_GET_PTR_POST
373 #define RR_GET_PTR_POST
378#define RR_GET16_NATIVE(ptr) *((const U16 * RR_GET_PTR_POST)(ptr))
379#define RR_PUT16_NATIVE(ptr,val) *((U16 * RR_GET_PTR_POST)(ptr)) = (U16)(val)
382#define RR_U16_PTR_OFFSET(ptr,offset) ((U16 * RR_GET_PTR_POST)((char *)(ptr) + (offset)))
383#define RR_GET16_NATIVE_OFFSET(ptr,offset) *( RR_U16_PTR_OFFSET((ptr),offset) )
384#define RR_PUT16_NATIVE_OFFSET(ptr,val,offset) *( RR_U16_PTR_OFFSET((ptr),offset)) = (val)
386#define RR_GET32_NATIVE(ptr) *((const U32 * RR_GET_PTR_POST)(ptr))
387#define RR_PUT32_NATIVE(ptr,val) *((U32 * RR_GET_PTR_POST)(ptr)) = (val)
390#define RR_U32_PTR_OFFSET(ptr,offset) ((U32 * RR_GET_PTR_POST)((char *)(ptr) + (offset)))
391#define RR_GET32_NATIVE_OFFSET(ptr,offset) *( RR_U32_PTR_OFFSET((ptr),offset) )
392#define RR_PUT32_NATIVE_OFFSET(ptr,val,offset) *( RR_U32_PTR_OFFSET((ptr),offset)) = (val)
394#define RR_GET64_NATIVE(ptr) *((const U64 * RR_GET_PTR_POST)(ptr))
395#define RR_PUT64_NATIVE(ptr,val) *((U64 * RR_GET_PTR_POST)(ptr)) = (val)
398#define RR_U64_PTR_OFFSET(ptr,offset) ((U64 * RR_GET_PTR_POST)((char *)(ptr) + (offset)))
399#define RR_GET64_NATIVE_OFFSET(ptr,offset) *( RR_U64_PTR_OFFSET((ptr),offset) )
400#define RR_PUT64_NATIVE_OFFSET(ptr,val,offset) *( RR_U64_PTR_OFFSET((ptr),offset)) = (val)
404#ifdef __RADLITTLEENDIAN__
405 #define RR_GET16_LE RR_GET16_NATIVE
406 #define RR_PUT16_LE RR_PUT16_NATIVE
407 #define RR_GET16_LE_OFFSET RR_GET16_NATIVE_OFFSET
408 #define RR_PUT16_LE_OFFSET RR_PUT16_NATIVE_OFFSET
410 #define RR_GET32_LE RR_GET32_NATIVE
411 #define RR_PUT32_LE RR_PUT32_NATIVE
412 #define RR_GET32_LE_OFFSET RR_GET32_NATIVE_OFFSET
413 #define RR_PUT32_LE_OFFSET RR_PUT32_NATIVE_OFFSET
415 #define RR_GET64_LE RR_GET64_NATIVE
416 #define RR_PUT64_LE RR_PUT64_NATIVE
417 #define RR_GET64_LE_OFFSET RR_GET64_NATIVE_OFFSET
418 #define RR_PUT64_LE_OFFSET RR_PUT64_NATIVE_OFFSET
420 #define RR_GET16_BE RR_GET16_NATIVE
421 #define RR_PUT16_BE RR_PUT16_NATIVE
422 #define RR_GET16_BE_OFFSET RR_GET16_NATIVE_OFFSET
423 #define RR_PUT16_BE_OFFSET RR_PUT16_NATIVE_OFFSET
425 #define RR_GET32_BE RR_GET32_NATIVE
426 #define RR_PUT32_BE RR_PUT32_NATIVE
427 #define RR_GET32_BE_OFFSET RR_GET32_NATIVE_OFFSET
428 #define RR_PUT32_BE_OFFSET RR_PUT32_NATIVE_OFFSET
430 #define RR_GET64_BE RR_GET64_NATIVE
431 #define RR_PUT64_BE RR_PUT64_NATIVE
432 #define RR_GET64_BE_OFFSET RR_GET64_NATIVE_OFFSET
433 #define RR_PUT64_BE_OFFSET RR_PUT64_NATIVE_OFFSET
439#if defined(__RADX86__)
441 #if (_MSC_VER >= 1300)
444 #pragma intrinsic(_byteswap_ushort, _byteswap_ulong)
446 #define RR_BSWAP16 _byteswap_ushort
447 #define RR_BSWAP32 _byteswap_ulong
450 #pragma intrinsic(_byteswap_uint64)
451 #define RR_BSWAP64 _byteswap_uint64
452 #elif defined(_MSC_VER)
485 #elif defined(__GNUC__) || defined(__clang__)
489 #define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) )
490 #define RR_BSWAP32 __builtin_bswap32
491 #define RR_BSWAP64 __builtin_bswap64
494 #define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr)))
495 #define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = (U16) RR_BSWAP16(val)
496 #define RR_GET16_BE_OFFSET(ptr,offset) RR_BSWAP16(*RR_U16_PTR_OFFSET(ptr,offset))
497 #define RR_PUT16_BE_OFFSET(ptr,val,offset) *RR_U16_PTR_OFFSET(ptr,offset) = RR_BSWAP16(val)
499 #define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr)))
500 #define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val)
501 #define RR_GET32_BE_OFFSET(ptr,offset) RR_BSWAP32(*RR_U32_PTR_OFFSET(ptr,offset))
502 #define RR_PUT32_BE_OFFSET(ptr,val,offset) *RR_U32_PTR_OFFSET(ptr,offset) = RR_BSWAP32(val)
504 #define RR_GET64_BE(ptr) RR_BSWAP64(*((U64 *)(ptr)))
505 #define RR_PUT64_BE(ptr,val) *((U64 *)(ptr)) = RR_BSWAP64(val)
506 #define RR_GET64_BE_OFFSET(ptr,offset) RR_BSWAP64(*RR_U64_PTR_OFFSET(ptr,offset))
507 #define RR_PUT64_BE_OFFSET(ptr,val,offset) *RR_U64_PTR_OFFSET(ptr,offset) = RR_BSWAP64(val)
509#elif defined(__RADIPHONE__) || defined(__RADANDROID__)
514 #define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) )
515 #define RR_BSWAP32(u32) ( (U32) ( ((u32) >> 24) | (((u32)<<8) & 0x00FF0000) | (((u32)>>8) & 0x0000FF00) | ((u32) << 24) ) )
516 #define RR_BSWAP64(u64) ( (U64) ( RR_BSWAP32((u64)>>32) | ((U64)RR_BSWAP32((U32)(u64))<<32) ) )
518 #define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr)))
519 #define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val)
521 #define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr)))
522 #define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val)
524 #define RR_GET64_BE(ptr) RR_BSWAP64(*((U64 *)(ptr)))
525 #define RR_PUT64_BE(ptr,val) *((U64 *)(ptr)) = RR_BSWAP64(val)
526#elif defined(__RADWINRTAPI__) && defined(__RADARM__)
528 #define RR_BSWAP16(u16) _arm_rev16(u16)
529 #define RR_BSWAP32(u32) _arm_rev(u32)
531 #define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr)))
532 #define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val)
534 #define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr)))
535 #define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val)
555#if defined(__RADX86__) || defined(__RADPPC__)
556 #define RR_GET64_BE_UNALIGNED(ptr) RR_GET64_BE(ptr)
557 #define RR_GET64_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET64_BE_OFFSET(ptr,offset)
558 #define RR_GET32_BE_UNALIGNED(ptr) RR_GET32_BE(ptr)
559 #define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET32_BE_OFFSET(ptr,offset)
560 #define RR_GET16_BE_UNALIGNED(ptr) RR_GET16_BE(ptr)
561 #define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET16_BE_OFFSET(ptr,offset)
563 #define RR_GET64_LE_UNALIGNED(ptr) RR_GET64_LE(ptr)
564 #define RR_GET64_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET64_LE_OFFSET(ptr,offset)
565 #define RR_GET32_LE_UNALIGNED(ptr) RR_GET32_LE(ptr)
566 #define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET32_LE_OFFSET(ptr,offset)
567 #define RR_GET16_LE_UNALIGNED(ptr) RR_GET16_LE(ptr)
568 #define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET16_LE_OFFSET(ptr,offset)
571 #define RR_GET32_BE_UNALIGNED(ptr) ( \
572 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 24 ) | \
573 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 16 ) | \
574 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[2] << 8 ) | \
575 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[3] << 0 ) )
577 #define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) ( \
578 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 24 ) | \
579 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 16 ) | \
580 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[2] << 8 ) | \
581 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[3] << 0 ) )
583 #define RR_GET16_BE_UNALIGNED(ptr) ( \
584 ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 8 ) | \
585 ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 0 ) )
587 #define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) ( \
588 ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 8 ) | \
589 ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 0 ) )
591 #define RR_GET32_LE_UNALIGNED(ptr) ( \
592 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[3] << 24 ) | \
593 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[2] << 16 ) | \
594 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 8 ) | \
595 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 0 ) )
597 #define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) ( \
598 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[3] << 24 ) | \
599 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[2] << 16 ) | \
600 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 8 ) | \
601 ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 0 ) )
603 #define RR_GET16_LE_UNALIGNED(ptr) ( \
604 ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 8 ) | \
605 ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 0 ) )
607 #define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) ( \
608 ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 8 ) | \
609 ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 0 ) )
620 #pragma intrinsic(_lrotl)
621 #define RR_ROTL32(x,k) _lrotl((unsigned long)(x),(int)(k))
626 #define RR_ROTL32(u32v,num) ( ( (u32v) << (num) ) | ( (u32v) >> (32 - (num))) )
634 #if ( defined(_MSC_VER) && _MSC_VER >= 1300)
636 #pragma intrinsic(_rotl64)
637 #define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k))
642 #define RR_ROTL64(u64v,num) ( ( (u64v) << (num) ) | ( (u64v) >> (64 - (num))) )
665 #define RADDEFINEDATA extern "C"
666 #define RADDECLAREDATA extern "C"
668 #define RR_NAMESPACE rr
669 #define RR_NAMESPACE_START namespace RR_NAMESPACE {
670 #define RR_NAMESPACE_END };
671 #define RR_NAMESPACE_USE using namespace RR_NAMESPACE;
673 #define RADDEFINEDATA
674 #define RADDECLAREDATA extern
677 #define RR_NAMESPACE_START
678 #define RR_NAMESPACE_END
679 #define RR_NAMESPACE_USE
#define RAD_UINTa
Definition egttypes.h:452
#define RR_STRING_JOIN(arg1, arg2)
Definition egttypes.h:78
#define RR_COMPILER_ASSERT(exp)
Definition egttypes.h:411
S32 rrbool
Definition egttypes.h:536
#define RADDEFFUNC
Definition egttypes.h:66
#define RADFORCEINLINE
Definition rrCore.h:159
#define RAD_PTRBITS
Definition rrCore.h:14
#define RAD_TWOPTRBYTES
Definition rrCore.h:16
#define RAD_PTRBYTES
Definition rrCore.h:15
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
unsigned long DWORD
Definition MinimalWindowsApi.h:67