1 /+
2 +            Copyright 2022 – 2023 Aya Partridge
3 + Distributed under the Boost Software License, Version 1.0.
4 +     (See accompanying file LICENSE_1_0.txt or copy at
5 +           http://www.boost.org/LICENSE_1_0.txt)
6 +/
7 module sdl.endian;
8 
9 import bindbc.sdl.config;
10 import bindbc.sdl.codegen;
11 
12 import sdl.stdinc;
13 
14 pragma(inline, true) nothrow @nogc pure @safe{
15 	ushort SDL_Swap16(ushort x){
16 		return cast(ushort)(
17 			(x << 8) |
18 			(x >> 8)
19 		);
20 	}
21 	uint SDL_Swap32(uint x){
22 		return cast(uint)(
23 			(x << 24) | ((x << 8) & 0x00FF0000) |
24 			((x >> 8) & 0x0000FF00) | (x >> 24)
25 		);
26 	}
27 	ulong SDL_Swap64(ulong x){
28 		uint lo = cast(uint)(x & 0xFFFFFFFF);
29 		x >>= 32;
30 		uint hi = cast(uint)(x & 0xFFFFFFFF);
31 		x = SDL_Swap32(lo);
32 		x <<= 32;
33 		x |= SDL_Swap32(hi);
34 		return x;
35 	}
36 	float SDL_SwapFloat(float x){
37 		union Swapper{
38 			float f;
39 			uint ui32;
40 		}
41 		Swapper swapper = {f: x};
42 		swapper.ui32 = SDL_Swap32(swapper.ui32);
43 		return swapper.f;
44 	}
45 	
46 	version(LittleEndian){
47 		ushort SDL_SwapLE16(ushort X){ return X; }
48 		uint SDL_SwapLE32(uint X){ return X; }
49 		ulong SDL_SwapLE64(ulong X){ return X; }
50 		float SDL_SwapFloatLE(float X){ return X; }
51 		
52 		ushort SDL_SwapBE16(ushort X){ return SDL_Swap16(X); }
53 		uint SDL_SwapBE32(uint X){ return SDL_Swap32(X); }
54 		ulong SDL_SwapBE64(ulong X){ return SDL_Swap64(X); }
55 		float SDL_SwapFloatBE(float X){ return SDL_SwapFloat(X); }
56 	}else{
57 		ushort SDL_SwapLE16(ushort X){ return SDL_Swap16(X); }
58 		uint SDL_SwapLE32(uint X){ return SDL_Swap32(X); }
59 		ulong SDL_SwapLE64(ulong X){ return SDL_Swap64(X); }
60 		float SDL_SwapFloatLE(float X){ return SDL_SwapFloat(X); }
61 		
62 		ushort SDL_SwapBE16(ushort X){ return X; }
63 		uint SDL_SwapBE32(uint X){ return X; }
64 		ulong SDL_SwapBE64(ulong X){ return X; }
65 		float SDL_SwapFloatBE(float X){ return X; }
66 	}
67 }
68 
69 mixin(joinFnBinds((){
70 	string[][] ret;
71 	return ret;
72 }()));