Endianness.h cstdint sys/param.h ByteSwap.h USE_SYS_PARAM_H std::uint16_t static std::uint16_t bswap16 (std::uint16_t x) bswap16 std::uint16_t x bswap bswap16x8 std::uint32_t static std::uint32_t bswap32 (std::uint32_t x) bswap32 std::uint32_t x bswap bswap32x4 std::uint64_t static std::uint64_t bswap64 (std::uint64_t x) bswap64 std::uint64_t x bswap bswap64x2 void static void bswap16x8 (std::uint16_t *source) bswap16x8 std::uint16_t * source bswap16 bswap void static void bswap32x4 (std::uint32_t *source) bswap32x4 std::uint32_t * source bswap32 bswap void static void bswap64x2 (std::uint64_t *source) bswap64x2 std::uint64_t * source bswap64 bswap std::uint8_t std::uint8_t ntoh (std::uint8_t x) ntoh std::uint8_t x std::uint16_t std::uint16_t ntoh (std::uint16_t x) ntoh std::uint16_t x std::uint32_t std::uint32_t ntoh (std::uint32_t x) ntoh std::uint32_t x std::uint64_t std::uint64_t ntoh (std::uint64_t x) ntoh std::uint64_t x std::uint8_t std::uint8_t hton (std::uint8_t x) hton std::uint8_t x std::uint16_t std::uint16_t hton (std::uint16_t x) hton std::uint16_t x std::uint32_t std::uint32_t hton (std::uint32_t x) hton std::uint32_t x std::uint64_t std::uint64_t hton (std::uint64_t x) hton std::uint64_t x void void ntoh (std::uint8_t *x) ntoh std::uint8_t * x void void ntoh (std::uint16_t *x) ntoh std::uint16_t * x void void ntoh (std::uint32_t *x) ntoh std::uint32_t * x void void ntoh (std::uint64_t *x) ntoh std::uint64_t * x void void hton (std::uint8_t *x) hton std::uint8_t * x void void hton (std::uint16_t *x) hton std::uint16_t * x void void hton (std::uint32_t *x) hton std::uint32_t * x void void hton (std::uint64_t *x) hton std::uint64_t * x std::uint8_t std::uint8_t bswap (std::uint8_t x) bswap std::uint8_t x terse::ByteSwapper< Endianness::Little >::swap terse::ByteSwapper< Endianness::Big >::swap std::uint16_t std::uint16_t bswap (std::uint16_t x) bswap std::uint16_t x bswap16 std::uint32_t std::uint32_t bswap (std::uint32_t x) bswap std::uint32_t x bswap32 std::uint64_t std::uint64_t bswap (std::uint64_t x) bswap std::uint64_t x bswap64 void void bswap (std::uint8_t *x) bswap std::uint8_t * x void void bswap (std::uint16_t *x) bswap std::uint16_t * x bswap16x8 void void bswap (std::uint32_t *x) bswap std::uint32_t * x bswap32x4 void void bswap (std::uint64_t *x) bswap std::uint64_t * x bswap64x2 //CopyrightEpicGames,Inc.AllRightsReserved. #pragmaonce #include<cstdint> #ifdefined(ENABLE_SSE_BSWAP) #include<immintrin.h> #endif #if!defined(NO_ENDIAN_H) #ifdefined(USE_ENDIAN_H)||defined(USE_MACHINE_ENDIAN_H)||defined(USE_SYS_ENDIAN_H)||defined(USE_SYS_ISA_DEFS_H)||\ defined(USE_SYS_PARAM_H) #defineOVERRIDDEN_ENDIAN_H #endif #if!defined(OVERRIDDEN_ENDIAN_H) #ifdefined(__linux__)||defined(__GLIBC__)||defined(__CYGWIN__)||defined(__ANDROID__) #defineUSE_ENDIAN_H #elifdefined(__APPLE__) #defineUSE_MACHINE_ENDIAN_H #elifdefined(__FreeBSD__)||defined(__NetBSD__)||defined(__OpenBSD__) #defineUSE_SYS_ENDIAN_H #elifdefined(__sun) #defineUSE_SYS_ISA_DEFS_H #elifdefined(__MINGW32__)||defined(__MINGW64__)||!(defined(_WIN64)||defined(_WIN32)) #defineUSE_SYS_PARAM_H #endif #endif #ifdefined(USE_ENDIAN_H) #include<endian.h> #elifdefined(USE_MACHINE_ENDIAN_H) #include<machine/endian.h> #elifdefined(USE_SYS_ENDIAN_H) #include<sys/endian.h> #elifdefined(USE_SYS_ISA_DEFS_H) #include<sys/isa_defs.h> #elifdefined(USE_SYS_PARAM_H) #include<sys/param.h> #endif #endif #if!defined(TARGET_LITTLE_ENDIAN)&&!defined(TARGET_BIG_ENDIAN) #if(defined(__BYTE_ORDER__)&&__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__)/*GCC*/||\ (defined(__BYTE_ORDER)&&__BYTE_ORDER==__LITTLE_ENDIAN)/*Linux*/||\ (defined(_BYTE_ORDER)&&_BYTE_ORDER==_LITTLE_ENDIAN)/*xBSD,Sun*/||\ (defined(BYTE_ORDER)&&BYTE_ORDER==LITTLE_ENDIAN)/*Apple,MingW*/||\ defined(__LITTLE_ENDIAN__)/*GCCMac*/||defined(__ARMEL__)/*GCC,Clang*/||\ defined(__THUMBEL__)/*GCC,Clang*/||defined(__AARCH64EL__)/*GCC,Clang*/||\ defined(_MIPSEL)/*GCC,Clang*/||defined(__MIPSEL)/*GCC,Clang*/||\ defined(__MIPSEL__)/*GCC,Clang*/||defined(_M_IX86)/*MSVC*/||\ defined(_M_X64)/*MSVC*/||defined(_M_IA64)/*MSVC*/||\ defined(_M_AMD64)/*MSVC*/||defined(_M_ARM)/*MSVC*/||\ defined(_M_ARM64)/*MSVC*/ #defineTARGET_LITTLE_ENDIAN #elif(defined(__BYTE_ORDER__)&&__BYTE_ORDER__==__ORDER_BIG_ENDIAN__)/*GCC*/||\ (defined(__BYTE_ORDER)&&__BYTE_ORDER==__BIG_ENDIAN)/*Linux*/||\ (defined(_BYTE_ORDER)&&_BYTE_ORDER==_BIG_ENDIAN)/*xBSD,Sun*/||\ (defined(BYTE_ORDER)&&BYTE_ORDER==BIG_ENDIAN)/*Apple,MingW*/||\ defined(_M_PPC)/*MSVCforXBox-360*/||defined(__BIG_ENDIAN__)/*GCCMac*/||\ defined(__ARMEB__)/*GCC,Clang*/||defined(__THUMBEB__)/*GCC,Clang*/||\ defined(__AARCH64EB__)/*GCC,Clang*/||defined(_MIPSEB)/*GCC,Clang*/||\ defined(__MIPSEB)/*GCC,Clang*/||defined(__MIPSEB__)/*GCC,Clang*/ #defineTARGET_BIG_ENDIAN #elifdefined(_WIN32) #defineTARGET_LITTLE_ENDIAN #endif//Endofbyteorderchecks #endif//Endofguardforexplicitlydefinedendianness /* *Swapintrinsics */ #ifdefined(__clang__)||(defined(__GNUC__)&&\ ((__GNUC__==4&&__GNUC_MINOR__>=8)||__GNUC__>=5)) #definebswap16(x)__builtin_bswap16((x)) #definebswap32(x)__builtin_bswap32((x)) #definebswap64(x)__builtin_bswap64((x)) #elifdefined(__linux__)||defined(__GLIBC__) #include<byteswap.h> #definebswap16(x)bswap_16((x)) #definebswap32(x)bswap_32((x)) #definebswap64(x)bswap_64((x)) #elifdefined(_MSC_VER) #include<stdlib.h> #definebswap16(x)_byteswap_ushort((x)) #definebswap32(x)_byteswap_ulong((x)) #definebswap64(x)_byteswap_uint64((x)) #elifdefined(__APPLE__) #include<libkern/OSByteOrder.h> #definebswap16(x)OSSwapInt16((x)) #definebswap32(x)OSSwapInt32((x)) #definebswap64(x)OSSwapInt64((x)) #elifdefined(__FreeBSD__)||defined(__NetBSD__) #include<sys/endian.h>//Thisdefinestheintrinsicsasperthechosennamingconvention #elifdefined(__OpenBSD__) #include<sys/endian.h> #definebswap16(x)swap16((x)) #definebswap32(x)swap32((x)) #definebswap64(x)swap64((x)) #elifdefined(__sun)||defined(sun) #include<sys/byteorder.h> #definebswap16(x)BSWAP_16((x)) #definebswap32(x)BSWAP_32((x)) #definebswap64(x)BSWAP_64((x)) #else staticinlinestd::uint16_tbswap16(std::uint16_tx){ return(((x&std::uint16_t{0x00FF})<<8)| ((x&std::uint16_t{0xFF00})>>8)); } staticinlinestd::uint32_tbswap32(std::uint32_tx){ return(((x&std::uint32_t{0x000000FF})<<24)| ((x&std::uint32_t{0x0000FF00})<<8)| ((x&std::uint32_t{0x00FF0000})>>8)| ((x&std::uint32_t{0xFF000000})>>24)); } staticinlinestd::uint64_tbswap64(std::uint64_tx){ return(((x&std::uint64_t{0x00000000000000FF})<<56)| ((x&std::uint64_t{0x000000000000FF00})<<40)| ((x&std::uint64_t{0x0000000000FF0000})<<24)| ((x&std::uint64_t{0x00000000FF000000})<<8)| ((x&std::uint64_t{0x000000FF00000000})>>8)| ((x&std::uint64_t{0x0000FF0000000000})>>24)| ((x&std::uint64_t{0x00FF000000000000})>>40)| ((x&std::uint64_t{0xFF00000000000000})>>56)); } #endif #ifdefined(ENABLE_SSE_BSWAP) staticinlinevoidbswap16x8(std::uint16_t*source){ const__m128iv=_mm_load_si128(reinterpret_cast<__m128i*>(source)); const__m128iswapped=_mm_or_si128(_mm_slli_epi16(v,8),_mm_srli_epi16(v,8)); _mm_store_si128(reinterpret_cast<__m128i*>(source),swapped); } staticinlinevoidbswap32x4(std::uint32_t*source){ const__m128iv=_mm_load_si128(reinterpret_cast<__m128i*>(source)); const__m128iswapped=_mm_shuffle_epi8(v, _mm_set_epi8( 12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3 ) ); _mm_store_si128(reinterpret_cast<__m128i*>(source),swapped); } staticinlinevoidbswap64x2(std::uint64_t*source){ const__m128iv=_mm_load_si128(reinterpret_cast<__m128i*>(source)); const__m128iswapped=_mm_shuffle_epi8(v, _mm_set_epi8( 8,9,10,11, 12,13,14,15, 0,1,2,3, 4,5,6,7 ) ); _mm_store_si128(reinterpret_cast<__m128i*>(source),swapped); } #else staticinlinevoidbswap16x8(std::uint16_t*source){ source[0]=bswap16(source[0]); source[1]=bswap16(source[1]); source[2]=bswap16(source[2]); source[3]=bswap16(source[3]); source[4]=bswap16(source[4]); source[5]=bswap16(source[5]); source[6]=bswap16(source[6]); source[7]=bswap16(source[7]); } staticinlinevoidbswap32x4(std::uint32_t*source){ source[0]=bswap32(source[0]); source[1]=bswap32(source[1]); source[2]=bswap32(source[2]); source[3]=bswap32(source[3]); } staticinlinevoidbswap64x2(std::uint64_t*source){ source[0]=bswap64(source[0]); source[1]=bswap64(source[1]); } #endif//ENABLE_SSE_BSWAP //Targetarchitecturespecificntohandhtonforallrelevantsizes //Incaseofbigendianarchitecturesthisisanoop #ifdefined(TARGET_LITTLE_ENDIAN) #definentoh8(x)(x) #definehton8(x)(x) #definentoh16(x)bswap16((x)) #definehton16(x)bswap16((x)) #definentoh32(x)bswap32((x)) #definehton32(x)bswap32((x)) #definentoh64(x)bswap64((x)) #definehton64(x)bswap64((x)) //Vectorizedswap #definentoh8x16(x)(x) #definehton8x16(x)(x) #definentoh16x8(x)bswap16x8((x)) #definehton16x8(x)bswap16x8((x)) #definentoh32x4(x)bswap32x4((x)) #definehton32x4(x)bswap32x4((x)) #definentoh64x2(x)bswap64x2((x)) #definehton64x2(x)bswap64x2((x)) #elifdefined(TARGET_BIG_ENDIAN) #definentoh8(x)(x) #definehton8(x)(x) #definentoh16(x)(x) #definehton16(x)(x) #definentoh32(x)(x) #definehton32(x)(x) #definentoh64(x)(x) #definehton64(x)(x) //Vectorizedswap #definentoh8x16(x)(x) #definehton8x16(x)(x) #definentoh16x8(x)(x) #definehton16x8(x)(x) #definentoh32x4(x)(x) #definehton32x4(x)(x) #definentoh64x2(x)(x) #definehton64x2(x)(x) #else #error"Platformnotsupported,nobyteswapfunctionsdefined." #endif #ifdefined(__clang__)||defined(__GNUC__) #pragmaGCCdiagnosticpush #pragmaGCCdiagnosticignored"-Wunused-value" #endif //Processsinglevalues inlinestd::uint8_tntoh(std::uint8_tx){ returnntoh8(x); } inlinestd::uint16_tntoh(std::uint16_tx){ returnntoh16(x); } inlinestd::uint32_tntoh(std::uint32_tx){ returnntoh32(x); } inlinestd::uint64_tntoh(std::uint64_tx){ returnntoh64(x); } inlinestd::uint8_thton(std::uint8_tx){ returnhton8(x); } inlinestd::uint16_thton(std::uint16_tx){ returnhton16(x); } inlinestd::uint32_thton(std::uint32_tx){ returnhton32(x); } inlinestd::uint64_thton(std::uint64_tx){ returnhton64(x); } //Processmultipleblockssimultaneously inlinevoidntoh(std::uint8_t*x){ ntoh8x16(x); } inlinevoidntoh(std::uint16_t*x){ ntoh16x8(x); } inlinevoidntoh(std::uint32_t*x){ ntoh32x4(x); } inlinevoidntoh(std::uint64_t*x){ ntoh64x2(x); } inlinevoidhton(std::uint8_t*x){ hton8x16(x); } inlinevoidhton(std::uint16_t*x){ hton16x8(x); } inlinevoidhton(std::uint32_t*x){ hton32x4(x); } inlinevoidhton(std::uint64_t*x){ hton64x2(x); } //Byteswapoverloads inlinestd::uint8_tbswap(std::uint8_tx){ //Nooperation returnx; } inlinestd::uint16_tbswap(std::uint16_tx){ returnbswap16(x); } inlinestd::uint32_tbswap(std::uint32_tx){ returnbswap32(x); } inlinestd::uint64_tbswap(std::uint64_tx){ returnbswap64(x); } inlinevoidbswap(std::uint8_t*x){ //Nooperation static_cast<void>(x); } inlinevoidbswap(std::uint16_t*x){ bswap16x8(x); } inlinevoidbswap(std::uint32_t*x){ bswap32x4(x); } inlinevoidbswap(std::uint64_t*x){ bswap64x2(x); } #ifdefined(__clang__)||defined(__GNUC__) #pragmaGCCdiagnosticpop #endif