Coverage Report

Created: 2026-11-03 08:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/ndarray-0.17.2/src/dimension/conversion.rs
Line
Count
Source
1
// Copyright 2014-2016 bluss and ndarray developers.
2
//
3
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6
// option. This file may not be copied, modified, or distributed
7
// except according to those terms.
8
9
//! Tuple to array conversion, IntoDimension, and related things
10
11
#[cfg(not(feature = "std"))]
12
use alloc::vec::Vec;
13
use num_traits::Zero;
14
use std::ops::{Index, IndexMut};
15
16
use crate::{Dim, Dimension, Ix, Ix1, IxDyn, IxDynImpl};
17
18
/// $m: macro callback
19
/// $m is called with $arg and then the indices corresponding to the size argument
20
macro_rules! index {
21
    ($m:ident $arg:tt 0) => ($m!($arg));
22
    ($m:ident $arg:tt 1) => ($m!($arg 0));
23
    ($m:ident $arg:tt 2) => ($m!($arg 0 1));
24
    ($m:ident $arg:tt 3) => ($m!($arg 0 1 2));
25
    ($m:ident $arg:tt 4) => ($m!($arg 0 1 2 3));
26
    ($m:ident $arg:tt 5) => ($m!($arg 0 1 2 3 4));
27
    ($m:ident $arg:tt 6) => ($m!($arg 0 1 2 3 4 5));
28
    ($m:ident $arg:tt 7) => ($m!($arg 0 1 2 3 4 5 6));
29
}
30
31
macro_rules! index_item {
32
    ($m:ident $arg:tt 0) => ();
33
    ($m:ident $arg:tt 1) => ($m!($arg 0););
34
    ($m:ident $arg:tt 2) => ($m!($arg 0 1););
35
    ($m:ident $arg:tt 3) => ($m!($arg 0 1 2););
36
    ($m:ident $arg:tt 4) => ($m!($arg 0 1 2 3););
37
    ($m:ident $arg:tt 5) => ($m!($arg 0 1 2 3 4););
38
    ($m:ident $arg:tt 6) => ($m!($arg 0 1 2 3 4 5););
39
    ($m:ident $arg:tt 7) => ($m!($arg 0 1 2 3 4 5 6););
40
}
41
42
/// Argument conversion a dimension.
43
pub trait IntoDimension
44
{
45
    /// The concrete type of the resultant dimension.
46
    type Dim: Dimension;
47
48
    /// Convert into a type that implements [`Dimension`].
49
    fn into_dimension(self) -> Self::Dim;
50
}
51
52
impl IntoDimension for Ix
53
{
54
    type Dim = Ix1;
55
    #[inline(always)]
56
0
    fn into_dimension(self) -> Ix1
57
    {
58
0
        Ix1(self)
59
0
    }
60
}
61
62
impl<D> IntoDimension for D
63
where D: Dimension
64
{
65
    type Dim = D;
66
    #[inline(always)]
67
0
    fn into_dimension(self) -> Self
68
    {
69
0
        self
70
0
    }
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 1]> as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <_ as ndarray::dimension::conversion::IntoDimension>::into_dimension
71
}
72
73
impl IntoDimension for IxDynImpl
74
{
75
    type Dim = IxDyn;
76
    #[inline(always)]
77
0
    fn into_dimension(self) -> Self::Dim
78
    {
79
0
        Dim::new(self)
80
0
    }
81
}
82
83
impl IntoDimension for Vec<Ix>
84
{
85
    type Dim = IxDyn;
86
    #[inline(always)]
87
0
    fn into_dimension(self) -> Self::Dim
88
    {
89
0
        Dim::new(IxDynImpl::from(self))
90
0
    }
91
}
92
93
pub trait Convert
94
{
95
    type To;
96
    fn convert(self) -> Self::To;
97
}
98
99
macro_rules! sub {
100
    ($_x:tt $y:tt) => {
101
        $y
102
    };
103
}
104
105
macro_rules! tuple_type {
106
    ([$T:ident] $($index:tt)*) => (
107
        ( $(sub!($index $T), )* )
108
    );
109
}
110
111
macro_rules! tuple_expr {
112
    ([$self_:expr] $($index:tt)*) => (
113
        ( $($self_[$index], )* )
114
    );
115
}
116
117
macro_rules! array_expr {
118
    ([$self_:expr] $($index:tt)*) => (
119
        [$($self_ . $index, )*]
120
    );
121
}
122
123
macro_rules! array_zero {
124
    ([] $($index:tt)*) => (
125
        [$(sub!($index 0), )*]
126
    );
127
}
128
129
macro_rules! tuple_to_array {
130
    ([] $($n:tt)*) => {
131
        $(
132
        impl Convert for [Ix; $n] {
133
            type To = index!(tuple_type [Ix] $n);
134
            #[inline]
135
0
            fn convert(self) -> Self::To {
136
0
                index!(tuple_expr [self] $n)
137
0
            }
Unexecuted instantiation: <[usize; 0] as ndarray::dimension::conversion::Convert>::convert
Unexecuted instantiation: <[usize; 1] as ndarray::dimension::conversion::Convert>::convert
Unexecuted instantiation: <[usize; 6] as ndarray::dimension::conversion::Convert>::convert
Unexecuted instantiation: <[usize; 2] as ndarray::dimension::conversion::Convert>::convert
Unexecuted instantiation: <[usize; 3] as ndarray::dimension::conversion::Convert>::convert
Unexecuted instantiation: <[usize; 4] as ndarray::dimension::conversion::Convert>::convert
Unexecuted instantiation: <[usize; 5] as ndarray::dimension::conversion::Convert>::convert
138
        }
139
140
        impl IntoDimension for [Ix; $n] {
141
            type Dim = Dim<[Ix; $n]>;
142
            #[inline(always)]
143
0
            fn into_dimension(self) -> Self::Dim {
144
0
                Dim::new(self)
145
0
            }
Unexecuted instantiation: <[usize; 1] as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <[usize; 0] as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <[usize; 6] as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <[usize; 2] as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <[usize; 3] as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <[usize; 4] as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <[usize; 5] as ndarray::dimension::conversion::IntoDimension>::into_dimension
146
        }
147
148
        impl IntoDimension for index!(tuple_type [Ix] $n) {
149
            type Dim = Dim<[Ix; $n]>;
150
            #[inline(always)]
151
0
            fn into_dimension(self) -> Self::Dim {
152
0
                Dim::new(index!(array_expr [self] $n))
153
0
            }
Unexecuted instantiation: <() as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <(usize, usize, usize, usize, usize, usize) as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <(usize,) as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <(usize, usize) as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <(usize, usize, usize) as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <(usize, usize, usize, usize) as ndarray::dimension::conversion::IntoDimension>::into_dimension
Unexecuted instantiation: <(usize, usize, usize, usize, usize) as ndarray::dimension::conversion::IntoDimension>::into_dimension
154
        }
155
156
        impl Index<usize> for Dim<[Ix; $n]> {
157
            type Output = usize;
158
            #[inline(always)]
159
0
            fn index(&self, index: usize) -> &Self::Output {
160
0
                &self.ix()[index]
161
0
            }
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 1]> as core::ops::index::Index<usize>>::index
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 0]> as core::ops::index::Index<usize>>::index
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 6]> as core::ops::index::Index<usize>>::index
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 2]> as core::ops::index::Index<usize>>::index
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 3]> as core::ops::index::Index<usize>>::index
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 4]> as core::ops::index::Index<usize>>::index
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 5]> as core::ops::index::Index<usize>>::index
162
        }
