1 /**
2  * Bit manipulation.
3  *
4  * License:
5  *   This Source Code Form is subject to the terms of
6  *   the Mozilla Public License, v. 2.0. If a copy of
7  *   the MPL was not distributed with this file, You
8  *   can obtain one at http://mozilla.org/MPL/2.0/.
9  *
10  * Authors:
11  *   Vladimir Panteleev <vladimir@thecybershadow.net>
12  *   Simon Arlott
13  */
14 
15 module ae.utils.bitmanip;
16 
17 import std.bitmanip;
18 import std.traits;
19 
20 struct BigEndian(T)
21 {
22 	private ubyte[T.sizeof] _endian_bytes;
23 	@property T _endian_value() { return cast(T)bigEndianToNative!(OriginalType!T)(_endian_bytes); }
24 	@property void _endian_value(T value) { _endian_bytes = nativeToBigEndian(OriginalType!T(value)); }
25 	alias _endian_value this;
26 	alias opAssign = _endian_value;
27 	this(T value) { _endian_value(value); }
28 }
29 
30 struct LittleEndian(T)
31 {
32 	private ubyte[T.sizeof] _endian_bytes;
33 	@property T _endian_value() { return cast(T)littleEndianToNative!(OriginalType!T)(_endian_bytes); }
34 	@property void _endian_value(T value) { _endian_bytes = nativeToLittleEndian(OriginalType!T(value)); }
35 	alias _endian_value this;
36 	alias opAssign = _endian_value;
37 	this(T value) { _endian_value(value); }
38 }
39 
40 unittest
41 {
42 	union U
43 	{
44 		BigEndian!ushort be;
45 		LittleEndian!ushort le;
46 		ubyte[2] bytes;
47 	}
48 	U u;
49 
50 	u.be = 0x1234;
51 	assert(u.bytes == [0x12, 0x34]);
52 
53 	u.le = 0x1234;
54 	assert(u.bytes == [0x34, 0x12]);
55 
56 	u.bytes = [0x56, 0x78];
57 	assert(u.be == 0x5678);
58 	assert(u.le == 0x7856);
59 }
60 
61 unittest
62 {
63 	enum E : uint { e }
64 	BigEndian!E be;
65 }