Skip to content

Commit 2adad1f

Browse files
committed
core: Generalize int-string conversions to all int types
Issue #2239
1 parent cb6ed42 commit 2adad1f

File tree

3 files changed

+101
-100
lines changed

3 files changed

+101
-100
lines changed

src/libcore/core.rc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ export priv;
5656
#[doc = "Operations and constants for `int`"]
5757
#[path = "int-template"]
5858
mod int {
59-
import inst::{ hash, parse_buf, from_str, to_str, str, pow };
60-
export hash, parse_buf, from_str, to_str, str, pow;
59+
import inst::{ hash, pow };
60+
export hash, pow;
6161
#[path = "int.rs"]
6262
mod inst;
6363
}

src/libcore/int-template.rs

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export is_nonpositive, is_nonnegative;
99
export range;
1010
export compl;
1111
export abs;
12+
export parse_buf, from_str, to_str, str;
1213

1314
const min_value: T = -1 as T << (inst::bits - 1 as T);
1415
const max_value: T = min_value - 1 as T;
@@ -50,3 +51,101 @@ pure fn compl(i: T) -> T {
5051
pure fn abs(i: T) -> T {
5152
if is_negative(i) { -i } else { i }
5253
}
54+
55+
#[doc = "
56+
Parse a buffer of bytes
57+
58+
# Arguments
59+
60+
* buf - A byte buffer
61+
* radix - The base of the number
62+
"]
63+
fn parse_buf(buf: [u8], radix: uint) -> option<T> {
64+
if vec::len(buf) == 0u { ret none; }
65+
let mut i = vec::len(buf) - 1u;
66+
let mut start = 0u;
67+
let mut power = 1 as T;
68+
69+
if buf[0] == ('-' as u8) {
70+
power = -1 as T;
71+
start = 1u;
72+
}
73+
let mut n = 0 as T;
74+
loop {
75+
alt char::to_digit(buf[i] as char, radix) {
76+
some(d) { n += (d as T) * power; }
77+
none { ret none; }
78+
}
79+
power *= radix as T;
80+
if i <= start { ret some(n); }
81+
i -= 1u;
82+
};
83+
}
84+
85+
#[doc = "Parse a string to an int"]
86+
fn from_str(s: str) -> option<T> { parse_buf(str::bytes(s), 10u) }
87+
88+
#[doc = "Convert to a string in a given base"]
89+
fn to_str(n: T, radix: uint) -> str {
90+
assert (0u < radix && radix <= 16u);
91+
ret if n < 0 as T {
92+
"-" + uint::to_str(-n as uint, radix)
93+
} else { uint::to_str(n as uint, radix) };
94+
}
95+
96+
#[doc = "Convert to a string"]
97+
fn str(i: T) -> str { ret to_str(i, 10u); }
98+
99+
100+
#[test]
101+
fn test_from_str() {
102+
assert from_str("0") == some(0 as T);
103+
assert from_str("3") == some(3 as T);
104+
assert from_str("10") == some(10 as T);
105+
assert from_str("123456789") == some(123456789 as T);
106+
assert from_str("00100") == some(100 as T);
107+
108+
assert from_str("-1") == some(-1 as T);
109+
assert from_str("-3") == some(-3 as T);
110+
assert from_str("-10") == some(-10 as T);
111+
assert from_str("-123456789") == some(-123456789 as T);
112+
assert from_str("-00100") == some(-100 as T);
113+
114+
assert from_str(" ") == none;
115+
assert from_str("x") == none;
116+
}
117+
118+
#[test]
119+
fn test_parse_buf() {
120+
import str::bytes;
121+
assert parse_buf(bytes("123"), 10u) == some(123 as T);
122+
assert parse_buf(bytes("1001"), 2u) == some(9 as T);
123+
assert parse_buf(bytes("123"), 8u) == some(83 as T);
124+
assert parse_buf(bytes("123"), 16u) == some(291 as T);
125+
assert parse_buf(bytes("ffff"), 16u) == some(65535 as T);
126+
assert parse_buf(bytes("FFFF"), 16u) == some(65535 as T);
127+
assert parse_buf(bytes("z"), 36u) == some(35 as T);
128+
assert parse_buf(bytes("Z"), 36u) == some(35 as T);
129+
130+
assert parse_buf(bytes("-123"), 10u) == some(-123 as T);
131+
assert parse_buf(bytes("-1001"), 2u) == some(-9 as T);
132+
assert parse_buf(bytes("-123"), 8u) == some(-83 as T);
133+
assert parse_buf(bytes("-123"), 16u) == some(-291 as T);
134+
assert parse_buf(bytes("-ffff"), 16u) == some(-65535 as T);
135+
assert parse_buf(bytes("-FFFF"), 16u) == some(-65535 as T);
136+
assert parse_buf(bytes("-z"), 36u) == some(-35 as T);
137+
assert parse_buf(bytes("-Z"), 36u) == some(-35 as T);
138+
139+
assert parse_buf(str::bytes("Z"), 35u) == none;
140+
assert parse_buf(str::bytes("-9"), 2u) == none;
141+
}
142+
143+
#[test]
144+
fn test_to_str() {
145+
import str::eq;
146+
assert (eq(to_str(0 as T, 10u), "0"));
147+
assert (eq(to_str(1 as T, 10u), "1"));
148+
assert (eq(to_str(-1 as T, 10u), "-1"));
149+
assert (eq(to_str(127 as T, 16u), "7f"));
150+
assert (eq(to_str(100 as T, 10u), "100"));
151+
}

src/libcore/int-template/int.rs

Lines changed: 0 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -9,50 +9,6 @@ const bits: T = 64 as T;
99
#[doc = "Produce a uint suitable for use in a hash table"]
1010
pure fn hash(x: int) -> uint { ret x as uint; }
1111

12-
#[doc = "
13-
Parse a buffer of bytes
14-
15-
# Arguments
16-
17-
* buf - A byte buffer
18-
* radix - The base of the number
19-
"]
20-
fn parse_buf(buf: [u8], radix: uint) -> option<int> {
21-
if vec::len(buf) == 0u { ret none; }
22-
let mut i = vec::len(buf) - 1u;
23-
let mut start = 0u;
24-
let mut power = 1;
25-
26-
if buf[0] == ('-' as u8) {
27-
power = -1;
28-
start = 1u;
29-
}
30-
let mut n = 0;
31-
loop {
32-
alt char::to_digit(buf[i] as char, radix) {
33-
some(d) { n += (d as int) * power; }
34-
none { ret none; }
35-
}
36-
power *= radix as int;
37-
if i <= start { ret some(n); }
38-
i -= 1u;
39-
};
40-
}
41-
42-
#[doc = "Parse a string to an int"]
43-
fn from_str(s: str) -> option<int> { parse_buf(str::bytes(s), 10u) }
44-
45-
#[doc = "Convert to a string in a given base"]
46-
fn to_str(n: int, radix: uint) -> str {
47-
assert (0u < radix && radix <= 16u);
48-
ret if n < 0 {
49-
"-" + uint::to_str(-n as uint, radix)
50-
} else { uint::to_str(n as uint, radix) };
51-
}
52-
53-
#[doc = "Convert to a string"]
54-
fn str(i: int) -> str { ret to_str(i, 10u); }
55-
5612
#[doc = "Returns `base` raised to the power of `exponent`"]
5713
fn pow(base: int, exponent: uint) -> int {
5814
if exponent == 0u { ret 1; } //Not mathemtically true if [base == 0]
@@ -70,60 +26,6 @@ fn pow(base: int, exponent: uint) -> int {
7026
ret acc;
7127
}
7228

73-
74-
#[test]
75-
fn test_from_str() {
76-
assert from_str("0") == some(0);
77-
assert from_str("3") == some(3);
78-
assert from_str("10") == some(10);
79-
assert from_str("123456789") == some(123456789);
80-
assert from_str("00100") == some(100);
81-
82-
assert from_str("-1") == some(-1);
83-
assert from_str("-3") == some(-3);
84-
assert from_str("-10") == some(-10);
85-
assert from_str("-123456789") == some(-123456789);
86-
assert from_str("-00100") == some(-100);
87-
88-
assert from_str(" ") == none;
89-
assert from_str("x") == none;
90-
}
91-
92-
#[test]
93-
fn test_parse_buf() {
94-
import str::bytes;
95-
assert parse_buf(bytes("123"), 10u) == some(123);
96-
assert parse_buf(bytes("1001"), 2u) == some(9);
97-
assert parse_buf(bytes("123"), 8u) == some(83);
98-
assert parse_buf(bytes("123"), 16u) == some(291);
99-
assert parse_buf(bytes("ffff"), 16u) == some(65535);
100-
assert parse_buf(bytes("FFFF"), 16u) == some(65535);
101-
assert parse_buf(bytes("z"), 36u) == some(35);
102-
assert parse_buf(bytes("Z"), 36u) == some(35);
103-
104-
assert parse_buf(bytes("-123"), 10u) == some(-123);
105-
assert parse_buf(bytes("-1001"), 2u) == some(-9);
106-
assert parse_buf(bytes("-123"), 8u) == some(-83);
107-
assert parse_buf(bytes("-123"), 16u) == some(-291);
108-
assert parse_buf(bytes("-ffff"), 16u) == some(-65535);
109-
assert parse_buf(bytes("-FFFF"), 16u) == some(-65535);
110-
assert parse_buf(bytes("-z"), 36u) == some(-35);
111-
assert parse_buf(bytes("-Z"), 36u) == some(-35);
112-
113-
assert parse_buf(str::bytes("Z"), 35u) == none;
114-
assert parse_buf(str::bytes("-9"), 2u) == none;
115-
}
116-
117-
#[test]
118-
fn test_to_str() {
119-
import str::eq;
120-
assert (eq(to_str(0, 10u), "0"));
121-
assert (eq(to_str(1, 10u), "1"));
122-
assert (eq(to_str(-1, 10u), "-1"));
123-
assert (eq(to_str(255, 16u), "ff"));
124-
assert (eq(to_str(100, 10u), "100"));
125-
}
126-
12729
#[test]
12830
fn test_pow() {
12931
assert (pow(0, 0u) == 1);

0 commit comments

Comments
 (0)