Skip to content

Commit bd3aa27

Browse files
authored
Merge pull request #1092 from adamreichold/more-clippy-lints
Expand Clippy coverage to docs features and resolve more lints
2 parents 72e6798 + b02a7cb commit bd3aa27

File tree

11 files changed

+117
-120
lines changed

11 files changed

+117
-120
lines changed

.github/workflows/ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,5 @@ jobs:
7575
toolchain: ${{ matrix.rust }}
7676
override: true
7777
components: clippy
78-
- run: cargo clippy
78+
- run: cargo clippy --features docs
7979

src/array_serde.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -276,17 +276,17 @@ where
276276

277277
let _v = match v {
278278
Some(v) => v,
279-
None => Err(de::Error::missing_field("v"))?,
279+
None => return Err(de::Error::missing_field("v")),
280280
};
281281

282282
let data = match data {
283283
Some(data) => data,
284-
None => Err(de::Error::missing_field("data"))?,
284+
None => return Err(de::Error::missing_field("data")),
285285
};
286286

287287
let dim = match dim {
288288
Some(dim) => dim,
289-
None => Err(de::Error::missing_field("dim"))?,
289+
None => return Err(de::Error::missing_field("dim")),
290290
};
291291

292292
if let Ok(array) = ArrayBase::from_shape_vec(dim, data) {

src/data_traits.rs

+7
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use crate::{ArrayBase, CowRepr, Dimension, OwnedArcRepr, OwnedRepr, RawViewRepr,
2727
/// ***Note:*** `RawData` is not an extension interface at this point.
2828
/// Traits in Rust can serve many different roles. This trait is public because
2929
/// it is used as a bound on public methods.
30+
#[allow(clippy::missing_safety_doc)] // not implementable downstream
3031
pub unsafe trait RawData: Sized {
3132
/// The array element type.
3233
type Elem;
@@ -47,6 +48,7 @@ pub unsafe trait RawData: Sized {
4748
/// For an array with writable elements.
4849
///
4950
/// ***Internal trait, see `RawData`.***
51+
#[allow(clippy::missing_safety_doc)] // not implementable downstream
5052
pub unsafe trait RawDataMut: RawData {
5153
/// If possible, ensures that the array has unique access to its data.
5254
///
@@ -74,6 +76,7 @@ pub unsafe trait RawDataMut: RawData {
7476
/// An array representation that can be cloned.
7577
///
7678
/// ***Internal trait, see `RawData`.***
79+
#[allow(clippy::missing_safety_doc)] // not implementable downstream
7780
pub unsafe trait RawDataClone: RawData {
7881
#[doc(hidden)]
7982
/// Unsafe because, `ptr` must point inside the current storage.
@@ -96,6 +99,7 @@ pub unsafe trait RawDataClone: RawData {
9699
/// For an array with elements that can be accessed with safe code.
97100
///
98101
/// ***Internal trait, see `RawData`.***
102+
#[allow(clippy::missing_safety_doc)] // not implementable downstream
99103
pub unsafe trait Data: RawData {
100104
/// Converts the array to a uniquely owned array, cloning elements if necessary.
101105
#[doc(hidden)]
@@ -131,6 +135,7 @@ pub unsafe trait Data: RawData {
131135
// `RawDataMut::try_ensure_unique` implementation always panics or ensures that
132136
// the data is unique. You are also guaranteeing that `try_is_unique` always
133137
// returns `Some(_)`.
138+
#[allow(clippy::missing_safety_doc)] // not implementable downstream
134139
pub unsafe trait DataMut: Data + RawDataMut {
135140
/// Ensures that the array has unique access to its data.
136141
#[doc(hidden)]
@@ -449,6 +454,7 @@ unsafe impl<'a, A> DataMut for ViewRepr<&'a mut A> {}
449454
// The array storage must be initially mutable - copy on write arrays may require copying for
450455
// unsharing storage before mutating it. The initially allocated storage must be mutable so
451456
// that it can be mutated directly - through .raw_view_mut_unchecked() - for initialization.
457+
#[allow(clippy::missing_safety_doc)] // not implementable downstream
452458
pub unsafe trait DataOwned: Data {
453459
/// Corresponding owned data with MaybeUninit elements
454460
type MaybeUninit: DataOwned<Elem = MaybeUninit<Self::Elem>>
@@ -467,6 +473,7 @@ pub unsafe trait DataOwned: Data {
467473
/// A representation that is a lightweight view.
468474
///
469475
/// ***Internal trait, see `Data`.***
476+
#[allow(clippy::missing_safety_doc)] // not implementable downstream
470477
pub unsafe trait DataShared: Clone + Data + RawDataClone {}
471478

472479
unsafe impl<A> DataShared for OwnedArcRepr<A> {}

src/dimension/ndindex.rs

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use crate::{
1818
/// a[[1, 1]] += 1;
1919
/// assert_eq!(a[(1, 1)], 4);
2020
/// ```
21+
#[allow(clippy::missing_safety_doc)] // TODO: Add doc
2122
pub unsafe trait NdIndex<E>: Debug {
2223
#[doc(hidden)]
2324
fn index_checked(&self, dim: &E, strides: &E) -> Option<isize>;

src/doc/ndarray_for_numpy_users/coord_transform.rs

+63-67
Original file line numberDiff line numberDiff line change
@@ -51,40 +51,38 @@
5151
//! ```
5252
//! use ndarray::prelude::*;
5353
//!
54-
//! fn main() {
55-
//! let nelems = 4;
56-
//! let bunge = Array::ones((3, nelems));
57-
//!
58-
//! let s1 = bunge.slice(s![0, ..]).mapv(f64::sin);
59-
//! let c1 = bunge.slice(s![0, ..]).mapv(f64::cos);
60-
//! let s2 = bunge.slice(s![1, ..]).mapv(f64::sin);
61-
//! let c2 = bunge.slice(s![1, ..]).mapv(f64::cos);
62-
//! let s3 = bunge.slice(s![2, ..]).mapv(f64::sin);
63-
//! let c3 = bunge.slice(s![2, ..]).mapv(f64::cos);
64-
//!
65-
//! let mut rmat = Array::zeros((3, 3, nelems).f());
66-
//! for i in 0..nelems {
67-
//! rmat[[0, 0, i]] = c1[i] * c3[i] - s1[i] * s3[i] * c2[i];
68-
//! rmat[[0, 1, i]] = -c1[i] * s3[i] - s1[i] * c2[i] * c3[i];
69-
//! rmat[[0, 2, i]] = s1[i] * s2[i];
70-
//!
71-
//! rmat[[1, 0, i]] = s1[i] * c3[i] + c1[i] * c2[i] * s3[i];
72-
//! rmat[[1, 1, i]] = -s1[i] * s3[i] + c1[i] * c2[i] * c3[i];
73-
//! rmat[[1, 2, i]] = -c1[i] * s2[i];
74-
//!
75-
//! rmat[[2, 0, i]] = s2[i] * s3[i];
76-
//! rmat[[2, 1, i]] = s2[i] * c3[i];
77-
//! rmat[[2, 2, i]] = c2[i];
78-
//! }
79-
//!
80-
//! let eye2d = Array::eye(3);
81-
//!
82-
//! let mut rotated = Array::zeros((3, 3, nelems).f());
83-
//! for i in 0..nelems {
84-
//! rotated
85-
//! .slice_mut(s![.., .., i])
86-
//! .assign(&rmat.slice(s![.., .., i]).dot(&eye2d));
87-
//! }
54+
//! let nelems = 4;
55+
//! let bunge = Array::ones((3, nelems));
56+
//!
57+
//! let s1 = bunge.slice(s![0, ..]).mapv(f64::sin);
58+
//! let c1 = bunge.slice(s![0, ..]).mapv(f64::cos);
59+
//! let s2 = bunge.slice(s![1, ..]).mapv(f64::sin);
60+
//! let c2 = bunge.slice(s![1, ..]).mapv(f64::cos);
61+
//! let s3 = bunge.slice(s![2, ..]).mapv(f64::sin);
62+
//! let c3 = bunge.slice(s![2, ..]).mapv(f64::cos);
63+
//!
64+
//! let mut rmat = Array::zeros((3, 3, nelems).f());
65+
//! for i in 0..nelems {
66+
//! rmat[[0, 0, i]] = c1[i] * c3[i] - s1[i] * s3[i] * c2[i];
67+
//! rmat[[0, 1, i]] = -c1[i] * s3[i] - s1[i] * c2[i] * c3[i];
68+
//! rmat[[0, 2, i]] = s1[i] * s2[i];
69+
//!
70+
//! rmat[[1, 0, i]] = s1[i] * c3[i] + c1[i] * c2[i] * s3[i];
71+
//! rmat[[1, 1, i]] = -s1[i] * s3[i] + c1[i] * c2[i] * c3[i];
72+
//! rmat[[1, 2, i]] = -c1[i] * s2[i];
73+
//!
74+
//! rmat[[2, 0, i]] = s2[i] * s3[i];
75+
//! rmat[[2, 1, i]] = s2[i] * c3[i];
76+
//! rmat[[2, 2, i]] = c2[i];
77+
//! }
78+
//!
79+
//! let eye2d = Array::eye(3);
80+
//!
81+
//! let mut rotated = Array::zeros((3, 3, nelems).f());
82+
//! for i in 0..nelems {
83+
//! rotated
84+
//! .slice_mut(s![.., .., i])
85+
//! .assign(&rmat.slice(s![.., .., i]).dot(&eye2d));
8886
//! }
8987
//! ```
9088
//!
@@ -96,37 +94,35 @@
9694
//! ```
9795
//! use ndarray::prelude::*;
9896
//!
99-
//! fn main() {
100-
//! let nelems = 4;
101-
//! let bunge = Array2::<f64>::ones((3, nelems));
102-
//!
103-
//! let mut rmat = Array::zeros((3, 3, nelems).f());
104-
//! azip!((mut rmat in rmat.axis_iter_mut(Axis(2)), bunge in bunge.axis_iter(Axis(1))) {
105-
//! let s1 = bunge[0].sin();
106-
//! let c1 = bunge[0].cos();
107-
//! let s2 = bunge[1].sin();
108-
//! let c2 = bunge[1].cos();
109-
//! let s3 = bunge[2].sin();
110-
//! let c3 = bunge[2].cos();
111-
//!
112-
//! rmat[[0, 0]] = c1 * c3 - s1 * s3 * c2;
113-
//! rmat[[0, 1]] = -c1 * s3 - s1 * c2 * c3;
114-
//! rmat[[0, 2]] = s1 * s2;
115-
//!
116-
//! rmat[[1, 0]] = s1 * c3 + c1 * c2 * s3;
117-
//! rmat[[1, 1]] = -s1 * s3 + c1 * c2 * c3;
118-
//! rmat[[1, 2]] = -c1 * s2;
119-
//!
120-
//! rmat[[2, 0]] = s2 * s3;
121-
//! rmat[[2, 1]] = s2 * c3;
122-
//! rmat[[2, 2]] = c2;
123-
//! });
124-
//!
125-
//! let eye2d = Array2::<f64>::eye(3);
126-
//!
127-
//! let mut rotated = Array3::<f64>::zeros((3, 3, nelems).f());
128-
//! azip!((mut rotated in rotated.axis_iter_mut(Axis(2)), rmat in rmat.axis_iter(Axis(2))) {
129-
//! rotated.assign(&rmat.dot(&eye2d));
130-
//! });
131-
//! }
97+
//! let nelems = 4;
98+
//! let bunge = Array2::<f64>::ones((3, nelems));
99+
//!
100+
//! let mut rmat = Array::zeros((3, 3, nelems).f());
101+
//! azip!((mut rmat in rmat.axis_iter_mut(Axis(2)), bunge in bunge.axis_iter(Axis(1))) {
102+
//! let s1 = bunge[0].sin();
103+
//! let c1 = bunge[0].cos();
104+
//! let s2 = bunge[1].sin();
105+
//! let c2 = bunge[1].cos();
106+
//! let s3 = bunge[2].sin();
107+
//! let c3 = bunge[2].cos();
108+
//!
109+
//! rmat[[0, 0]] = c1 * c3 - s1 * s3 * c2;
110+
//! rmat[[0, 1]] = -c1 * s3 - s1 * c2 * c3;
111+
//! rmat[[0, 2]] = s1 * s2;
112+
//!
113+
//! rmat[[1, 0]] = s1 * c3 + c1 * c2 * s3;
114+
//! rmat[[1, 1]] = -s1 * s3 + c1 * c2 * c3;
115+
//! rmat[[1, 2]] = -c1 * s2;
116+
//!
117+
//! rmat[[2, 0]] = s2 * s3;
118+
//! rmat[[2, 1]] = s2 * c3;
119+
//! rmat[[2, 2]] = c2;
120+
//! });
121+
//!
122+
//! let eye2d = Array2::<f64>::eye(3);
123+
//!
124+
//! let mut rotated = Array3::<f64>::zeros((3, 3, nelems).f());
125+
//! azip!((mut rotated in rotated.axis_iter_mut(Axis(2)), rmat in rmat.axis_iter(Axis(2))) {
126+
//! rotated.assign(&rmat.dot(&eye2d));
127+
//! });
132128
//! ```

src/free_functions.rs

+1
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ pub fn aview_mut2<A, V: FixedInitializer<Elem = A>>(xs: &mut [V]) -> ArrayViewMu
169169
}
170170

171171
/// Fixed-size array used for array initialization
172+
#[allow(clippy::missing_safety_doc)] // Should not be implemented downstream and to be deprecated.
172173
pub unsafe trait FixedInitializer {
173174
type Elem;
174175
fn as_init_slice(&self) -> &[Self::Elem];

src/iterators/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1445,6 +1445,7 @@ send_sync_read_write!(ElementsBaseMut);
14451445
///
14461446
/// The iterator must produce exactly the number of elements it reported or
14471447
/// diverge before reaching the end.
1448+
#[allow(clippy::missing_safety_doc)] // not nameable downstream
14481449
pub unsafe trait TrustedIterator {}
14491450

14501451
use crate::indexes::IndicesIterF;

src/parallel/mod.rs

+31-39
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,14 @@
4646
//! use ndarray::Array2;
4747
//! use ndarray::parallel::prelude::*;
4848
//!
49-
//! fn main() {
50-
//! let mut a = Array2::<f64>::zeros((128, 128));
49+
//! let mut a = Array2::<f64>::zeros((128, 128));
5150
//!
52-
//! // Parallel versions of regular array methods
53-
//! a.par_map_inplace(|x| *x = x.exp());
54-
//! a.par_mapv_inplace(f64::exp);
51+
//! // Parallel versions of regular array methods
52+
//! a.par_map_inplace(|x| *x = x.exp());
53+
//! a.par_mapv_inplace(f64::exp);
5554
//!
56-
//! // You can also use the parallel iterator directly
57-
//! a.par_iter_mut().for_each(|x| *x = x.exp());
58-
//! }
55+
//! // You can also use the parallel iterator directly
56+
//! a.par_iter_mut().for_each(|x| *x = x.exp());
5957
//! ```
6058
//!
6159
//! ## Axis iterators
@@ -67,16 +65,14 @@
6765
//! use ndarray::Axis;
6866
//! use ndarray::parallel::prelude::*;
6967
//!
70-
//! fn main() {
71-
//! let a = Array::linspace(0., 63., 64).into_shape((4, 16)).unwrap();
72-
//! let mut sums = Vec::new();
73-
//! a.axis_iter(Axis(0))
74-
//! .into_par_iter()
75-
//! .map(|row| row.sum())
76-
//! .collect_into_vec(&mut sums);
68+
//! let a = Array::linspace(0., 63., 64).into_shape((4, 16)).unwrap();
69+
//! let mut sums = Vec::new();
70+
//! a.axis_iter(Axis(0))
71+
//! .into_par_iter()
72+
//! .map(|row| row.sum())
73+
//! .collect_into_vec(&mut sums);
7774
//!
78-
//! assert_eq!(sums, [120., 376., 632., 888.]);
79-
//! }
75+
//! assert_eq!(sums, [120., 376., 632., 888.]);
8076
//! ```
8177
//!
8278
//! ## Axis chunks iterators
@@ -88,16 +84,14 @@
8884
//! use ndarray::Axis;
8985
//! use ndarray::parallel::prelude::*;
9086
//!
91-
//! fn main() {
92-
//! let a = Array::linspace(0., 63., 64).into_shape((4, 16)).unwrap();
93-
//! let mut shapes = Vec::new();
94-
//! a.axis_chunks_iter(Axis(0), 3)
95-
//! .into_par_iter()
96-
//! .map(|chunk| chunk.shape().to_owned())
97-
//! .collect_into_vec(&mut shapes);
87+
//! let a = Array::linspace(0., 63., 64).into_shape((4, 16)).unwrap();
88+
//! let mut shapes = Vec::new();
89+
//! a.axis_chunks_iter(Axis(0), 3)
90+
//! .into_par_iter()
91+
//! .map(|chunk| chunk.shape().to_owned())
92+
//! .collect_into_vec(&mut shapes);
9893
//!
99-
//! assert_eq!(shapes, [vec![3, 16], vec![1, 16]]);
100-
//! }
94+
//! assert_eq!(shapes, [vec![3, 16], vec![1, 16]]);
10195
//! ```
10296
//!
10397
//! ## Zip
@@ -110,19 +104,17 @@
110104
//!
111105
//! type Array3f64 = Array3<f64>;
112106
//!
113-
//! fn main() {
114-
//! const N: usize = 128;
115-
//! let a = Array3f64::from_elem((N, N, N), 1.);
116-
//! let b = Array3f64::from_elem(a.dim(), 2.);
117-
//! let mut c = Array3f64::zeros(a.dim());
118-
//!
119-
//! Zip::from(&mut c)
120-
//! .and(&a)
121-
//! .and(&b)
122-
//! .par_for_each(|c, &a, &b| {
123-
//! *c += a - b;
124-
//! });
125-
//! }
107+
//! const N: usize = 128;
108+
//! let a = Array3f64::from_elem((N, N, N), 1.);
109+
//! let b = Array3f64::from_elem(a.dim(), 2.);
110+
//! let mut c = Array3f64::zeros(a.dim());
111+
//!
112+
//! Zip::from(&mut c)
113+
//! .and(&a)
114+
//! .and(&b)
115+
//! .par_for_each(|c, &a, &b| {
116+
//! *c += a - b;
117+
//! });
126118
//! ```
127119
128120
#[allow(unused_imports)] // used by rustdoc links

src/parallel/zipmacro.rs

+7-9
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,16 @@
3939
///
4040
/// type M = Array2<f32>;
4141
///
42-
/// fn main() {
43-
/// let mut a = M::zeros((16, 16));
44-
/// let b = M::from_elem(a.dim(), 1.);
45-
/// let c = M::from_elem(a.dim(), 2.);
42+
/// let mut a = M::zeros((16, 16));
43+
/// let b = M::from_elem(a.dim(), 1.);
44+
/// let c = M::from_elem(a.dim(), 2.);
4645
///
47-
/// // Compute a simple ternary operation:
48-
/// // elementwise addition of b and c, stored in a
46+
/// // Compute a simple ternary operation:
47+
/// // elementwise addition of b and c, stored in a
4948
///
50-
/// par_azip!((a in &mut a, &b in &b, &c in &c) *a = b + c);
49+
/// par_azip!((a in &mut a, &b in &b, &c in &c) *a = b + c);
5150
///
52-
/// assert_eq!(a, &b + &c);
53-
/// }
51+
/// assert_eq!(a, &b + &c);
5452
/// ```
5553
macro_rules! par_azip {
5654
($($t:tt)*) => {

src/partial.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ impl<T> Partial<T> {
3838

3939
#[cfg(feature = "rayon")]
4040
pub(crate) fn stub() -> Self {
41-
Self { len: 0, ptr: 0 as *mut _ }
41+
Self { len: 0, ptr: ptr::null_mut() }
4242
}
4343

4444
#[cfg(feature = "rayon")]

src/slice.rs

+1
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ impl From<NewAxis> for SliceInfoElem {
295295
/// that `D`, `Self::OutDim`, `self.in_dim()`, and `self.out_ndim()` are
296296
/// consistent with the `&[SliceInfoElem]` returned by `self.as_ref()` and that
297297
/// `self.as_ref()` always returns the same value when called multiple times.
298+
#[allow(clippy::missing_safety_doc)] // not implementable downstream
298299
pub unsafe trait SliceArg<D: Dimension>: AsRef<[SliceInfoElem]> {
299300
/// Dimensionality of the output array.
300301
type OutDim: Dimension;

0 commit comments

Comments
 (0)