Deluge Firmware 1.3.0
Build date: 2025.04.16
Loading...
Searching...
No Matches
misc.h
1#pragma once
2#include <concepts> // IWYU pragma: keep this is actually needed for std::integral, clangd is messing it up
3#include <cstddef>
4#include <cstdint>
5#include <limits>
6#include <type_traits>
7
8namespace util {
9template <auto Start, auto End, auto Inc, class F>
10constexpr void constexpr_for(F&& f) {
11 if constexpr (Start < End) {
12 f.template operator()<Start>();
13 constexpr_for<Start + Inc, End, Inc>(f);
14 }
15}
16
17template <class Enum>
18concept enumeration = std::is_enum_v<Enum>;
19
20template <enumeration Enum>
21constexpr std::underlying_type_t<Enum> to_underlying(Enum e) noexcept {
22 return static_cast<std::underlying_type_t<Enum>>(e);
23}
24
28template <std::size_t n, typename T = int32_t>
29constexpr T bit = T{1} << n;
30
37template <std::size_t width, typename T = int32_t>
38constexpr T bit_value = bit<width - 1, T>;
39
46template <std::size_t width, typename T = int32_t>
47constexpr T bitmask = bit<width, T> - 1;
48
49template <typename T>
50constexpr T bit_from_top(const std::size_t n) {
51 return T{1} << (std::numeric_limits<T>::digits - (n + 1));
52}
53
54template <typename T>
55constexpr T top_n_bits(const std::size_t n) {
56 T output{0};
57 for (std::size_t i = 0; i < n; i++) {
58 output |= bit_from_top<T>(i);
59 }
60 return output;
61}
62
63template <typename T>
64constexpr T top_bit = T{1} << (std::numeric_limits<T>::digits - 1);
65
66template <std::integral T>
67constexpr T median_value = (std::numeric_limits<T>::max() / 2) + (std::numeric_limits<T>::min() / 2) + 1;
68
69template <typename T>
70constexpr T set_top_bit(const T v) {
71 return v | top_bit<T>;
72}
73
74template <typename T, std::size_t n>
75constexpr T set_top_n_bits(const T v) {
76 T output = v;
77 for (std::size_t i = 0; i < n; i++) {
78 output |= bit_from_top<T>(i);
79 }
80 return output;
81}
82
83template <typename T>
84[[nodiscard]] constexpr T map(T x, T in_min, T in_max, T out_min, T out_max) {
85 return out_min + ((x - in_min) * (out_max - out_min)) / (in_max - in_min);
86}
87
92template <std::integral T>
93[[nodiscard]] constexpr T div_ceil(T a, T b) {
94 return (a + (b - 1)) / b;
95}
96
100[[nodiscard]] constexpr bool infinite_a_lt_b(uint32_t a, uint32_t b) {
101 return ((int32_t)(a - b) < 0);
102}
103
104} // namespace util
105
106// unsigned literal operators
107consteval uint_least64_t operator"" _u64(unsigned long long arg) {
108 return arg;
109};
110consteval uint_least32_t operator"" _u32(unsigned long long arg) {
111 return arg;
112};
113consteval uint_least16_t operator"" _u16(unsigned long long arg) {
114 return arg;
115};
116consteval uint_least8_t operator"" _u8(unsigned long long arg) {
117 return arg;
118};
119
120// signed literal operators
121consteval int_least64_t operator"" _i64(unsigned long long arg) {
122 return arg;
123};
124consteval int_least32_t operator"" _i32(unsigned long long arg) {
125 return arg;
126};
127consteval int_least16_t operator"" _i16(unsigned long long arg) {
128 return arg;
129};
130consteval int_least8_t operator"" _i8(unsigned long long arg) {
131 return arg;
132};
133
134consteval std::byte operator"" _b(unsigned long long arg) {
135 return std::byte(arg);
136};
Definition misc.h:18