|
1 | 1 | export function bswap<T extends number>(value: T): T { |
2 | 2 | if (isInteger<T>()) { |
| 3 | + if (sizeof<T>() == 1) { |
| 4 | + return value; |
| 5 | + } |
3 | 6 | if (sizeof<T>() == 2) { |
4 | | - return <T>((value << 8) | ((value >>> 8) & <T>0x00FF)); |
| 7 | + return <T>(<u16>value << 8 | (<u16>value >> 8)); |
5 | 8 | } |
6 | 9 | if (sizeof<T>() == 4) { |
7 | 10 | return <T>( |
8 | | - rotl<u32>(value & 0xFF00FF00, 8) | |
9 | | - rotr<u32>(value & 0x00FF00FF, 8) |
| 11 | + rotl(<u32>value & 0xFF00FF00, 8) | |
| 12 | + rotr(<u32>value & 0x00FF00FF, 8) |
10 | 13 | ); |
11 | 14 | } |
12 | 15 | if (sizeof<T>() == 8) { |
13 | 16 | let a = (<u64>value >> 8) & 0x00FF00FF00FF00FF; |
14 | 17 | let b = (<u64>value & 0x00FF00FF00FF00FF) << 8; |
15 | 18 | let v = a | b; |
16 | 19 |
|
17 | | - a = (v >> 16) & 0x0000FFFF0000FFFF; |
| 20 | + a = (v >>> 16) & 0x0000FFFF0000FFFF; |
18 | 21 | b = (v & 0x0000FFFF0000FFFF) << 16; |
19 | 22 |
|
20 | | - return <T>rotr<u64>(a | b, 32); |
| 23 | + return <T>rotr(a | b, 32); |
21 | 24 | } |
22 | | - return value; |
23 | 25 | } |
24 | | - assert(false); |
25 | | - return value; |
| 26 | + ERROR("Unsupported generic type"); |
26 | 27 | } |
27 | 28 |
|
28 | 29 | export function bswap16<T extends number>(value: T): T { |
29 | | - if (isInteger<T>() && sizeof<T>() <= 4) { |
| 30 | + if (isInteger<T>()) { |
| 31 | + if (sizeof<T>() == 1) { |
| 32 | + return value; |
| 33 | + } |
30 | 34 | if (sizeof<T>() == 2) { |
31 | | - return <T>((value << 8) | ((value >>> 8) & <T>0x00FF)); |
32 | | - } else if (sizeof<T>() == 4) { |
33 | | - return <T>(((value << 8) & <T>0xFF00) | ((value >>> 8) & <T>0x00FF) | (value & <T>0xFFFF0000)); |
| 35 | + return <T>(<u16>value << 8 | (<u16>value >> 8)); |
| 36 | + } |
| 37 | + if (sizeof<T>() == 4) { |
| 38 | + return <T>( |
| 39 | + (((<u32>value & 0xFF) << 8)) | |
| 40 | + ((<u32>value >> 8) & 0xFF) | |
| 41 | + (<u32>value & 0xFFFF0000) |
| 42 | + ); |
34 | 43 | } |
35 | | - return value; |
36 | 44 | } |
37 | | - assert(false); |
38 | | - return value; |
| 45 | + ERROR("Unsupported generic type"); |
39 | 46 | } |
0 commit comments