acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
_integer.h
1// Created by camilo on 2023-06-09 21:38 <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5#define ENDIAN_SERIAL_ARRAY ((const_char_pointer )&((const ::i32)(0x00010203)))
6#define ENDIAN_CPU_ARRAY ((const_char_pointer )&((const ::i32)(0x03020100)))
7#define SERIAL_ENDIANESS (*ENDIAN_SERIAL_ARRAY)
8#define SERIAL_LITTLE_ENDIAN 0x03
9#define SERIAL_BIG_ENDIAN 0x00
10#define SERIAL_PDP_ENDIAN 0x02
11#define SERIAL_HONEYWELL_ENDIAN 0x01
12#define CPU_LITTLE_ENDIAN (3-SERIAL_LITTLE_ENDIAN)
13#define CPU_BIG_ENDIAN (3-SERIAL_BIG_ENDIAN)
14#define CPU_PDP_ENDIAN (3-SERIAL_PDP_ENDIAN)
15#define CPU_HONEYWELL_ENDIAN (3-SERIAL_HONEYWELL_ENDIAN)
16
17
18#define IS_LITTLE_ENDIAN (SERIAL_ENDIANESS == SERIAL_LITTLE_ENDIAN)
19#define IS_BIG_ENDIAN (SERIAL_ENDIANESS == SERIAL_BIG_ENDIAN)
20#define IS_PDP_ENDIAN (SERIAL_ENDIANESS == SERIAL_PDP_ENDIAN)
21#define IS_HONEYWELL_ENDIAN (SERIAL_ENDIANESS == SERIAL_HONEYWELL_ENDIAN)
22
23
24constexpr ::u8 lower_byte(::iptr i) { return (::u8)((::uptr)(i) & 0xff); }
25constexpr ::u8 upper_byte(::iptr i) { return (::u8)(((::uptr)(i) >> 8) & 0xff); }
26constexpr ::u16 lower_unsigned_short(::iptr i) { return (::u16)((::uptr)(i) & 0xffff); }
27constexpr ::u16 upper_unsigned_short(::iptr i) { return (::u16)(((::uptr)(i) >> 16) & 0xffff); }
28constexpr ::i16 upper_short(::iptr i) { return (::i16)(((::uptr)(i) >> 16) & 0xffff); }
29constexpr ::u32 lower_u32(::u64 u) { return (::u32)(u); }
30constexpr ::u32 upper_u32(::u64 u) { return (::u32)((u >> 32) & 0xffffffff); }
31
32constexpr ::i32 iptr_int_x(::iptr i) { return (::i32)(::i16)lower_unsigned_short(i); }
33constexpr ::i32 iptr_int_y(::iptr i) { return (::i32)(::i16)upper_unsigned_short(i); }
34constexpr ::i32 u32_x(::uptr u) { return (::i32)(::i16)lower_unsigned_short(u); }
35constexpr ::i32 u32_y(::uptr u) { return (::i32)(::i16)upper_unsigned_short(u); }
36constexpr ::i32 u64_x(::u64 u) { return (::i32)lower_u32(u); }
37constexpr ::i32 u64_y(::u64 u) { return (::i32)upper_u32(u); }
38
39
40constexpr ::u16 make_unsigned_short(::iptr a, ::iptr b) { return (::u16)((::u8)a) | ((::u16)((::u8)b) << 8); }
41constexpr ::i32 make_int(::iptr a, ::iptr b) { return (::i32)((::u16)a) | ((::u32)((::u16)b) << 16); }
42constexpr ::u32 make_u32(::iptr a, ::iptr b) { return (::u32) make_int(a, b); }
43constexpr ::u32 make_u32(::iptr a, ::iptr b, ::iptr c, ::iptr d) { return make_u32(make_unsigned_short(a, b), make_unsigned_short(c, d)); }
44constexpr ::u64 make_u64(::u32 a, ::u32 b) { return ((::u64)a) | (((::u64)b) << 32ull); }
45
46
47constexpr ::u16 swap_unsigned_short(::u16 u) { return make_unsigned_short(upper_byte(u), lower_byte(u)); }
48constexpr ::u32 swap_u32(::u32 u) { return make_u32(swap_unsigned_short(upper_unsigned_short(u)), swap_unsigned_short(lower_unsigned_short(u))); }
49
50
51