Skip to content

Factoring bigint, rational, and complex out of libextra into libnum. #12154

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion mk/crates.mk
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
################################################################################

TARGET_CRATES := std extra green rustuv native flate arena glob term semver \
uuid serialize sync getopts collections
uuid serialize sync getopts collections num
HOST_CRATES := syntax rustc rustdoc fourcc
CRATES := $(TARGET_CRATES) $(HOST_CRATES)
TOOLS := compiletest rustdoc rustc
Expand All @@ -75,6 +75,7 @@ DEPS_sync := std
DEPS_getopts := std
DEPS_collections := std serialize
DEPS_fourcc := syntax std
DEPS_num := std extra

TOOL_DEPS_compiletest := extra green rustuv getopts
TOOL_DEPS_rustdoc := rustdoc green rustuv
Expand Down
1 change: 1 addition & 0 deletions src/doc/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ li {list-style-type: none; }
* [The Rust compiler, `librustc`](rustc/index.html)

* [The `arena` allocation library](arena/index.html)
* [The `num` arbitrary precision numerics library](num/index.html)
* [The `collections` library](collections/index.html)
* [The `flate` compression library](flate/index.html)
* [The `fourcc` four-character code library](fourcc/index.html)
Expand Down
14 changes: 7 additions & 7 deletions src/doc/tutorial.md
Original file line number Diff line number Diff line change
Expand Up @@ -3026,12 +3026,12 @@ In Rust terminology, we need a way to refer to other crates.
For that, Rust offers you the `extern mod` declaration:

~~~
extern mod extra;
// extra ships with Rust, you'll find more details further down.
extern mod num;
// `num` ships with Rust (much like `extra`; more details further down).

fn main() {
// The rational number '1/2':
let one_half = ::extra::rational::Ratio::new(1, 2);
let one_half = ::num::rational::Ratio::new(1, 2);
}
~~~

Expand All @@ -3056,10 +3056,10 @@ of both `use` and local declarations.
Which can result in something like this:

~~~
extern mod extra;
extern mod num;

use farm::dog;
use extra::rational::Ratio;
use num::rational::Ratio;

mod farm {
pub fn dog() { println!("woof"); }
Expand Down Expand Up @@ -3224,9 +3224,9 @@ See the [API documentation][stddoc] for details.

## The extra library

Rust also ships with the [extra library], an accumulation of useful things,
Rust ships with crates such as the [extra library], an accumulation of useful things,
that are however not important enough to deserve a place in the standard
library. You can use them by linking to `extra` with an `extern mod extra;`.
library. You can link to a library such as `extra` with an `extern mod extra;`.

[extra library]: extra/index.html

Expand Down
6 changes: 0 additions & 6 deletions src/libextra/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,6 @@ pub mod time;
pub mod base64;
pub mod workcache;
pub mod enum_set;
#[path="num/bigint.rs"]
pub mod bigint;
#[path="num/rational.rs"]
pub mod rational;
#[path="num/complex.rs"]
pub mod complex;
pub mod stats;
pub mod hex;

Expand Down
15 changes: 6 additions & 9 deletions src/libextra/num/bigint.rs → src/libnum/bigint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@ A `BigUint` is represented as an array of `BigDigit`s.
A `BigInt` is a combination of `BigUint` and `Sign`.
*/

#[allow(missing_doc)];
#[allow(non_uppercase_statics)];

use std::cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater};
use std::num;
use std::num::{Zero, One, ToStrRadix, FromStrRadix, Orderable};
Expand Down Expand Up @@ -48,7 +45,7 @@ pub type BigDigit = u32;
pub static ZERO_BIG_DIGIT: BigDigit = 0;

