diff --git a/.github/Xargo.toml b/.github/Xargo.toml index 6bdef96d..919803b5 100644 --- a/.github/Xargo.toml +++ b/.github/Xargo.toml @@ -1,2 +1,5 @@ [target.x86_64-unknown-linux-gnu.dependencies] +alloc = {} + +[target.thumbv7em-none-eabihf.dependencies] alloc = {} \ No newline at end of file diff --git a/.github/workflows/nalgebra-ci-build.yml b/.github/workflows/nalgebra-ci-build.yml index 181e092e..3518bf74 100644 --- a/.github/workflows/nalgebra-ci-build.yml +++ b/.github/workflows/nalgebra-ci-build.yml @@ -90,7 +90,11 @@ jobs: components: rustfmt - name: install xargo run: cp .github/Xargo.toml .; rustup component add rust-src; cargo install -f xargo; - - name: build + - name: build x86_64-unknown-linux-gnu run: xargo build --verbose --no-default-features --target=x86_64-unknown-linux-gnu; - - name: build --feature alloc + - name: build x86_64-unknown-linux-gnu --features rand-no-std + run: xargo build --verbose --no-default-features --target=x86_64-unknown-linux-gnu; + - name: build x86_64-unknown-linux-gnu --features alloc run: xargo build --verbose --no-default-features --features alloc --target=x86_64-unknown-linux-gnu; + - name: build thumbv7em-none-eabihf + run: xargo build --verbose --no-default-features --target=thumbv7em-none-eabihf; diff --git a/Cargo.toml b/Cargo.toml index 15f9effd..5d0fece6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,12 +23,14 @@ path = "src/lib.rs" [features] default = [ "std" ] -std = [ "matrixmultiply", "rand/std", "rand/std_rng", "rand_distr", "simba/std" ] +std = [ "matrixmultiply", "simba/std" ] +rand-no-std = [ "rand-package" ] +rand = [ "rand-no-std", "rand-package/std", "rand-package/std_rng", "rand_distr" ] arbitrary = [ "quickcheck" ] serde-serialize = [ "serde", "num-complex/serde" ] abomonation-serialize = [ "abomonation" ] sparse = [ ] -debug = [ "approx/num-complex", "rand/std" ] +debug = [ "approx/num-complex", "rand" ] alloc = [ ] io = [ "pest", "pest_derive" ] compare = [ "matrixcompare-core" ] @@ -43,8 +45,7 @@ slow-tests = [] [dependencies] typenum = "1.12" generic-array = "0.14" -rand = { version = "0.8", default-features = false } -getrandom = { version = "0.2", default-features = false, features = [ "js" ] } # For wasm +rand-package = { package = "rand", version = "0.8", optional = true, default-features = false } num-traits = { version = "0.2", default-features = false } num-complex = { version = "0.3", default-features = false } num-rational = { version = "0.3", default-features = false } diff --git a/src/base/construction.rs b/src/base/construction.rs index ba15a0f0..b606534c 100644 --- a/src/base/construction.rs +++ b/src/base/construction.rs @@ -7,18 +7,16 @@ use crate::base::storage::Owned; use quickcheck::{Arbitrary, Gen}; use num::{Bounded, One, Zero}; -#[cfg(feature = "std")] -use rand; -use rand::distributions::{Distribution, Standard}; -use rand::Rng; -#[cfg(feature = "std")] -use rand_distr::StandardNormal; +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, Standard}, + Rng, +}; + use std::iter; use std::mem; use typenum::{self, Cmp, Greater}; -#[cfg(feature = "std")] -use simba::scalar::RealField; use simba::scalar::{ClosedAdd, ClosedMul}; use crate::base::allocator::Allocator; @@ -281,7 +279,7 @@ where /// Creates a matrix filled with random values. #[inline] - #[cfg(feature = "std")] + #[cfg(feature = "rand")] pub fn new_random_generic(nrows: R, ncols: C) -> Self where Standard: Distribution, @@ -291,6 +289,7 @@ where /// Creates a matrix filled with random values from the given distribution. #[inline] + #[cfg(feature = "rand-no-std")] pub fn from_distribution_generic + ?Sized, G: Rng + ?Sized>( nrows: R, ncols: C, @@ -589,6 +588,7 @@ macro_rules! impl_constructors( /// Creates a matrix or vector filled with random values from the given distribution. #[inline] + #[cfg(feature = "rand-no-std")] pub fn from_distribution + ?Sized, G: Rng + ?Sized>( $($args: usize,)* distribution: &Distr, @@ -599,7 +599,7 @@ macro_rules! impl_constructors( /// Creates a matrix filled with random values. #[inline] - #[cfg(feature = "std")] + #[cfg(feature = "rand")] pub fn new_random($($args: usize),*) -> Self where Standard: Distribution { Self::new_random_generic($($gargs),*) @@ -817,6 +817,7 @@ where } } +#[cfg(feature = "rand-no-std")] impl Distribution> for Standard where DefaultAllocator: Allocator, @@ -851,11 +852,11 @@ where } } -#[cfg(feature = "std")] -impl Distribution>> for Standard +#[cfg(feature = "rand")] +impl Distribution>> for Standard where DefaultAllocator: Allocator, - StandardNormal: Distribution, + rand_distr::StandardNormal: Distribution, { /// Generate a uniformly distributed random unit vector. #[inline] @@ -863,7 +864,7 @@ where Unit::new_normalize(VectorN::from_distribution_generic( D::name(), U1, - &StandardNormal, + &rand_distr::StandardNormal, rng, )) } diff --git a/src/base/helper.rs b/src/base/helper.rs index fe5ffd02..00bd462c 100644 --- a/src/base/helper.rs +++ b/src/base/helper.rs @@ -1,7 +1,11 @@ #[cfg(feature = "arbitrary")] use quickcheck::{Arbitrary, Gen}; -use rand::distributions::{Distribution, Standard}; -use rand::Rng; + +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, Standard}, + Rng, +}; /// Simple helper function for rejection sampling #[cfg(feature = "arbitrary")] @@ -17,6 +21,7 @@ pub fn reject bool, T: Arbitrary>(g: &mut Gen, f: F) -> T { #[doc(hidden)] #[inline] +#[cfg(feature = "rand-no-std")] pub fn reject_rand bool, T>(g: &mut G, f: F) -> T where Standard: Distribution, diff --git a/src/geometry/isometry_construction.rs b/src/geometry/isometry_construction.rs index a64f8208..00138573 100644 --- a/src/geometry/isometry_construction.rs +++ b/src/geometry/isometry_construction.rs @@ -4,10 +4,12 @@ use crate::base::storage::Owned; use quickcheck::{Arbitrary, Gen}; use num::One; -use rand::distributions::{Distribution, Standard}; -use rand::Rng; +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, Standard}, + Rng, +}; -use simba::scalar::RealField; use simba::simd::SimdRealField; use crate::base::allocator::Allocator; @@ -80,7 +82,8 @@ where } } -impl Distribution> for Standard +#[cfg(feature = "rand-no-std")] +impl Distribution> for Standard where R: AbstractRotation, Standard: Distribution + Distribution, diff --git a/src/geometry/orthographic.rs b/src/geometry/orthographic.rs index bf85a198..7b137641 100644 --- a/src/geometry/orthographic.rs +++ b/src/geometry/orthographic.rs @@ -1,7 +1,10 @@ #[cfg(feature = "arbitrary")] use quickcheck::{Arbitrary, Gen}; -use rand::distributions::{Distribution, Standard}; -use rand::Rng; +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, Standard}, + Rng, +}; #[cfg(feature = "serde-serialize")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::fmt; @@ -10,7 +13,6 @@ use std::mem; use simba::scalar::RealField; use crate::base::dimension::U3; -use crate::base::helper; use crate::base::storage::Storage; use crate::base::{Matrix4, Vector, Vector3}; @@ -684,11 +686,13 @@ impl Orthographic3 { } } +#[cfg(feature = "rand-no-std")] impl Distribution> for Standard where Standard: Distribution, { fn sample(&self, r: &mut R) -> Orthographic3 { + use crate::base::helper; let left = r.gen(); let right = helper::reject_rand(r, |x: &N| *x > left); let bottom = r.gen(); @@ -706,6 +710,7 @@ where Matrix4: Send, { fn arbitrary(g: &mut Gen) -> Self { + use crate::base::helper; let left = Arbitrary::arbitrary(g); let right = helper::reject(g, |x: &N| *x > left); let bottom = Arbitrary::arbitrary(g); diff --git a/src/geometry/perspective.rs b/src/geometry/perspective.rs index 066ca57a..69233952 100644 --- a/src/geometry/perspective.rs +++ b/src/geometry/perspective.rs @@ -1,7 +1,10 @@ #[cfg(feature = "arbitrary")] use quickcheck::{Arbitrary, Gen}; -use rand::distributions::{Distribution, Standard}; -use rand::Rng; +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, Standard}, + Rng, +}; #[cfg(feature = "serde-serialize")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -11,7 +14,6 @@ use std::mem; use simba::scalar::RealField; use crate::base::dimension::U3; -use crate::base::helper; use crate::base::storage::Storage; use crate::base::{Matrix4, Scalar, Vector, Vector3}; @@ -268,11 +270,13 @@ impl Perspective3 { } } +#[cfg(feature = "rand-no-std")] impl Distribution> for Standard where Standard: Distribution, { fn sample<'a, R: Rng + ?Sized>(&self, r: &'a mut R) -> Perspective3 { + use crate::base::helper; let znear = r.gen(); let zfar = helper::reject_rand(r, |&x: &N| !(x - znear).is_zero()); let aspect = helper::reject_rand(r, |&x: &N| !x.is_zero()); @@ -284,6 +288,7 @@ where #[cfg(feature = "arbitrary")] impl Arbitrary for Perspective3 { fn arbitrary(g: &mut Gen) -> Self { + use crate::base::helper; let znear = Arbitrary::arbitrary(g); let zfar = helper::reject(g, |&x: &N| !(x - znear).is_zero()); let aspect = helper::reject(g, |&x: &N| !x.is_zero()); diff --git a/src/geometry/point_construction.rs b/src/geometry/point_construction.rs index e132304b..26ee8a8c 100644 --- a/src/geometry/point_construction.rs +++ b/src/geometry/point_construction.rs @@ -2,8 +2,11 @@ use quickcheck::{Arbitrary, Gen}; use num::{Bounded, One, Zero}; -use rand::distributions::{Distribution, Standard}; -use rand::Rng; +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, Standard}, + Rng, +}; use crate::base::allocator::Allocator; use crate::base::dimension::{DimName, DimNameAdd, DimNameSum, U1}; @@ -138,6 +141,7 @@ where } } +#[cfg(feature = "rand-no-std")] impl Distribution> for Standard where DefaultAllocator: Allocator, diff --git a/src/geometry/quaternion_construction.rs b/src/geometry/quaternion_construction.rs index ec46b68b..6b40fe49 100644 --- a/src/geometry/quaternion_construction.rs +++ b/src/geometry/quaternion_construction.rs @@ -5,9 +5,13 @@ use crate::base::storage::Owned; #[cfg(feature = "arbitrary")] use quickcheck::{Arbitrary, Gen}; +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, OpenClosed01, Standard}, + Rng, +}; + use num::{One, Zero}; -use rand::distributions::{Distribution, OpenClosed01, Standard}; -use rand::Rng; use simba::scalar::RealField; use simba::simd::SimdBool; @@ -144,6 +148,7 @@ where } } +#[cfg(feature = "rand-no-std")] impl Distribution> for Standard where Standard: Distribution, @@ -812,6 +817,7 @@ where } } +#[cfg(feature = "rand-no-std")] impl Distribution> for Standard where N::Element: SimdRealField, diff --git a/src/geometry/rotation_specialization.rs b/src/geometry/rotation_specialization.rs index de87b40b..95e19da1 100644 --- a/src/geometry/rotation_specialization.rs +++ b/src/geometry/rotation_specialization.rs @@ -4,8 +4,13 @@ use crate::base::storage::Owned; use quickcheck::{Arbitrary, Gen}; use num::Zero; -use rand::distributions::{Distribution, OpenClosed01, Standard}; -use rand::Rng; + +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, OpenClosed01, Standard}, + Rng, +}; + use simba::scalar::RealField; use simba::simd::{SimdBool, SimdRealField}; use std::ops::Neg; @@ -256,6 +261,7 @@ impl Rotation2 { } } +#[cfg(feature = "rand-no-std")] impl Distribution> for Standard where N::Element: SimdRealField, @@ -912,6 +918,7 @@ impl Rotation3 { } } +#[cfg(feature = "rand-no-std")] impl Distribution> for Standard where N::Element: SimdRealField, diff --git a/src/geometry/similarity_construction.rs b/src/geometry/similarity_construction.rs index c228c5d0..c24e09b2 100644 --- a/src/geometry/similarity_construction.rs +++ b/src/geometry/similarity_construction.rs @@ -4,10 +4,12 @@ use crate::base::storage::Owned; use quickcheck::{Arbitrary, Gen}; use num::One; -use rand::distributions::{Distribution, Standard}; -use rand::Rng; +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, Standard}, + Rng, +}; -use simba::scalar::RealField; use simba::simd::SimdRealField; use crate::base::allocator::Allocator; @@ -59,7 +61,8 @@ where } } -impl Distribution> for Standard +#[cfg(feature = "rand-no-std")] +impl Distribution> for Standard where R: AbstractRotation, DefaultAllocator: Allocator, @@ -107,8 +110,8 @@ where #[cfg(feature = "arbitrary")] impl Arbitrary for Similarity where - N: RealField + Arbitrary + Send, - N::Element: RealField, + N: crate::RealField + Arbitrary + Send, + N::Element: crate::RealField, R: AbstractRotation + Arbitrary + Send, DefaultAllocator: Allocator, Owned: Send, diff --git a/src/geometry/translation_construction.rs b/src/geometry/translation_construction.rs index d9061ba0..3dd14a34 100644 --- a/src/geometry/translation_construction.rs +++ b/src/geometry/translation_construction.rs @@ -4,8 +4,11 @@ use crate::base::storage::Owned; use quickcheck::{Arbitrary, Gen}; use num::{One, Zero}; -use rand::distributions::{Distribution, Standard}; -use rand::Rng; +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, Standard}, + Rng, +}; use simba::scalar::ClosedAdd; @@ -49,6 +52,7 @@ where } } +#[cfg(feature = "rand-no-std")] impl Distribution> for Standard where DefaultAllocator: Allocator, diff --git a/src/geometry/unit_complex_construction.rs b/src/geometry/unit_complex_construction.rs index 114fea6e..21f56562 100644 --- a/src/geometry/unit_complex_construction.rs +++ b/src/geometry/unit_complex_construction.rs @@ -1,10 +1,14 @@ #[cfg(feature = "arbitrary")] use quickcheck::{Arbitrary, Gen}; +#[cfg(feature = "rand-no-std")] +use rand::{ + distributions::{Distribution, OpenClosed01, Standard}, + Rng, +}; + use num::One; use num_complex::Complex; -use rand::distributions::{Distribution, OpenClosed01, Standard}; -use rand::Rng; use crate::base::dimension::{U1, U2}; use crate::base::storage::Storage; @@ -377,6 +381,7 @@ where } } +#[cfg(feature = "rand-no-std")] impl Distribution> for Standard where N::Element: SimdRealField, diff --git a/src/lib.rs b/src/lib.rs index 5e23ab32..14314116 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -89,26 +89,16 @@ an optimized set of tools for computer graphics and physics. Those features incl #![cfg_attr(all(feature = "alloc", not(feature = "std")), feature(alloc))] #![cfg_attr(feature = "no_unsound_assume_init", allow(unreachable_code))] -#[cfg(feature = "arbitrary")] -extern crate quickcheck; - #[cfg(feature = "serde-serialize")] #[macro_use] extern crate serde; -#[cfg(feature = "abomonation-serialize")] -extern crate abomonation; - -#[cfg(feature = "mint")] -extern crate mint; +#[cfg(feature = "rand-no-std")] +extern crate rand_package as rand; #[macro_use] extern crate approx; -#[cfg(feature = "std")] -extern crate matrixmultiply; extern crate num_traits as num; -#[cfg(feature = "std")] -extern crate rand_distr; #[cfg(all(feature = "alloc", not(feature = "std")))] extern crate alloc;