@@ -28,7 +28,30 @@ Params:
28
28
Returns:
29
29
The unsigned integer value as a string of characters
30
30
*/
31
- char [] unsignedToTempString ()(ulong value, return scope char [] buf, uint radix = 10 ) @safe
31
+ char [] unsignedToTempString (uint radix = 10 )(ulong value, return scope char [] buf) @safe
32
+ if (radix >= 2 && radix <= 16 )
33
+ {
34
+ size_t i = buf.length;
35
+ do
36
+ {
37
+ uint x = void ;
38
+ if (value < radix)
39
+ {
40
+ x = cast (uint )value;
41
+ value = 0 ;
42
+ }
43
+ else
44
+ {
45
+ x = cast (uint )(value % radix);
46
+ value /= radix;
47
+ }
48
+ buf[-- i] = cast (char )((radix <= 10 || x < 10 ) ? x + ' 0' : x - 10 + ' a' );
49
+ } while (value);
50
+ return buf[i .. $];
51
+ }
52
+
53
+ // TEMPORARY. Delete after the related Phobos PR is merged.
54
+ char [] unsignedToTempString ()(ulong value, return scope char [] buf, uint radix) @safe
32
55
{
33
56
if (radix < 2 )
34
57
// not a valid radix, just return an empty string
@@ -77,46 +100,46 @@ Params:
77
100
Returns:
78
101
The unsigned integer value as a string of characters
79
102
*/
80
- auto unsignedToTempString ()( ulong value, uint radix = 10 ) @safe
103
+ auto unsignedToTempString (uint radix = 10 )( ulong value ) @safe
81
104
{
82
105
TempStringNoAlloc! () result = void ;
83
- result._len = unsignedToTempString(value, result._buf, radix ).length & 0xff ;
106
+ result._len = unsignedToTempString! radix (value, result._buf).length & 0xff ;
84
107
return result;
85
108
}
86
109
87
110
unittest
88
111
{
89
112
UnsignedStringBuf buf;
90
- assert (0. unsignedToTempString(buf, 10 ) == " 0" );
91
- assert (1. unsignedToTempString(buf, 10 ) == " 1" );
92
- assert (12. unsignedToTempString(buf, 10 ) == " 12" );
93
- assert (0x12ABCF .unsignedToTempString(buf, 16 ) == " 12abcf" );
94
- assert (long .sizeof.unsignedToTempString(buf, 10 ) == " 8" );
95
- assert (uint .max.unsignedToTempString(buf, 10 ) == " 4294967295" );
96
- assert (ulong .max.unsignedToTempString(buf, 10 ) == " 18446744073709551615" );
113
+ assert (0. unsignedToTempString(buf) == " 0" );
114
+ assert (1. unsignedToTempString(buf) == " 1" );
115
+ assert (12. unsignedToTempString(buf) == " 12" );
116
+ assert (0x12ABCF .unsignedToTempString! 16 (buf) == " 12abcf" );
117
+ assert (long .sizeof.unsignedToTempString(buf) == " 8" );
118
+ assert (uint .max.unsignedToTempString(buf) == " 4294967295" );
119
+ assert (ulong .max.unsignedToTempString(buf) == " 18446744073709551615" );
97
120
98
121
// use stack allocated struct version
99
- assert (0. unsignedToTempString( 10 ) == " 0" );
122
+ assert (0. unsignedToTempString == " 0" );
100
123
assert (1. unsignedToTempString == " 1" );
101
124
assert (12. unsignedToTempString == " 12" );
102
- assert (0x12ABCF .unsignedToTempString( 16 ) == " 12abcf" );
125
+ assert (0x12ABCF .unsignedToTempString! 16 == " 12abcf" );
103
126
assert (long .sizeof.unsignedToTempString == " 8" );
104
127
assert (uint .max.unsignedToTempString == " 4294967295" );
105
128
assert (ulong .max.unsignedToTempString == " 18446744073709551615" );
106
129
107
130
// test bad radices
108
- assert (100. unsignedToTempString(buf, 1 ) == " " );
109
- assert (100. unsignedToTempString(buf, 0 ) == " " );
131
+ assert (! is ( typeof ( 100. unsignedToTempString! 1 (buf))) );
132
+ assert (! is ( typeof ( 100. unsignedToTempString! 0 (buf) == " " )) );
110
133
}
111
134
112
135
alias SignedStringBuf = char [20 ];
113
136
114
- char [] signedToTempString (long value, return scope char [] buf, uint radix = 10 ) @safe
137
+ char [] signedToTempString (uint radix = 10 )( long value, return scope char [] buf) @safe
115
138
{
116
139
bool neg = value < 0 ;
117
140
if (neg)
118
141
value = cast (ulong )- value;
119
- auto r = unsignedToTempString(value, buf, radix );
142
+ auto r = unsignedToTempString! radix (value, buf);
120
143
if (neg)
121
144
{
122
145
// about to do a slice without a bounds check
@@ -127,12 +150,12 @@ char[] signedToTempString(long value, return scope char[] buf, uint radix = 10)
127
150
return r;
128
151
}
129
152
130
- auto signedToTempString (long value, uint radix = 10 ) @safe
153
+ auto signedToTempString (uint radix = 10 )( long value ) @safe
131
154
{
132
155
bool neg = value < 0 ;
133
156
if (neg)
134
157
value = cast (ulong )- value;
135
- auto r = unsignedToTempString(value, radix );
158
+ auto r = unsignedToTempString! radix (value);
136
159
if (neg)
137
160
{
138
161
r._len++ ;
@@ -141,37 +164,54 @@ auto signedToTempString(long value, uint radix = 10) @safe
141
164
return r;
142
165
}
143
166
167
+ // TEMPORARY. Delete after the related Phobos PR is merged.
168
+ char [] signedToTempString ()(long value, return scope char [] buf, uint radix) @safe
169
+ {
170
+ bool neg = value < 0 ;
171
+ if (neg)
172
+ value = cast (ulong )- value;
173
+ auto r = unsignedToTempString(value, buf, radix);
174
+ if (neg)
175
+ {
176
+ // about to do a slice without a bounds check
177
+ auto trustedSlice (return char [] r) @trusted { assert (r.ptr > buf.ptr); return (r.ptr- 1 )[0 .. r.length+ 1 ]; }
178
+ r = trustedSlice(r);
179
+ r[0 ] = ' -' ;
180
+ }
181
+ return r;
182
+ }
183
+
144
184
unittest
145
185
{
146
186
SignedStringBuf buf;
147
- assert (0. signedToTempString(buf, 10 ) == " 0" );
187
+ assert (0. signedToTempString(buf) == " 0" );
148
188
assert (1. signedToTempString(buf) == " 1" );
149
189
assert ((- 1 ).signedToTempString(buf) == " -1" );
150
190
assert (12. signedToTempString(buf) == " 12" );
151
191
assert ((- 12 ).signedToTempString(buf) == " -12" );
152
- assert (0x12ABCF .signedToTempString(buf, 16 ) == " 12abcf" );
153
- assert ((- 0x12ABCF ) .signedToTempString(buf, 16 ) == " -12abcf" );
192
+ assert (0x12ABCF .signedToTempString! 16 (buf) == " 12abcf" );
193
+ assert ((- 0x12ABCF ) .signedToTempString! 16 (buf) == " -12abcf" );
154
194
assert (long .sizeof.signedToTempString(buf) == " 8" );
155
195
assert (int .max.signedToTempString(buf) == " 2147483647" );
156
196
assert (int .min.signedToTempString(buf) == " -2147483648" );
157
197
assert (long .max.signedToTempString(buf) == " 9223372036854775807" );
158
198
assert (long .min.signedToTempString(buf) == " -9223372036854775808" );
159
199
160
200
// use stack allocated struct version
161
- assert (0. signedToTempString(10 ) == " 0" );
201
+ assert (0. signedToTempString() == " 0" );
162
202
assert (1. signedToTempString == " 1" );
163
203
assert ((- 1 ).signedToTempString == " -1" );
164
204
assert (12. signedToTempString == " 12" );
165
205
assert ((- 12 ).signedToTempString == " -12" );
166
- assert (0x12ABCF .signedToTempString( 16 ) == " 12abcf" );
167
- assert ((- 0x12ABCF ) .signedToTempString( 16 ) == " -12abcf" );
206
+ assert (0x12ABCF .signedToTempString! 16 == " 12abcf" );
207
+ assert ((- 0x12ABCF ) .signedToTempString! 16 == " -12abcf" );
168
208
assert (long .sizeof.signedToTempString == " 8" );
169
209
assert (int .max.signedToTempString == " 2147483647" );
170
210
assert (int .min.signedToTempString == " -2147483648" );
171
211
assert (long .max.signedToTempString == " 9223372036854775807" );
172
212
assert (long .min.signedToTempString == " -9223372036854775808" );
173
- assert (long .max.signedToTempString( 2 ) == " 111111111111111111111111111111111111111111111111111111111111111" );
174
- assert (long .min.signedToTempString( 2 ) == " -1000000000000000000000000000000000000000000000000000000000000000" );
213
+ assert (long .max.signedToTempString! 2 == " 111111111111111111111111111111111111111111111111111111111111111" );
214
+ assert (long .min.signedToTempString! 2 == " -1000000000000000000000000000000000000000000000000000000000000000" );
175
215
}
176
216
177
217
0 commit comments