pub mod BigDigit {
use bigint::BigDigit;
use super::BigDigit;

#[cfg(target_word_size = "32")]
pub static bits: uint = 16;
Expand Down Expand Up @@ -1433,8 +1430,8 @@ impl BigInt {

#[cfg(test)]
mod biguint_tests {
use super::*;
use super::RandBigInt;
use super::{BigDigit, BigUint, ToBigUint};
use super::{Plus, BigInt, RandBigInt, ToBigInt};

use std::cmp::{Less, Equal, Greater};
use std::i64;
Expand Down Expand Up @@ -2090,8 +2087,8 @@ mod biguint_tests {

#[cfg(test)]
mod bigint_tests {
use super::*;
use super::RandBigInt;
use super::{BigDigit, BigUint, ToBigUint};
use super::{Sign, Minus, Zero, Plus, BigInt, RandBigInt, ToBigInt};

use std::cmp::{Less, Equal, Greater};
use std::i64;
Expand Down Expand Up @@ -2591,7 +2588,7 @@ mod bigint_tests {

#[cfg(test)]
mod bench {
use super::*;
use super::{BigInt, BigUint};
use std::iter;
use std::mem::replace;
use std::num::{FromPrimitive, Zero, One};
Expand Down
4 changes: 2 additions & 2 deletions src/libextra/num/complex.rs → src/libnum/complex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ impl<T: ToStrRadix + Num + Ord> ToStrRadix for Cmplx<T> {
mod test {
#[allow(non_uppercase_statics)];

use super::*;
use super::{Complex64, Cmplx};
use std::num::{Zero,One,Real};

pub static _0_0i : Complex64 = Cmplx { re: 0.0, im: 0.0 };
Expand Down Expand Up @@ -285,7 +285,7 @@ mod test {
}

mod arith {
use super::*;
use super::{_0_0i, _1_0i, _1_1i, _0_1i, _neg1_1i, _05_05i, all_consts};
use std::num::Zero;

#[test]
Expand Down
22 changes: 22 additions & 0 deletions src/libnum/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#[feature(macro_rules)];

#[crate_id = "num#0.10-pre"];
#[crate_type = "rlib"];
#[crate_type = "dylib"];
#[license = "MIT/ASL2"];

extern mod extra;

pub mod bigint;
pub mod rational;
pub mod complex;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We've been moving towards private inner modules and reexports of their contents, so perhaps these could be mod foo; with pub use bigint::{BigInt, BigUint}; etc at the top?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm. When importing via globs, it is nicer I think to have these things actually collected together like this.

But I can see that this does lead to the stuttering problem.

Is it reasonable to re-export the contents from the num crate, but to have the inner modules be public, to allow such usage? Or is that just asking for trouble?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good point, I suppose globs really do want to import num::bigint::*, not num::*. Then again, globs are feature-gated...

One part about pub mod foo; is that the reexport doesn't have its documentation inlined at the reexport site, but rather it's a redirect. That's not necessarily a downside, but it is something to consider.

Let's go with this for now, and see how it turns out.

11 changes: 5 additions & 6 deletions src/libextra/num/rational.rs → src/libnum/rational.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
Expand All @@ -10,11 +10,10 @@

//! Rational numbers


use std::cmp;
use std::from_str::FromStr;
use std::num::{Zero,One,ToStrRadix,FromStrRadix,Round};
use super::bigint::{BigInt, BigUint, Sign, Plus, Minus};
use bigint::{BigInt, BigUint, Sign, Plus, Minus};

/// Represents the ratio between 2 numbers.
#[deriving(Clone)]
Expand Down Expand Up @@ -349,7 +348,7 @@ impl<T: FromStrRadix + Clone + Integer + Ord>
#[cfg(test)]
mod test {

use super::*;
use super::{Ratio, Rational, BigRational};
use std::num::{Zero,One,FromStrRadix,FromPrimitive};
use std::from_str::FromStr;

Expand Down Expand Up @@ -449,8 +448,8 @@ mod test {


mod arith {
use super::*;
use super::super::*;
use super::{_0, _1, _2, _1_2, _3_2, _neg1_2, to_big};
use super::super::{Ratio, Rational, BigRational};


#[test]
Expand Down
4 changes: 2 additions & 2 deletions src/test/bench/shootout-pidigits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

extern mod extra;
extern mod num;

use std::from_str::FromStr;
use std::num::One;
use std::num::Zero;
use std::num::FromPrimitive;
use extra::bigint::BigInt;
use num::bigint::BigInt;

struct Context {
numer: BigInt,
Expand Down