code / tomo

Lines41.3K C23.7K Markdown9.7K YAML5.0K Tomo2.3K
7 others 763
Python231 Shell230 make212 INI47 Text21 SVG16 Lua6
(184 lines)
1 // Integer type infos and methods
2 // This file expects `INTX_H__INT_BITS` to be defined before including:
3 //
4 // #define INTX_H__INT_BITS 64
5 // #include "intX.h"
6 //
7 #include <stdbool.h>
8 #include <stdint.h>
10 #include "datatypes.h"
11 #include "stdlib.h"
12 #include "types.h"
13 #include "util.h"
15 #ifndef INTX_H__INT_BITS
16 #define INTX_H__INT_BITS 32
17 #endif
19 #define PASTE3_(a, b, c) a##b##c
20 #define PASTE3(a, b, c) PASTE3_(a, b, c)
21 #define INTX_T PASTE3(int, INTX_H__INT_BITS, _t)
22 #define UINTX_T PASTE3(uint, INTX_H__INT_BITS, _t)
24 #define STRINGIFY_(s) #s
25 #define STRINGIFY(s) STRINGIFY_(s)
26 #define NAME_STR "Int" STRINGIFY(INTX_H__INT_BITS)
28 #define OPT_T PASTE3(OptionalInt, INTX_H__INT_BITS, _t)
30 #define PASTE4_(a, b, c, d) a##b##c##d
31 #define PASTE4(a, b, c, d) PASTE4_(a, b, c, d)
32 #define NAMESPACED(method_name) PASTE4(Int, INTX_H__INT_BITS, $, method_name)
34 typedef struct {
35 INTX_T value;
36 bool has_value : 1;
37 } OPT_T;
39 Text_t NAMESPACED(as_text)(const void *i, bool colorize, const TypeInfo_t *type);
40 Text_t NAMESPACED(value_as_text)(INTX_T i);
41 PUREFUNC int32_t NAMESPACED(compare)(const void *x, const void *y, const TypeInfo_t *type);
42 PUREFUNC bool NAMESPACED(equal)(const void *x, const void *y, const TypeInfo_t *type);
43 Text_t NAMESPACED(hex)(INTX_T i, Int_t digits, bool uppercase, bool prefix);
44 Text_t NAMESPACED(octal)(INTX_T i, Int_t digits, bool prefix);
45 List_t NAMESPACED(bits)(INTX_T x);
46 bool NAMESPACED(get_bit)(INTX_T x, Int_t bit_index);
47 Closure_t NAMESPACED(to)(INTX_T first, INTX_T last, OPT_T step);
48 Closure_t NAMESPACED(onward)(INTX_T first, INTX_T step);
49 PUREFUNC OPT_T NAMESPACED(parse)(Text_t text, OptionalInt_t base, Text_t *remainder);
50 CONSTFUNC bool NAMESPACED(is_between)(const INTX_T x, const INTX_T low, const INTX_T high);
51 CONSTFUNC INTX_T NAMESPACED(clamped)(INTX_T x, INTX_T min, INTX_T max);
52 MACROLIKE CONSTFUNC INTX_T NAMESPACED(from_byte)(Byte_t b) {
53 return (INTX_T)b;
55 MACROLIKE CONSTFUNC INTX_T NAMESPACED(from_bool)(Bool_t b) {
56 return (INTX_T)b;
58 CONSTFUNC INTX_T NAMESPACED(gcd)(INTX_T x, INTX_T y);
59 extern const INTX_T NAMESPACED(min), NAMESPACED(max);
60 extern const TypeInfo_t NAMESPACED(info);
62 MACROLIKE INTX_T NAMESPACED(abs)(INTX_T x) {
63 #if INTX_H__INT_BITS >= 64
64 return (INTX_T)labs(x);
65 #else
66 return (INTX_T)abs(x);
67 #endif
70 MACROLIKE INTX_T NAMESPACED(divided_by)(INTX_T D, INTX_T d) {
71 INTX_T q = D / d, r = D % d;
72 q -= (r < 0) * (2 * (d > 0) - 1);
73 return q;
76 MACROLIKE INTX_T NAMESPACED(modulo)(INTX_T D, INTX_T d) {
77 INTX_T r = D % d;
78 r -= (r < 0) * (2 * (d < 0) - 1) * d;
79 return r;
82 MACROLIKE INTX_T NAMESPACED(modulo1)(INTX_T D, INTX_T d) {
83 return NAMESPACED(modulo)(D - 1, d) + 1;
86 MACROLIKE PUREFUNC INTX_T NAMESPACED(wrapping_plus)(INTX_T x, INTX_T y) {
87 return (INTX_T)((UINTX_T)x + (UINTX_T)y);
90 MACROLIKE PUREFUNC INTX_T NAMESPACED(wrapping_minus)(INTX_T x, INTX_T y) {
91 return (INTX_T)((UINTX_T)x + (UINTX_T)y);
94 MACROLIKE PUREFUNC INTX_T NAMESPACED(unsigned_left_shifted)(INTX_T x, INTX_T y) {
95 return (INTX_T)((UINTX_T)x << y);
98 MACROLIKE PUREFUNC INTX_T NAMESPACED(unsigned_right_shifted)(INTX_T x, INTX_T y) {
99 return (INTX_T)((UINTX_T)x >> y);
102 void NAMESPACED(serialize)(const void *obj, FILE *out, Table_t *, const TypeInfo_t *);
103 void NAMESPACED(deserialize)(FILE *in, void *outval, List_t *, const TypeInfo_t *);
105 MACROLIKE PUREFUNC INTX_T NAMESPACED(from_num64)(Num_t n, bool truncate) {
106 INTX_T i = (INTX_T)n;
107 if (!truncate && unlikely((Num_t)i != n)) fail("Could not convert Num to an " NAME_STR " without truncation: ", n);
108 return i;
111 MACROLIKE PUREFUNC INTX_T NAMESPACED(from_num32)(Num32_t n, bool truncate) {
112 INTX_T i = (INTX_T)n;
113 if (!truncate && unlikely((Num32_t)i != n))
114 fail("Could not convert Num32 to an " NAME_STR " without truncation: ", n);
115 return i;
118 MACROLIKE PUREFUNC INTX_T NAMESPACED(from_int)(Int_t i, bool truncate) {
119 if likely (i.small & 1L) {
120 INTX_T ret = i.small >> 2L;
121 #if INTX_H__INT_BITS < 32
122 if (!truncate && unlikely((int64_t)ret != (i.small >> 2L)))
123 fail("Integer is too big to fit in an " NAME_STR ": ", i);
124 #endif
125 return ret;
127 if (!truncate && unlikely(!mpz_fits_slong_p(i.big))) fail("Integer is too big to fit in an " NAME_STR ": ", i);
128 return mpz_get_si(i.big);
131 #if INTX_H__INT_BITS < 64
132 MACROLIKE PUREFUNC INTX_T NAMESPACED(from_int64)(Int64_t i64, bool truncate) {
133 INTX_T i = (INTX_T)i64;
134 if (!truncate && unlikely((int64_t)i != i64)) fail("Integer is too big to fit in an " NAME_STR ": ", i64);
135 return i;
137 #elif INTX_H__INT_BITS > 64
138 MACROLIKE CONSTFUNC INTX_T NAMESPACED(from_int64)(Int64_t i) {
139 return (INTX_T)i;
141 #endif
143 #if INTX_H__INT_BITS < 32
144 MACROLIKE PUREFUNC INTX_T NAMESPACED(from_int32)(Int32_t i32, bool truncate) {
145 INTX_T i = (INTX_T)i32;
146 if (!truncate && unlikely((int32_t)i != i32)) fail("Integer is too big to fit in an " NAME_STR ": ", i32);
147 return i;
149 #elif INTX_H__INT_BITS > 32
150 MACROLIKE CONSTFUNC INTX_T NAMESPACED(from_int32)(Int32_t i) {
151 return (INTX_T)i;
153 #endif
155 #if INTX_H__INT_BITS < 16
156 MACROLIKE PUREFUNC INTX_T NAMESPACED(from_int16)(Int16_t i16, bool truncate) {
157 INTX_T i = (INTX_T)i16;
158 if (!truncate && unlikely((int16_t)i != i16)) fail("Integer is too big to fit in an " NAME_STR ": ", i16);
159 return i;
161 #elif INTX_H__INT_BITS > 16
162 MACROLIKE CONSTFUNC INTX_T NAMESPACED(from_int16)(Int16_t i) {
163 return (INTX_T)i;
165 #endif
167 #if INTX_H__INT_BITS > 8
168 MACROLIKE CONSTFUNC INTX_T NAMESPACED(from_int8)(Int8_t i) {
169 return (INTX_T)i;
171 #endif
173 #undef PASTE3_
174 #undef PASTE3
175 #undef INTX_T
176 #undef STRINGIFY_
177 #undef STRINGIFY
178 #undef NAME_STR
179 #undef UINTX_T
180 #undef OPT_T
181 #undef PASTE4_
182 #undef PASTE4
183 #undef NAMESPACED
184 #undef INTX_H__INT_BITS