@@ -28,7 +28,30 @@ Params:
2828Returns:
2929 The unsigned integer value as a string of characters
3030*/
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
3255{
3356 if (radix < 2 )
3457 // not a valid radix, just return an empty string
@@ -77,46 +100,46 @@ Params:
77100Returns:
78101 The unsigned integer value as a string of characters
79102*/
80- auto unsignedToTempString ()( ulong value, uint radix = 10 ) @safe
103+ auto unsignedToTempString (uint radix = 10 )( ulong value ) @safe
81104{
82105 TempStringNoAlloc! () result = void ;
83- result._len = unsignedToTempString(value, result._buf, radix ).length & 0xff ;
106+ result._len = unsignedToTempString! radix (value, result._buf).length & 0xff ;
84107 return result;
85108}
86109
87110unittest
88111{
89112 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" );
97120
98121 // use stack allocated struct version
99- assert (0. unsignedToTempString( 10 ) == " 0" );
122+ assert (0. unsignedToTempString == " 0" );
100123 assert (1. unsignedToTempString == " 1" );
101124 assert (12. unsignedToTempString == " 12" );
102- assert (0x12ABCF .unsignedToTempString( 16 ) == " 12abcf" );
125+ assert (0x12ABCF .unsignedToTempString! 16 == " 12abcf" );
103126 assert (long .sizeof.unsignedToTempString == " 8" );
104127 assert (uint .max.unsignedToTempString == " 4294967295" );
105128 assert (ulong .max.unsignedToTempString == " 18446744073709551615" );
106129
107130 // 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) == " " )) );
110133}
111134
112135alias SignedStringBuf = char [20 ];
113136
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
115138{
116139 bool neg = value < 0 ;
117140 if (neg)
118141 value = cast (ulong )- value;
119- auto r = unsignedToTempString(value, buf, radix );
142+ auto r = unsignedToTempString! radix (value, buf);
120143 if (neg)
121144 {
122145 // about to do a slice without a bounds check
@@ -127,12 +150,12 @@ char[] signedToTempString(long value, return scope char[] buf, uint radix = 10)
127150 return r;
128151}
129152
130- auto signedToTempString (long value, uint radix = 10 ) @safe
153+ auto signedToTempString (uint radix = 10 )( long value ) @safe
131154{
132155 bool neg = value < 0 ;
133156 if (neg)
134157 value = cast (ulong )- value;
135- auto r = unsignedToTempString(value, radix );
158+ auto r = unsignedToTempString! radix (value);
136159 if (neg)
137160 {
138161 r._len++ ;
@@ -141,37 +164,54 @@ auto signedToTempString(long value, uint radix = 10) @safe
141164 return r;
142165}
143166
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+
144184unittest
145185{
146186 SignedStringBuf buf;
147- assert (0. signedToTempString(buf, 10 ) == " 0" );
187+ assert (0. signedToTempString(buf) == " 0" );
148188 assert (1. signedToTempString(buf) == " 1" );
149189 assert ((- 1 ).signedToTempString(buf) == " -1" );
150190 assert (12. signedToTempString(buf) == " 12" );
151191 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" );
154194 assert (long .sizeof.signedToTempString(buf) == " 8" );
155195 assert (int .max.signedToTempString(buf) == " 2147483647" );
156196 assert (int .min.signedToTempString(buf) == " -2147483648" );
157197 assert (long .max.signedToTempString(buf) == " 9223372036854775807" );
158198 assert (long .min.signedToTempString(buf) == " -9223372036854775808" );
159199
160200 // use stack allocated struct version
161- assert (0. signedToTempString(10 ) == " 0" );
201+ assert (0. signedToTempString() == " 0" );
162202 assert (1. signedToTempString == " 1" );
163203 assert ((- 1 ).signedToTempString == " -1" );
164204 assert (12. signedToTempString == " 12" );
165205 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" );
168208 assert (long .sizeof.signedToTempString == " 8" );
169209 assert (int .max.signedToTempString == " 2147483647" );
170210 assert (int .min.signedToTempString == " -2147483648" );
171211 assert (long .max.signedToTempString == " 9223372036854775807" );
172212 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" );
175215}
176216
177217
0 commit comments