Skip to content

Commit

Permalink
Make rand and rustc-serialize dependencies optional.
Browse files Browse the repository at this point in the history
Previously, the `rand` and `rustc-serialize` dependencies were optional
except they were required for the `bigint` feature.

Make the dependency on the `rand` crate optional in all cases.
including when the `bigint` feature is selected. Some of the tests for
the bigint feature are randomized so, while `rand` is now an optional
dependency, it is a non-optional dev-dependency.

Similarly, make the dependency on the `rustc-serialize` crate optional
in all cases, including when the `bigint` feature is selected.
  • Loading branch information
briansmith committed Jan 8, 2016
1 parent 22722ac commit 9e3e855
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 6 deletions.
9 changes: 7 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,17 @@ complex, rational, range iterators, generic integers, and more!
rustc-serialize = { version = "0.3.13", optional = true }
rand = { version = "0.3.8", optional = true }

[dev-dependencies]
# Some tests of non-rand functionality still use rand because the tests
# themselves are randomized.
rand = { version = "0.3.8" }

[features]

complex = []
rational = []
bigint = ["rustc-serialize", "rand"]
default = ["complex", "rational", "bigint"]
bigint = []
default = ["bigint", "complex", "rand", "rational", "rustc-serialize"]

[[bench]]
name = "bigint"
Expand Down
21 changes: 18 additions & 3 deletions src/bigint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
//! ```rust
//! extern crate rand;
//! extern crate num;
//!
//! # #[cfg(feature = "rand")]
//! # fn main() {
//! use num::bigint::{ToBigInt, RandBigInt};
//!
Expand All @@ -56,6 +58,10 @@
//! // Probably an even larger number.
//! println!("{}", a * b);
//! # }
//!
//! # #[cfg(not(feature = "rand"))]
//! # fn main() {
//! # }
//! ```
use Integer;
Expand All @@ -71,6 +77,10 @@ use std::cmp::Ordering::{self, Less, Greater, Equal};
use std::{f32, f64};
use std::{u8, i64, u64};

// Some of the tests of non-RNG-based functionality are randomized using the
// RNG-based functionality, so the RNG-based functionality needs to be enabled
// for tests.
#[cfg(any(feature = "rand", test))]
use rand::Rng;

use traits::{ToPrimitive, FromPrimitive};
Expand Down Expand Up @@ -173,11 +183,13 @@ fn div_wide(hi: BigDigit, lo: BigDigit, divisor: BigDigit) -> (BigDigit, BigDigi
let rhs = divisor as DoubleBigDigit;
((lhs / rhs) as BigDigit, (lhs % rhs) as BigDigit)
}

/// A big unsigned integer type.
///
/// A `BigUint`-typed value `BigUint { data: vec!(a, b, c) }` represents a number
/// `(a + b * big_digit::BASE + c * big_digit::BASE^2)`.
#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Hash)]
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "rustc-serialize", derive(RustcEncodable, RustcDecodable))]
pub struct BigUint {
data: Vec<BigDigit>
}
Expand Down Expand Up @@ -1729,7 +1741,8 @@ fn get_radix_base(radix: u32) -> (DoubleBigDigit, usize) {
}

/// A Sign is a `BigInt`'s composing element.
#[derive(PartialEq, PartialOrd, Eq, Ord, Copy, Clone, Debug, RustcEncodable, RustcDecodable, Hash)]
#[derive(PartialEq, PartialOrd, Eq, Ord, Copy, Clone, Debug, Hash)]
#[cfg_attr(feature = "rustc-serialize", derive(RustcEncodable, RustcDecodable))]
pub enum Sign { Minus, NoSign, Plus }

impl Neg for Sign {
Expand Down Expand Up @@ -1760,7 +1773,8 @@ impl Mul<Sign> for Sign {
}

/// A big signed integer type.
#[derive(Clone, RustcEncodable, RustcDecodable, Debug, Hash)]
#[derive(Clone, Debug, Hash)]
#[cfg_attr(feature = "rustc-serialize", derive(RustcEncodable, RustcDecodable))]
pub struct BigInt {
sign: Sign,
data: BigUint
Expand Down Expand Up @@ -2387,6 +2401,7 @@ pub trait RandBigInt {
fn gen_bigint_range(&mut self, lbound: &BigInt, ubound: &BigInt) -> BigInt;
}

#[cfg(any(feature = "rand", test))]
impl<R: Rng> RandBigInt for R {
fn gen_biguint(&mut self, bit_size: usize) -> BigUint {
let (digits, rem) = bit_size.div_rem(&big_digit::BITS);
Expand Down
6 changes: 5 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,11 @@

#[cfg(feature = "rustc-serialize")]
extern crate rustc_serialize;
#[cfg(feature = "rand")]

// Some of the tests of non-RNG-based functionality are randomized using the
// RNG-based functionality, so the RNG-based functionality needs to be enabled
// for tests.
#[cfg(any(feature = "rand", all(feature = "bigint", test)))]
extern crate rand;

#[cfg(feature = "bigint")]
Expand Down

0 comments on commit 9e3e855

Please sign in to comment.