Skip to content

Commit c3bf89a

Browse files
committed
unbreak on older Rust
1 parent c0a4c48 commit c3bf89a

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

build.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ fn main() {
88
} else if env::var_os("CARGO_FEATURE_I128").is_some() {
99
panic!("i128 support was not detected!");
1010
}
11+
12+
if probe("#[derive(Clone)] struct A; fn main() { let _ = [A; 2].clone(); }") {
13+
println!("cargo:rustc-cfg=array_clone");
14+
}
1115
}
1216

1317
/// Test if a code snippet can be compiled

src/lib.rs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,18 @@ pub trait Integer: Sized + Num + PartialOrd + Ord + Eq {
119119
/// # Examples
120120
///
121121
/// ~~~
122+
/// # extern crate num_integer;
122123
/// # extern crate num_traits;
124+
/// # fn main() {
123125
/// # use num_integer::{ExtendedGcd, Integer};
124126
/// # use num_traits::NumAssign;
125-
/// fn check<A: Clone + Integer + NumAssign>(a: A, b: A) -> bool {
126-
/// let ExtendedGcd { gcd, coeffs: [x, y], .. } = a.extended_gcd(&b);
127-
/// gcd == x * a + y * b
127+
/// fn check<A: Copy + Integer + NumAssign>(a: A, b: A) -> bool {
128+
/// let ExtendedGcd { gcd, coeffs, .. } = a.extended_gcd(&b);
129+
/// gcd == coeffs[0] * a + coeffs[1] * b
128130
/// }
129131
/// assert!(check(10isize, 4isize));
130132
/// assert!(check(8isize, 9isize));
133+
/// # }
131134
/// ~~~
132135
#[inline]
133136
fn extended_gcd(&self, other: &Self) -> ExtendedGcd<Self>
@@ -238,13 +241,20 @@ pub trait Integer: Sized + Num + PartialOrd + Ord + Eq {
238241
}
239242

240243
/// Greatest common divisor and Bézout coefficients
241-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
244+
#[derive(Debug, Copy, PartialEq, Eq)]
245+
#[cfg_attr(array_clone, derive(Clone))]
242246
pub struct ExtendedGcd<A> {
243247
pub gcd: A,
244248
pub coeffs: [A; 2],
245249
_hidden: (),
246250
}
247251

252+
#[cfg(not(array_clone))]
253+
impl<A: Copy> Clone for ExtendedGcd<A> {
254+
#[inline]
255+
fn clone(&self) -> Self { *self }
256+
}
257+
248258
/// Simultaneous integer division and modulus
249259
#[inline]
250260
pub fn div_rem<T: Integer>(x: T, y: T) -> (T, T) {
@@ -585,9 +595,8 @@ macro_rules! impl_integer_for_isize {
585595
#[test]
586596
fn test_gcd_lcm() {
587597
use core::iter::once;
588-
let r = once(0).chain((1..).take(127).flat_map(|a| once(a).chain(once(-a)))).chain(once(-128));
589-
for i in r.clone() {
590-
for j in r.clone() {
598+
for i in once(0).chain((1..).take(127).flat_map(|a| once(a).chain(once(-a)))).chain(once(-128)) {
599+
for j in once(0).chain((1..).take(127).flat_map(|a| once(a).chain(once(-a)))).chain(once(-128)) {
591600
assert_eq!(i.gcd_lcm(&j), (i.gcd(&j), i.lcm(&j)));
592601
}
593602
}
@@ -598,15 +607,14 @@ macro_rules! impl_integer_for_isize {
598607
use ExtendedGcd;
599608
use traits::NumAssign;
600609

601-
fn check<A: Clone + Integer + NumAssign>(a: A, b: A) -> bool {
602-
let ExtendedGcd { gcd, coeffs: [x, y], .. } = a.extended_gcd(&b);
603-
gcd == x * a + y * b
610+
fn check<A: Copy + Integer + NumAssign>(a: A, b: A) -> bool {
611+
let ExtendedGcd { gcd, coeffs, .. } = a.extended_gcd(&b);
612+
gcd == coeffs[0] * a + coeffs[1] * b
604613
}
605614

606615
use core::iter::once;
607-
let r = once(0).chain((1..).take(127).flat_map(|a| once(a).chain(once(-a)))).chain(once(-128));
608-
for i in r.clone() {
609-
for j in r.clone() {
616+
for i in once(0).chain((1..).take(127).flat_map(|a| once(a).chain(once(-a)))).chain(once(-128)) {
617+
for j in once(0).chain((1..).take(127).flat_map(|a| once(a).chain(once(-a)))).chain(once(-128)) {
610618
check(i, j);
611619
let (ExtendedGcd { gcd, .. }, lcm) = i.extended_gcd_lcm(&j);
612620
assert_eq!((gcd, lcm), (i.gcd(&j), i.lcm(&j)));

0 commit comments

Comments
 (0)