163
164
        impl IndexMut<usize> for Dim<[Ix; $n]> {
165
            #[inline(always)]
166
0
            fn index_mut(&mut self, index: usize) -> &mut Self::Output {
167
0
                &mut self.ixm()[index]
168
0
            }
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 1]> as core::ops::index::IndexMut<usize>>::index_mut
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 0]> as core::ops::index::IndexMut<usize>>::index_mut
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 5]> as core::ops::index::IndexMut<usize>>::index_mut
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 6]> as core::ops::index::IndexMut<usize>>::index_mut
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 2]> as core::ops::index::IndexMut<usize>>::index_mut
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 3]> as core::ops::index::IndexMut<usize>>::index_mut
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 4]> as core::ops::index::IndexMut<usize>>::index_mut
169
        }
170
171
        impl Zero for Dim<[Ix; $n]> {
172
            #[inline]
173
0
            fn zero() -> Self {
174
0
                Dim::new(index!(array_zero [] $n))
175
0
            }
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 0]> as num_traits::identities::Zero>::zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 5]> as num_traits::identities::Zero>::zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 6]> as num_traits::identities::Zero>::zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 1]> as num_traits::identities::Zero>::zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 2]> as num_traits::identities::Zero>::zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 3]> as num_traits::identities::Zero>::zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 4]> as num_traits::identities::Zero>::zero
176
0
            fn is_zero(&self) -> bool {
177
0
                self.slice().iter().all(|x| *x == 0)
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 0]> as num_traits::identities::Zero>::is_zero::{closure#0}
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 5]> as num_traits::identities::Zero>::is_zero::{closure#0}
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 6]> as num_traits::identities::Zero>::is_zero::{closure#0}
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 1]> as num_traits::identities::Zero>::is_zero::{closure#0}
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 2]> as num_traits::identities::Zero>::is_zero::{closure#0}
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 3]> as num_traits::identities::Zero>::is_zero::{closure#0}
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 4]> as num_traits::identities::Zero>::is_zero::{closure#0}
178
0
            }
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 0]> as num_traits::identities::Zero>::is_zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 5]> as num_traits::identities::Zero>::is_zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 6]> as num_traits::identities::Zero>::is_zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 1]> as num_traits::identities::Zero>::is_zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 2]> as num_traits::identities::Zero>::is_zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 3]> as num_traits::identities::Zero>::is_zero
Unexecuted instantiation: <ndarray::dimension::dim::Dim<[usize; 4]> as num_traits::identities::Zero>::is_zero
179
        }
180
181
        )*
182
    };
183
}
184
185
index_item!(tuple_to_array [] 7);