Skip to content

Commit 267efed

Browse files
committed
---
yaml --- r: 80698 b: refs/heads/try c: a918497 h: refs/heads/master v: v3
1 parent 45affe9 commit 267efed

File tree

128 files changed

+640
-1898
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

128 files changed

+640
-1898
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
refs/heads/master: 4c6bf4872012c010f84dc7fa2cdfe87522533f89
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: cbd1eefbd350797b783df119fed7956d7e1c74ad
5-
refs/heads/try: 645b83d712fdfd325c899e0bb2ca09d4b0f5f880
5+
refs/heads/try: a9184975da62769dfccbca73fb9bd554298a4d36
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c

branches/try/doc/rust.md

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2459,12 +2459,25 @@ do k(3) |j| {
24592459
### For expressions
24602460

24612461
~~~~~~~~{.ebnf .gram}
2462-
for_expr : "for" pat "in" expr '{' block '}' ;
2462+
for_expr : "for" expr [ '|' ident_list '|' ] ? '{' block '}' ;
24632463
~~~~~~~~
24642464

2465-
A `for` expression is a syntactic construct for looping
2466-
over elements provided by an implementation of
2467-
`std::iterator::Iterator`.
2465+
A _for expression_ is similar to a [`do` expression](#do-expressions),
2466+
in that it provides a special block-form of lambda expression,
2467+
suited to passing the `block` function to a higher-order function implementing a loop.
2468+
2469+
In contrast to a `do` expression, a `for` expression is designed to work
2470+
with methods such as `each` and `times`, that require the body block to
2471+
return a boolean. The `for` expression accommodates this by implicitly
2472+
returning `true` at the end of each block, unless a `break` expression
2473+
is evaluated.
2474+
2475+
In addition, [`break`](#break-expressions) and [`loop`](#loop-expressions) expressions
2476+
are rewritten inside `for` expressions in the same way that `return` expressions are,
2477+
with a combination of local flag variables,
2478+
and early boolean-valued returns from the `block` function,
2479+
such that the meaning of `break` and `loop` is preserved in a primitive loop
2480+
when rewritten as a `for` loop controlled by a higher order function.
24682481

24692482
An example of a for loop over the contents of a vector:
24702483

branches/try/src/libextra/num/bigint.rs

Lines changed: 42 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ impl Integer for BigUint {
503503
impl IntConvertible for BigUint {
504504
#[inline]
505505
fn to_int(&self) -> int {
506-
self.to_int_opt().expect("BigUint conversion would overflow int")
506+
num::min(self.to_uint(), int::max_value as uint) as int
507507
}
508508

509509
#[inline]
@@ -615,43 +615,18 @@ impl BigUint {
615615
}
616616

617617

618-
/// Converts this BigUint into a uint, failing if the conversion
619-
/// would overflow.
618+
/// Converts this big integer into a uint, returning the uint::max_value if
619+
/// it's too large to fit in a uint.
620620
#[inline]
621621
pub fn to_uint(&self) -> uint {
622-
self.to_uint_opt().expect("BigUint conversion would overflow uint")
623-
}
624-
625-
/// Converts this BigUint into a uint, unless it would overflow.
626-
#[inline]
627-
pub fn to_uint_opt(&self) -> Option<uint> {
628622
match self.data.len() {
629-
0 => Some(0),
630-
1 => Some(self.data[0] as uint),
631-
2 => Some(BigDigit::to_uint(self.data[1], self.data[0])),
632-
_ => None
623+
0 => 0,
624+
1 => self.data[0] as uint,
625+
2 => BigDigit::to_uint(self.data[1], self.data[0]),
626+
_ => uint::max_value
633627
}
634628
}
635629

636-
// Converts this BigUint into an int, unless it would overflow.
637-
pub fn to_int_opt(&self) -> Option<int> {
638-
self.to_uint_opt().chain(|n| {
639-
// If top bit of uint is set, it's too large to convert to
640-
// int.
641-
if (n >> (2*BigDigit::bits - 1) != 0) {
642-
None
643-
} else {
644-
Some(n as int)
645-
}
646-
})
647-
}
648-
649-
/// Converts this BigUint into a BigInt.
650-
#[inline]
651-
pub fn to_bigint(&self) -> BigInt {
652-
BigInt::from_biguint(Plus, self.clone())
653-
}
654-
655630
#[inline]
656631
fn shl_unit(&self, n_unit: uint) -> BigUint {
657632
if n_unit == 0 || self.is_zero() { return (*self).clone(); }
@@ -1073,7 +1048,12 @@ impl Integer for BigInt {
10731048
impl IntConvertible for BigInt {
10741049
#[inline]
10751050
fn to_int(&self) -> int {
1076-
self.to_int_opt().expect("BigInt conversion would overflow int")
1051+
match self.sign {
1052+
Plus => num::min(self.to_uint(), int::max_value as uint) as int,
1053+
Zero => 0,
1054+
Minus => num::min((-self).to_uint(),
1055+
(int::max_value as uint) + 1) as int
1056+
}
10771057
}
10781058

10791059
#[inline]
@@ -1199,55 +1179,12 @@ impl BigInt {
11991179
.map_move(|bu| BigInt::from_biguint(sign, bu));
12001180
}
12011181
1202-
/// Converts this BigInt into a uint, failing if the conversion
1203-
/// would overflow.
12041182
#[inline]
12051183
pub fn to_uint(&self) -> uint {
1206-
self.to_uint_opt().expect("BigInt conversion would overflow uint")
1207-
}
1208-
1209-
/// Converts this BigInt into a uint, unless it would overflow.
1210-
#[inline]
1211-
pub fn to_uint_opt(&self) -> Option<uint> {
1212-
match self.sign {
1213-
Plus => self.data.to_uint_opt(),
1214-
Zero => Some(0),
1215-
Minus => None
1216-
}
1217-
}
1218-
1219-
/// Converts this BigInt into an int, unless it would overflow.
1220-
pub fn to_int_opt(&self) -> Option<int> {
1221-
match self.sign {
1222-
Plus => self.data.to_int_opt(),
1223-
Zero => Some(0),
1224-
Minus => self.data.to_uint_opt().chain(|n| {
1225-
let m: uint = 1 << (2*BigDigit::bits-1);
1226-
if (n > m) {
1227-
None
1228-
} else if (n == m) {
1229-
Some(int::min_value)
1230-
} else {
1231-
Some(-(n as int))
1232-
}
1233-
})
1234-
}
1235-
}
1236-
1237-
/// Converts this BigInt into a BigUint, failing if BigInt is
1238-
/// negative.
1239-
#[inline]
1240-
pub fn to_biguint(&self) -> BigUint {
1241-
self.to_biguint_opt().expect("negative BigInt cannot convert to BigUint")
1242-
}
1243-
1244-
/// Converts this BigInt into a BigUint, if it's not negative.
1245-
#[inline]
1246-
pub fn to_biguint_opt(&self) -> Option<BigUint> {
12471184
match self.sign {
1248-
Plus => Some(self.data.clone()),
1249-
Zero => Some(Zero::zero()),
1250-
Minus => None
1185+
Plus => self.data.to_uint(),
1186+
Zero => 0,
1187+
Minus => 0
12511188
}
12521189
}
12531190
}
@@ -1448,9 +1385,9 @@ mod biguint_tests {
14481385
check(~[ 0, 1], ((uint::max_value >> BigDigit::bits) + 1) as int);
14491386
check(~[-1, -1 >> 1], int::max_value);
14501387

1451-
assert_eq!(BigUint::new(~[0, -1]).to_int_opt(), None);
1452-
assert_eq!(BigUint::new(~[0, 0, 1]).to_int_opt(), None);
1453-
assert_eq!(BigUint::new(~[0, 0, -1]).to_int_opt(), None);
1388+
assert_eq!(BigUint::new(~[0, -1]).to_int(), int::max_value);
1389+
assert_eq!(BigUint::new(~[0, 0, 1]).to_int(), int::max_value);
1390+
assert_eq!(BigUint::new(~[0, 0, -1]).to_int(), int::max_value);
14541391
}
14551392

14561393
#[test]
@@ -1468,19 +1405,8 @@ mod biguint_tests {
14681405
check(~[ 0, -1], uint::max_value << BigDigit::bits);
14691406
check(~[-1, -1], uint::max_value);
14701407

1471-
assert_eq!(BigUint::new(~[0, 0, 1]).to_uint_opt(), None);
1472-
assert_eq!(BigUint::new(~[0, 0, -1]).to_uint_opt(), None);
1473-
}
1474-
1475-
#[test]
1476-
fn test_convert_to_bigint() {
1477-
fn check(n: BigUint, ans: BigInt) {
1478-
assert_eq!(n.to_bigint(), ans);
1479-
assert_eq!(n.to_bigint().to_biguint(), n);
1480-
}
1481-
check(Zero::zero(), Zero::zero());
1482-
check(BigUint::new(~[1,2,3]),
1483-
BigInt::from_biguint(Plus, BigUint::new(~[1,2,3])));
1408+
assert_eq!(BigUint::new(~[0, 0, 1]).to_uint(), uint::max_value);
1409+
assert_eq!(BigUint::new(~[0, 0, -1]).to_uint(), uint::max_value);
14841410
}
14851411

14861412
static sum_triples: &'static [(&'static [BigDigit],
@@ -1867,21 +1793,22 @@ mod bigint_tests {
18671793
Plus, BigUint::from_uint(int::max_value as uint)
18681794
), int::max_value);
18691795

1870-
assert_eq!(BigInt::from_biguint(
1796+
assert!(BigInt::from_biguint(
18711797
Plus, BigUint::from_uint(int::max_value as uint + 1)
1872-
).to_int_opt(), None);
1873-
assert_eq!(BigInt::from_biguint(
1798+
).to_int() == int::max_value);
1799+
assert!(BigInt::from_biguint(
18741800
Plus, BigUint::new(~[1, 2, 3])
1875-
).to_int_opt(), None);
1801+
).to_int() == int::max_value);
18761802

18771803
check(BigInt::from_biguint(
1878-
Minus, BigUint::new(~[0, 1<<(BigDigit::bits-1)])
1804+
Minus, BigUint::from_uint(-int::min_value as uint)
18791805
), int::min_value);
1880-
assert_eq!(BigInt::from_biguint(
1881-
Minus, BigUint::new(~[1, 1<<(BigDigit::bits-1)])
1882-
).to_int_opt(), None);
1883-
assert_eq!(BigInt::from_biguint(
1884-
Minus, BigUint::new(~[1, 2, 3])).to_int_opt(), None);
1806+
assert!(BigInt::from_biguint(
1807+
Minus, BigUint::from_uint(-int::min_value as uint + 1)
1808+
).to_int() == int::min_value);
1809+
assert!(BigInt::from_biguint(
1810+
Minus, BigUint::new(~[1, 2, 3])
1811+
).to_int() == int::min_value);
18851812
}
18861813

18871814
#[test]
@@ -1897,31 +1824,16 @@ mod bigint_tests {
18971824
check(
18981825
BigInt::from_biguint(Plus, BigUint::from_uint(uint::max_value)),
18991826
uint::max_value);
1900-
assert_eq!(BigInt::from_biguint(
1901-
Plus, BigUint::new(~[1, 2, 3])).to_uint_opt(), None);
1902-
1903-
assert_eq!(BigInt::from_biguint(
1904-
Minus, BigUint::from_uint(uint::max_value)).to_uint_opt(), None);
1905-
assert_eq!(BigInt::from_biguint(
1906-
Minus, BigUint::new(~[1, 2, 3])).to_uint_opt(), None);
1907-
}
1908-
1909-
#[test]
1910-
fn test_convert_to_biguint() {
1911-
fn check(n: BigInt, ans_1: BigUint) {
1912-
assert_eq!(n.to_biguint(), ans_1);
1913-
assert_eq!(n.to_biguint().to_bigint(), n);
1914-
}
1915-
let zero: BigInt = Zero::zero();
1916-
let unsigned_zero: BigUint = Zero::zero();
1917-
let positive = BigInt::from_biguint(
1918-
Plus, BigUint::new(~[1,2,3]));
1919-
let negative = -positive;
1920-
1921-
check(zero, unsigned_zero);
1922-
check(positive, BigUint::new(~[1,2,3]));
1923-
1924-
assert_eq!(negative.to_biguint_opt(), None);
1827+
assert!(BigInt::from_biguint(
1828+
Plus, BigUint::new(~[1, 2, 3])
1829+
).to_uint() == uint::max_value);
1830+
1831+
assert!(BigInt::from_biguint(
1832+
Minus, BigUint::from_uint(uint::max_value)
1833+
).to_uint() == 0);
1834+
assert!(BigInt::from_biguint(
1835+
Minus, BigUint::new(~[1, 2, 3])
1836+
).to_uint() == 0);
19251837
}
19261838

19271839
static sum_triples: &'static [(&'static [BigDigit],

0 commit comments

Comments
 (0)