code / tomo

Lines41.3K C23.7K Markdown9.7K YAML5.0K Tomo2.3K
7 others 763
Python231 Shell230 make212 INI47 Text21 SVG16 Lua6
(115 lines)
1 // Template header for 64 and 32 bit Nums
2 // This file expects `NUMX_H__BITS` to be defined before including:
3 //
4 // #define NUMX_H__BITS 64
5 // #include "numX.h"
6 //
8 #include <stdbool.h>
9 #include <stdint.h>
11 #include "datatypes.h"
12 #include "stdlib.h"
13 #include "types.h"
14 #include "util.h"
16 #ifndef NUMX_H__BITS
17 #define NUMX_H__BITS 64
18 #endif
20 #if NUMX_H__BITS == 64
21 #define NUM_T double
22 #define OPT_T double
23 #define NAMESPACED(x) Num$##x
24 #define TYPE_STR "Num"
25 #define SUFFIXED(x) x
26 #elif NUMX_H__BITS == 32
27 #define NUM_T float
28 #define OPT_T float
29 #define NAMESPACED(x) Num32$##x
30 #define TYPE_STR "Num32"
31 #define SUFFIXED(x) x##f
32 #else
33 #error "Unsupported bit width for Num"
34 #endif
36 Text_t NAMESPACED(as_text)(const void *x, bool colorize, const TypeInfo_t *type);
37 Text_t NAMESPACED(value_as_text)(NUM_T x);
38 PUREFUNC int32_t NAMESPACED(compare)(const void *x, const void *y, const TypeInfo_t *type);
39 PUREFUNC bool NAMESPACED(equal)(const void *x, const void *y, const TypeInfo_t *type);
40 CONSTFUNC bool NAMESPACED(near)(NUM_T a, NUM_T b, NUM_T ratio, NUM_T absolute);
41 Text_t NAMESPACED(percent)(NUM_T x, NUM_T precision);
42 NUM_T CONSTFUNC NAMESPACED(with_precision)(NUM_T num, NUM_T precision);
43 NUM_T NAMESPACED(mod)(NUM_T num, NUM_T modulus);
44 NUM_T NAMESPACED(mod1)(NUM_T num, NUM_T modulus);
45 CONSTFUNC bool NAMESPACED(isinf)(NUM_T n);
46 CONSTFUNC bool NAMESPACED(finite)(NUM_T n);
47 CONSTFUNC bool NAMESPACED(isnan)(NUM_T n);
48 bool NAMESPACED(is_none)(const void *n, const TypeInfo_t *info);
49 NUM_T NAMESPACED(nan)(Text_t tag);
50 CONSTFUNC NUM_T NAMESPACED(mix)(NUM_T amount, NUM_T x, NUM_T y);
51 OPT_T NAMESPACED(parse)(Text_t text, Text_t *remainder);
52 CONSTFUNC bool NAMESPACED(is_between)(const NUM_T x, const NUM_T low, const NUM_T high);
53 CONSTFUNC NUM_T NAMESPACED(clamped)(NUM_T x, NUM_T low, NUM_T high);
55 #if NUMX_H__BITS == 64
56 MACROLIKE CONSTFUNC NUM_T NAMESPACED(from_num32)(float n) {
57 return (NUM_T)n;
59 #elif NUMX_H__BITS == 32
60 MACROLIKE CONSTFUNC NUM_T NAMESPACED(from_num64)(double n) {
61 return (NUM_T)n;
63 #endif
65 #ifdef __GNUC__
66 #pragma GCC diagnostic push
67 #pragma GCC diagnostic ignored "-Wfloat-equal"
68 #endif
69 MACROLIKE CONSTFUNC NUM_T NAMESPACED(from_int)(Int_t i, bool truncate) {
70 if likely (i.small & 0x1) {
71 NUM_T ret = (NUM_T)(i.small >> 2);
72 if unlikely (!truncate && (int64_t)ret != (i.small >> 2))
73 fail("Could not convert integer to " TYPE_STR " without losing precision: ", i.small >> 2);
74 return ret;
75 } else {
76 NUM_T ret = mpz_get_d(i.big);
77 if (!truncate) {
78 mpz_t roundtrip;
79 mpz_init_set_d(roundtrip, (double)ret);
80 if unlikely (mpz_cmp(i.big, roundtrip) != 0)
81 fail("Could not convert integer to " TYPE_STR " without losing precision: ", i);
83 return ret;
86 #ifdef __GNUC__
87 #pragma GCC diagnostic pop
88 #endif
89 MACROLIKE CONSTFUNC NUM_T NAMESPACED(from_int64)(Int64_t i, bool truncate) {
90 NUM_T n = (NUM_T)i;
91 if unlikely (!truncate && (Int64_t)n != i)
92 fail("Could not convert integer to " TYPE_STR " without losing precision: ", i);
93 return n;
95 MACROLIKE CONSTFUNC NUM_T NAMESPACED(from_int32)(Int32_t i) {
96 return (NUM_T)i;
98 MACROLIKE CONSTFUNC NUM_T NAMESPACED(from_int16)(Int16_t i) {
99 return (NUM_T)i;
101 MACROLIKE CONSTFUNC NUM_T NAMESPACED(from_int8)(Int8_t i) {
102 return (NUM_T)i;
104 MACROLIKE CONSTFUNC NUM_T NAMESPACED(from_byte)(Byte_t i) {
105 return (NUM_T)i;
108 extern const TypeInfo_t NAMESPACED(info);
110 #undef NUM_T
111 #undef OPT_T
112 #undef NAMESPACED
113 #undef TYPE_STR
114 #undef SUFFIXED
115 #undef NUMX_H__BITS