acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
natural.h
1#pragma once
2
3
4
5
6
7CLASS_DECL_ACME void throw_cast_overflow();
8
9
10
11
12
13#define INT_TO_NATURAL(i) (i >= 0 ? (::u32) i : 0)
14
15
16
17
18inline ::u32 natural(::i32 i)
19{
20 return i >= 0 ? (::u32) i : 0;
21}
22
23inline ::u32 natural(::u32 u)
24{
25 return u;
26}
27
28inline ::u64 natural(::i64 hi)
29{
30 return hi >= 0 ? (::u64) hi: 0;
31}
32
33inline ::u64 natural(::u64 hn)
34{
35 return hn;
36}
37
38#ifdef __ANDROID__
39
40inline ulong natural(long l)
41{
42 return l >= 0 ? (ulong) l : 0;
43}
44
45#endif
46
47// return minimum zero or positive integer
48// otherwise, return third optional default -1 argument
49inline ::i32 natural_min(::i32 i1, ::i32 i2, ::i32 iEscape = -1)
50{
51 if(i1 >= 0)
52 {
53 if(i2 >= 0)
54 {
55 if(i2 < i1)
56 return i2;
57 else
58 return i1;
59 }
60 else
61 {
62 return i1;
63 }
64 }
65 else
66 {
67 if(i2 >= 0)
68 {
69 return i2;
70 }
71 else
72 {
73 return iEscape;
74 }
75 }
76}
77
78
79inline bool less_than(::u64 u, ::i32 i)
80{
81 return i < 0 ? false : u < (::u64) i;
82}
83
84
85inline ::i32 mkint(::u32 u)
86{
87 if (u >= I32_MAXIMUM)
88 throw_cast_overflow();
89 return (::i32) u;
90}
91
92inline ::i32 mkint(::i32 i)
93{
94 return i;
95}
96
97inline ::i64 mkint(::u64 hn)
98{
99 if (hn >= 0x7fffffffffffffffull)
100 throw_cast_overflow();
101 return (::i64)hn;
102}
103
104inline ::i64 mkint(::i64 hi)
105{
106 return hi;
107}
108
109//
111//template < typename A, typename B >
112//constexpr const auto minimum(const A & a, const B & b)
113//{
114//
115// return a < b ? a : (A) b;
116//
117//}
118
119//
120//template < prototype_integral) A, __typename(prototype_integral B >
121//constexpr const auto maximum(const A & a, const B & b)
122//{
123//
124// return b < a ? a : (A)b;
125//
126//}
127//
128
130//template < typename A, typename B >
131//constexpr const auto maximum(const A & a, const B & b)
132//{
133//
134// return b < a ? a : (A) b;
135//
136//}
137
138//#define maximum(a, b) ((a) < (b) ? (b) : (a))
139//#define minimum(a, b) ((a) < (b) ? (a) : (b))
140
141template < typename A, typename B >
142constexpr largest_type < A, B > minimum_non_negative(A a, B b)
143{
144
145 if(a < (A) 0)
146 {
147
148 if (b < (B) 0)
149 {
150
151 return (largest_type < A, B >) minimum(a, b);
152
153 }
154 else
155 {
156
157 return (largest_type < A, B >) b;
158
159 }
160
161 }
162 else if(b < (B) 0)
163 {
164
165 return (largest_type < A, B >) a;
166
167 }
168 else
169 {
170
171 return (largest_type < A, B >) minimum(a, b);
172
173 }
174
175}
176
177
178template < typename t >
179t minimum_non_null(const t & t1, const t & t2)
180{
181 if (t1 == (t) 0)
182 {
183 return t2;
184 }
185 else if (t2 == (t) 0)
186 {
187 return t1;
188 }
189 else if (t1 < t2)
190 {
191 return t1;
192 }
193 else
194 {
195 return t2;
196 }
197}
198
199
200
201template < typename T, typename L, typename H >
202constexpr auto minimum_maximum(T t, L l, H h)
203{
204
205 if (t < (T)l)
206 {
207
208 return (T) l;
209
210 }
211 else if ((T)h < t)
212 {
213
214 return (T) h;
215
216 }
217 else
218 {
219
220 return t;
221
222 }
223
224}
225
226
227
228//template < >
229//constexpr const auto minimum(const U & u, const I & i)
230//{
231//
232// return i < 0 ? 0 : (u < (::u32) i ? u : (::u32)i);
233//
234//}
235//template < > constexpr const auto minimum(const ::u64 & u, const ::i64 & i){ return i < 0 ? 0 : (u < (::u64)i ? u : (::u64)i); }
236//template < > constexpr const auto minimum(const ::u64 & u, const ::i32 & i) { return i < 0 ? 0 : (u < (::u64)i ? u : (::u64)i); }
237//template < > constexpr const auto minimum(const ::u64 & u, const ::i16 & i) { return i < 0 ? 0 : (u < (::u64)i ? u : (::u64)i); }
238//template < > constexpr const auto minimum(const ::u64 & u, const ::i8 & i) { return i < 0 ? 0 : (u < (::u64)i ? u : (::u64)i); }
239//template < > constexpr const auto minimum(const ::u32 & u, const ::i64 & i) { return i < 0 ? 0 : (u < (::u32)i ? u : (::u32)i); }
240//template < > constexpr const auto minimum(const ::u32 & u, const ::i32 & i) { return i < 0 ? 0 : (u < (::u32)i ? u : (::u32)i); }
241//template < > constexpr const auto minimum(const ::u32 & u, const ::i16 & i) { return i < 0 ? 0 : (u < (::u32)i ? u : (::u32)i); }
242//template < > constexpr const auto minimum(const ::u32 & u, const ::i8 & i) { return i < 0 ? 0 : (u < (::u32)i ? u : (::u32)i); }
243//template < > constexpr const auto minimum(const ::u16 & u, const ::i64 & i) { return i < 0 ? 0 : (u < (::u16)i ? u : (::u16)i); }
244//template < > constexpr const auto minimum(const ::u16 & u, const ::i32 & i) { return i < 0 ? 0 : (u < (::u16)i ? u : (::u16)i); }
245//template < > constexpr const auto minimum(const ::u16 & u, const ::i16 & i) { return i < 0 ? 0 : (u < (::u16)i ? u : (::u16)i); }
246//template < > constexpr const auto minimum(const ::u16 & u, const ::i8 & i) { return i < 0 ? 0 : (u < (::u16)i ? u : (::u16)i); }
247//template < > constexpr const auto minimum(const ::u8 & u, const ::i64 & i) { return i < 0 ? 0 : (u < (::u8)i ? u : (::u8)i); }
248//template < > constexpr const auto minimum(const ::u8 & u, const ::i32 & i) { return i < 0 ? 0 : (u < (::u8)i ? u : (::u8)i); }
249//template < > constexpr const auto minimum(const ::u8 & u, const ::i16 & i) { return i < 0 ? 0 : (u < (::u8)i ? u : (::u8)i); }
250//template < > constexpr const auto minimum(const ::u8 & u, const ::i8 & i) { return i < 0 ? 0 : (u < (::u8)i ? u : (::u8)i); }