6
6
// option. This file may not be copied, modified, or distributed
7
7
// except according to those terms.
8
8
use std:: fmt;
9
- use std:: slice:: Iter ;
10
9
use super :: {
11
10
ArrayBase ,
12
11
Data ,
@@ -16,63 +15,8 @@ use super::{
16
15
} ;
17
16
use crate :: dimension:: IntoDimension ;
18
17
19
- #[ derive( Debug , PartialEq ) ]
20
- enum ArrayDisplayMode {
21
- // Array is small enough to be printed without omitting any values.
22
- Full ,
23
- // Omit central values of the nth axis.
24
- OmitV ,
25
- // Omit central values of certain axes (but not the last one).
26
- // Vector is guaranteed to be non-empty.
27
- OmitH ( Vec < Ix > ) ,
28
- // Both `OmitV` and `OmitH` hold.
29
- OmitBoth ( Vec < Ix > ) ,
30
- }
31
-
32
18
const PRINT_ELEMENTS_LIMIT : Ix = 2 ;
33
19
34
- impl ArrayDisplayMode {
35
-
36
- fn from_shape ( shape : & [ Ix ] , limit : Ix ) -> ArrayDisplayMode {
37
- let last_dim = match shape. len ( ) . checked_sub ( 1 ) {
38
- Some ( v) => v,
39
- None => {
40
- return ArrayDisplayMode :: Full ;
41
- }
42
- } ;
43
-
44
- let last_axis_ovf = shape[ last_dim] >= 2 * limit + 1 ;
45
- let mut overflow_axes: Vec < Ix > = Vec :: with_capacity ( shape. len ( ) ) ;
46
- for ( axis, axis_size) in shape. iter ( ) . enumerate ( ) . rev ( ) {
47
- if axis == last_dim {
48
- continue ;
49
- }
50
- if * axis_size >= 2 * limit + 1 {
51
- overflow_axes. push ( axis) ;
52
- }
53
- }
54
-
55
- if !overflow_axes. is_empty ( ) && last_axis_ovf {
56
- ArrayDisplayMode :: OmitBoth ( overflow_axes)
57
- } else if !overflow_axes. is_empty ( ) {
58
- ArrayDisplayMode :: OmitH ( overflow_axes)
59
- } else if last_axis_ovf {
60
- ArrayDisplayMode :: OmitV
61
- } else {
62
- ArrayDisplayMode :: Full
63
- }
64
- }
65
-
66
- fn h_axes_iter ( & self ) -> Option < Iter < Ix > > {
67
- match self {
68
- ArrayDisplayMode :: OmitH ( v) | ArrayDisplayMode :: OmitBoth ( v) => {
69
- Some ( v. iter ( ) )
70
- } ,
71
- _ => None
72
- }
73
- }
74
- }
75
-
76
20
fn format_array_v2 < A , S , D , F > ( view : & ArrayBase < S , D > ,
77
21
f : & mut fmt:: Formatter ,
78
22
mut format : F ,
@@ -81,19 +25,27 @@ fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
81
25
D : Dimension ,
82
26
S : Data < Elem =A > ,
83
27
{
84
- let display_mode = ArrayDisplayMode :: from_shape ( view. shape ( ) , limit) ;
28
+ if view. shape ( ) . is_empty ( ) {
29
+ // Handle weird 0-dimensional array case first
30
+ return writeln ! ( f, "[]" )
31
+ }
32
+
33
+ let overflow_axes: Vec < Ix > = view. shape ( ) . iter ( )
34
+ . enumerate ( )
35
+ . rev ( )
36
+ . filter ( |( _, axis_size) | * * axis_size > 2 * limit)
37
+ . map ( |( axis, _) | axis)
38
+ . collect ( ) ;
85
39
86
40
let ndim = view. dim ( ) . into_dimension ( ) . slice ( ) . len ( ) ;
87
- let nth_idx_max = if ndim > 0 { Some ( view. shape ( ) . iter ( ) . last ( ) . unwrap ( ) ) } else { None } ;
41
+ let nth_idx_max = view. shape ( ) . iter ( ) . last ( ) . unwrap ( ) ;
88
42
89
43
// None will be an empty iter.
90
44
let mut last_index = match view. dim ( ) . into_dimension ( ) . first_index ( ) {
91
45
None => view. dim ( ) . into_dimension ( ) . clone ( ) ,
92
46
Some ( ix) => ix,
93
47
} ;
94
- for _ in 0 ..ndim {
95
- write ! ( f, "[" ) ?;
96
- }
48
+ write ! ( f, "{}" , "[" . repeat( ndim) ) ?;
97
49
let mut first = true ;
98
50
// Shows if ellipses for vertical split were printed.
99
51
let mut printed_ellipses_v = false ;
@@ -109,18 +61,17 @@ fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
109
61
let take_n = if ndim == 0 { 1 } else { ndim - 1 } ;
110
62
let mut update_index = false ;
111
63
112
- let skip_row_for_axis = match display_mode. h_axes_iter ( ) {
113
- Some ( iter) => {
114
- iter. filter ( |axis| {
115
- let sa_idx_max = view. shape ( ) . iter ( ) . skip ( * * axis) . next ( ) . unwrap ( ) ;
116
- let sa_idx_val = index. slice ( ) . iter ( ) . skip ( * * axis) . next ( ) . unwrap ( ) ;
117
- sa_idx_val >= & limit && sa_idx_val < & ( sa_idx_max - & limit)
118
- } )
119
- . min ( )
120
- . map ( |v| * v)
121
- } ,
122
- None => None
123
- } ;
64
+ let skip_row_for_axis = overflow_axes. iter ( )
65
+ . filter ( |axis| {
66
+ if * * axis == ndim - 1 {
67
+ return false
68
+ } ;
69
+ let sa_idx_max = view. shape ( ) . iter ( ) . skip ( * * axis) . next ( ) . unwrap ( ) ;
70
+ let sa_idx_val = index. slice ( ) . iter ( ) . skip ( * * axis) . next ( ) . unwrap ( ) ;
71
+ sa_idx_val >= & limit && sa_idx_val < & ( sa_idx_max - & limit)
72
+ } )
73
+ . min ( )
74
+ . map ( |v| * v) ;
124
75
if let Some ( _) = skip_row_for_axis {
125
76
no_rows_after_skip_yet = true ;
126
77
}
@@ -139,31 +90,19 @@ fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
139
90
// # of ['s needed
140
91
let n = ndim - i - 1 ;
141
92
if !no_rows_after_skip_yet {
142
- for _ in 0 ..n {
143
- write ! ( f, "]" ) ?;
144
- }
145
- write ! ( f, "," ) ?;
146
- write ! ( f, "\n " ) ?;
93
+ write ! ( f, "{}" , "]" . repeat( n) ) ?;
94
+ writeln ! ( f, "," ) ?;
147
95
}
148
96
no_rows_after_skip_yet = false ;
149
- for _ in 0 ..ndim - n {
150
- write ! ( f, " " ) ?;
151
- }
152
- for _ in 0 ..n {
153
- write ! ( f, "[" ) ?;
154
- }
97
+ write ! ( f, "{}" , " " . repeat( ndim - n) ) ?;
98
+ write ! ( f, "{}" , "[" . repeat( n) ) ?;
155
99
} else if !printed_ellipses_h[ skip_row_for_axis. unwrap ( ) ] {
156
100
let ax = skip_row_for_axis. unwrap ( ) ;
157
101
let n = ndim - i - 1 ;
158
- for _ in 0 ..n {
159
- write ! ( f, "]" ) ?;
160
- }
161
- write ! ( f, "," ) ?;
162
- write ! ( f, "\n " ) ?;
163
- for _ in 0 ..( ax + 1 ) {
164
- write ! ( f, " " ) ?;
165
- }
166
- write ! ( f, "...,\n " ) ?;
102
+ write ! ( f, "{}" , "]" . repeat( n) ) ?;
103
+ writeln ! ( f, "," ) ?;
104
+ write ! ( f, "{}" , " " . repeat( ax + 1 ) ) ?;
105
+ writeln ! ( f, "...," ) ?;
167
106
printed_ellipses_h[ ax] = true ;
168
107
}
169
108
first = true ;
@@ -175,18 +114,15 @@ fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
175
114
if skip_row_for_axis. is_none ( ) {
176
115
let mut print_elt = true ;
177
116
let nth_idx_op = index. slice ( ) . iter ( ) . last ( ) ;
178
- match display_mode {
179
- ArrayDisplayMode :: OmitV | ArrayDisplayMode :: OmitBoth ( _) => {
180
- let nth_idx_val = nth_idx_op. unwrap ( ) ;
181
- if nth_idx_val >= & limit && nth_idx_val < & ( nth_idx_max. unwrap ( ) - & limit) {
182
- print_elt = false ;
183
- if !printed_ellipses_v {
184
- write ! ( f, ", ..." ) ?;
185
- printed_ellipses_v = true ;
186
- }
117
+ if overflow_axes. contains ( & ( ndim - 1 ) ) {
118
+ let nth_idx_val = nth_idx_op. unwrap ( ) ;
119
+ if nth_idx_val >= & limit && nth_idx_val < & ( nth_idx_max - & limit) {
120
+ print_elt = false ;
121
+ if !printed_ellipses_v {
122
+ write ! ( f, ", ..." ) ?;
123
+ printed_ellipses_v = true ;
187
124
}
188
125
}
189
- _ => { }
190
126
}
191
127
192
128
if print_elt {
@@ -202,9 +138,7 @@ fn format_array_v2<A, S, D, F>(view: &ArrayBase<S, D>,
202
138
last_index = index;
203
139
}
204
140
}
205
- for _ in 0 ..ndim {
206
- write ! ( f, "]" ) ?;
207
- }
141
+ write ! ( f, "{}" , "]" . repeat( ndim) ) ?;
208
142
Ok ( ( ) )
209
143
}
210
144
@@ -356,20 +290,3 @@ impl<'a, A: fmt::Binary, S, D: Dimension> fmt::Binary for ArrayBase<S, D>
356
290
format_array ( self , f, <_ >:: fmt)
357
291
}
358
292
}
359
-
360
- #[ cfg( test) ]
361
- mod format_tests {
362
- use super :: * ;
363
-
364
- #[ test]
365
- fn test_array_display_mode_from_shape ( ) {
366
- let mode = ArrayDisplayMode :: from_shape ( & [ 4 , 4 ] , 2 ) ;
367
- assert_eq ! ( mode, ArrayDisplayMode :: Full ) ;
368
-
369
- let mode = ArrayDisplayMode :: from_shape ( & [ 3 , 6 ] , 2 ) ;
370
- assert_eq ! ( mode, ArrayDisplayMode :: OmitV ) ;
371
-
372
- let mode = ArrayDisplayMode :: from_shape ( & [ 5 , 6 , 3 ] , 2 ) ;
373
- assert_eq ! ( mode, ArrayDisplayMode :: OmitH ( vec![ 1 , 0 ] ) ) ;
374
- }
375
- }
0 commit comments