acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
_conv.h
1// Refactored by camilo on 2022-12-09 00:48 <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5template < prototype_character CHARACTER >
6constexpr CHARACTER * __zerotosz(CHARACTER * & p)
7{
8
9 *p++ = '0';
10
11 *p = 0;
12
13 return p;
14
15}
16
17
18template < prototype_unsigned UNSIGNED, prototype_character CHARACTER >
19constexpr void __utosz_internal(UNSIGNED u, CHARACTER * & pParam, ::i32 base, enum_digit_case edigitcase)
20{
21
22 auto & p = (::non_const < CHARACTER * > &) pParam;
23
24 while (u != 0)
25 {
26
27 auto digit = (u % base);
28
29 if (digit <= 9)
30 {
31
32 *p = (CHARACTER)(digit + '0');
33
34 }
35 else
36 {
37
38 *p = (CHARACTER)(digit - 10 + edigitcase);
39
40 }
41
42 u = (UNSIGNED) (u / base);
43
44 p++;
45
46 }
47
48}
49
50
58template < prototype_unsigned UNSIGNED, prototype_character CHARACTER >
59constexpr void __rear_tosz(UNSIGNED u, CHARACTER *& p, ::i32 base, enum_digit_case edigitcase)
60{
61
62 __utosz_internal(u, p, base, edigitcase);
63
64}
65
66
67template < prototype_signed SIGNED, prototype_character CHARACTER >
68constexpr void __rear_tosz(SIGNED i, CHARACTER *& p, ::i32 base, enum_digit_case edigitcase)
69{
70
71 auto [u, bNegative] = as_absolute_unsigned(i);
72
73 __utosz_internal(u, p, base, edigitcase);
74
75 if (bNegative) *p++ = '-';
76
77}
78
79
87template < prototype_integral INTEGRAL, prototype_character CHARACTER >
88constexpr void __tosz(INTEGRAL i, CHARACTER * & pcharacter, ::i32 base, enum_digit_case edigitcase)
89{
90
91 auto & p = (non_const <CHARACTER> * &) pcharacter;
92
93 if (i == 0)
94 {
95
96 __zerotosz(p);
97
98 return;
99
100 }
101
102 auto s = p;
103
104 __rear_tosz(i, p, base, edigitcase);
105
106 reverse(s, p);
107
108 *p = 0;
109
110}
111
112//::pair <::i32,::i32> ia;
113
114
115
116