Skip to content

Commit 71a4a66

Browse files
committed
Add a math module to the standard lib
I need some rudimentary stdlib stuff for the tutorial. Closes #1042
1 parent d9d0782 commit 71a4a66

File tree

6 files changed

+72
-21
lines changed

6 files changed

+72
-21
lines changed

src/comp/middle/typeck.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1305,17 +1305,17 @@ fn valid_range_bounds(l1: @ast::lit, l2: @ast::lit) -> bool {
13051305
let s2 = lit_as_float(l2);
13061306
let f1 = std::float::from_str(s1);
13071307
let f2 = std::float::from_str(s2);
1308-
ret *util::common::min(f1, f2) == f1
1308+
ret std::math::min(f1, f2) == f1
13091309
}
13101310
ast::lit_uint(_) | ast::lit_char(_) {
13111311
let u1 = lit_as_uint(l1);
13121312
let u2 = lit_as_uint(l2);
1313-
ret *util::common::min(u1, u2) == u1
1313+
ret std::math::min(u1, u2) == u1
13141314
}
13151315
_ {
13161316
let i1 = lit_as_int(l1);
13171317
let i2 = lit_as_int(l2);
1318-
ret *util::common::min(i1, i2) == i1
1318+
ret std::math::min(i1, i2) == i1
13191319
}
13201320
}
13211321
}

src/comp/util/common.rs

+11-18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import std::{str, map, uint, int, option};
2+
import std::math::{max, min};
23
import std::map::hashmap;
34
import std::option::{none, some};
45
import syntax::ast;
@@ -131,53 +132,45 @@ fn lit_in_range(l: @ast::lit, m1: @ast::lit, m2: @ast::lit) -> bool {
131132
irange(i1, i2) {
132133
alt l.node {
133134
ast::lit_int(i3) | ast::lit_mach_int(_, i3) {
134-
i3 >= *min(i1, i2) && i3 <= *max(i1, i2)
135+
i3 >= min(i1, i2) && i3 <= max(i1, i2)
135136
}
136137
_ { fail }
137138
}
138139
}
139140
urange(u1, u2) {
140141
alt l.node {
141142
ast::lit_uint(u3) {
142-
u3 >= *min(u1, u2) && u3 <= *max(u1, u2)
143+
u3 >= min(u1, u2) && u3 <= max(u1, u2)
143144
}
144145
_ { fail }
145146
}
146147
}
147148
crange(c1, c2) {
148149
alt l.node {
149150
ast::lit_char(c3) {
150-
(c3 as uint) >= *min(c1 as uint, c2 as uint) &&
151-
(c3 as uint) <= *max(c1 as uint, c2 as uint)
151+
(c3 as uint) >= min(c1 as uint, c2 as uint) &&
152+
(c3 as uint) <= max(c1 as uint, c2 as uint)
152153
}
153154
_ { fail }
154155
}
155156
}
156157
frange(f1, f2) {
157158
alt l.node {
158159
ast::lit_float(f3) | ast::lit_mach_float(_, f3) {
159-
std::float::from_str(f3) >= *min(f1, f2) &&
160-
std::float::from_str(f3) <= *max(f1, f2)
160+
std::float::from_str(f3) >= min(f1, f2) &&
161+
std::float::from_str(f3) <= max(f1, f2)
161162
}
162163
_ { fail }
163164
}
164165
}
165166
}
166167
}
167168

168-
fn min<@T>(x: T, y: T) -> @T {
169-
ret @(if x > y { y } else { x });
170-
}
171-
172-
fn max<@T>(x: T, y: T) -> @T {
173-
ret @(if x > y { x } else { y });
174-
}
175-
176169
fn ranges_overlap<@T>(a1: T, a2: T, b1: T, b2: T) -> bool {
177-
let min1 = *min(a1, a2);
178-
let max1 = *max(a1, a2);
179-
let min2 = *min(b1, b2);
180-
let max2 = *max(b1, b2);
170+
let min1 = min(a1, a2);
171+
let max1 = max(a1, a2);
172+
let min2 = min(b1, b2);
173+
let max2 = max(b1, b2);
181174
ret (min1 >= min2 && max1 <= max2) || (min1 <= min2 && max1 >= min2) ||
182175
(min1 >= min2 && min1 <= max2) || (max1 >= min2 && max1 <= max2);
183176
}

src/lib/math.rs

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
native "llvm" mod llvm {
2+
fn sqrt(n: float) -> float = "sqrt.f64";
3+
fn sin(n: float) -> float = "sin.f64";
4+
fn asin(n: float) -> float = "asin.f64";
5+
fn cos(n: float) -> float = "cos.f64";
6+
fn acos(n: float) -> float = "acos.f64";
7+
fn tan(n: float) -> float = "tan.f64";
8+
fn atan(n: float) -> float = "atan.f64";
9+
}
10+
11+
fn sqrt(x: float) -> float { llvm::sqrt(x) }
12+
fn sin(x: float) -> float { llvm::sin(x) }
13+
fn cos(x: float) -> float { llvm::cos(x) }
14+
fn tan(x: float) -> float { llvm::tan(x) }
15+
fn asin(x: float) -> float { llvm::asin(x) }
16+
fn acos(x: float) -> float { llvm::acos(x) }
17+
fn atan(x: float) -> float { llvm::atan(x) }
18+
19+
const pi: float = 3.141592653589793;
20+
21+
fn min<@T>(x: T, y: T) -> T { x < y ? x : y }
22+
fn max<@T>(x: T, y: T) -> T { x < y ? y : x }

src/lib/std.rc

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ mod ptr;
9797
mod test;
9898
mod unsafe;
9999
mod term;
100+
mod math;
100101

101102
#[cfg(unicode)]
102103
mod unicode;

src/test/stdtest/math.rs

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use std;
2+
import std::math::*;
3+
4+
#[test]
5+
fn test_sqrt() {
6+
assert sqrt(9.0) == 3.0;
7+
assert sqrt(4.0) == 2.0;
8+
assert sqrt(1.0) == 1.0;
9+
assert sqrt(0.0) == 0.0;
10+
}
11+
12+
#[test]
13+
fn test_max_min() {
14+
assert max(0, 1) == 1;
15+
assert min(0, 1) == 0;
16+
assert max(0, -1) == 0;
17+
assert min(0, -1) == -1;
18+
assert max(0.0, 1.0) == 1.0;
19+
assert min(0.0, 1.0) == 0.0;
20+
}
21+
22+
#[test]
23+
fn test_angle() {
24+
fn angle(vec: (float, float)) -> float {
25+
alt vec {
26+
(0f, y) when y < 0f { 1.5 * std::math::pi }
27+
(0f, y) { 0.5 * std::math::pi }
28+
(x, y) { std::math::atan(y / x) }
29+
}
30+
}
31+
assert angle((1f, 0f)) == 0f;
32+
assert angle((1f, 1f)) == 0.25 * pi;
33+
assert angle((0f, 1f)) == 0.5 * pi;
34+
}

src/test/stdtest/stdtest.rc

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ mod task;
3030
mod test;
3131
mod uint;
3232
mod float;
33+
mod math;
3334

3435
// Local Variables:
3536
// mode: rust

0 commit comments

Comments
 (0)