summaryrefslogtreecommitdiff
path: root/asl/base/integers.hpp
blob: 6bc4c34a3f7825ef9fd5376db8271a749a37784f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Copyright 2025 Steven Le Rouzic
//
// SPDX-License-Identifier: BSD-3-Clause

#pragma once

#include "asl/base/config.hpp"

using int8_t  = signed char;
using int16_t = signed short;
using int32_t = signed int;
#if ASL_OS_WINDOWS
    using int64_t = signed long long;
#elif ASL_OS_LINUX
    using int64_t = signed long;
#endif

using uint8_t  = unsigned char;
using uint16_t = unsigned short;
using uint32_t = unsigned int;
#if ASL_OS_WINDOWS
    using uint64_t = unsigned long long;
#elif ASL_OS_LINUX
    using uint64_t = unsigned long;
#endif

struct uint128_t
{
    uint64_t high;
    uint64_t low;
};

using size_t  = uint64_t;
using isize_t = int64_t;

using uintptr_t = size_t;

namespace asl
{

enum class byte : uint8_t {};

template<typename T> struct integer_traits {};

#define ASL_INTEGER_TRAITS(T, MIN, MAX) \
    template<> struct integer_traits<T> \
    {                                   \
        static constexpr T kMin = MIN;  \
        static constexpr T kMax = MAX;  \
    }

ASL_INTEGER_TRAITS(uint8_t,   0,                     0xff);
ASL_INTEGER_TRAITS(uint16_t,  0,                     0xffff);
ASL_INTEGER_TRAITS(uint32_t,  0,                     0xffff'ffff);
ASL_INTEGER_TRAITS(uint64_t,  0,                     0xffff'ffff'ffff'ffff);
ASL_INTEGER_TRAITS(int8_t,   -0x80,                  0x7f);
ASL_INTEGER_TRAITS(int16_t,  -0x8000,                0x7fff);
ASL_INTEGER_TRAITS(int32_t,  -0x8000'0000,           0x7fff'ffff);
ASL_INTEGER_TRAITS(int64_t,  -0x8000'0000'0000'0000, 0x7fff'ffff'ffff'ffff);

#undef ASL_INTEGER_TRAITS

} // namespace asl