@@ -6,8 +6,7 @@ using DelimitedFiles
6
6
using Random
7
7
using LinearAlgebra
8
8
using Statistics
9
-
10
- const OAs_name = join (fullname (OffsetArrays), " ." )
9
+ using Base: IdentityUnitRange
11
10
12
11
if ! isdefined (@__MODULE__ , :T24Linear )
13
12
include (" testhelpers/arrayindexingtypes.jl" )
18
17
v0 = rand (4 )
19
18
v = OffsetArray (v0, (- 3 ,))
20
19
h = OffsetArray ([- 1 ,1 ,- 2 ,2 ,0 ], (- 3 ,))
21
- @test axes (v) == ( - 2 : 1 ,)
20
+ @test axes (v) === (OffsetArrays . IdOffsetRange (Base . OneTo ( 4 ), - 3 ) ,)
22
21
@test size (v) == (4 ,)
23
22
@test size (v, 1 ) == 4
24
23
@test_throws DimensionMismatch Array (v)
25
24
26
25
A0 = [1 3 ; 2 4 ]
27
26
A = OffsetArray (A0, (- 1 ,2 )) # IndexLinear
28
27
S = OffsetArray (view (A0, 1 : 2 , 1 : 2 ), (- 1 ,2 )) # IndexCartesian
29
- @test axes (A) == axes (S) == ( 0 : 1 , 3 : 4 )
28
+ @test axes (A) === axes (S) === (OffsetArrays . IdOffsetRange (Base . OneTo ( 2 ), - 1 ), OffsetArrays . IdOffsetRange (Base . OneTo ( 2 ), 2 ) )
30
29
@test size (A) == (2 ,2 )
31
30
@test size (A, 1 ) == 2
32
31
@@ -133,13 +132,13 @@ S = view(A, :, 3)
133
132
@test S[0 ] == 1
134
133
@test S[1 ] == 2
135
134
@test_throws BoundsError S[2 ]
136
- @test axes (S) === (Base. IdentityUnitRange (0 : 1 ),)
135
+ @test axes (S) === (Base. IdentityUnitRange (OffsetArrays . IdOffsetRange (Base . OneTo ( 2 ), - 1 ) ),)
137
136
S = view (A, 0 , :)
138
137
@test S == OffsetArray ([1 ,3 ], (A. offsets[2 ],))
139
138
@test S[3 ] == 1
140
139
@test S[4 ] == 3
141
140
@test_throws BoundsError S[1 ]
142
- @test axes (S) === (Base. IdentityUnitRange (3 : 4 ),)
141
+ @test axes (S) === (Base. IdentityUnitRange (OffsetArrays . IdOffsetRange (Base . OneTo ( 2 ), 2 ) ),)
143
142
S = view (A, 0 : 0 , 4 )
144
143
@test S == [3 ]
145
144
@test S[1 ] == 3
@@ -158,17 +157,17 @@ S = view(A, :, :)
158
157
@test S[0 ,4 ] == S[3 ] == 3
159
158
@test S[1 ,4 ] == S[4 ] == 4
160
159
@test_throws BoundsError S[1 ,1 ]
161
- @test axes (S) === Base. IdentityUnitRange .((0 : 1 , 3 : 4 ))
160
+ @test axes (S) === Base. IdentityUnitRange .((OffsetArrays . IdOffsetRange (Base . OneTo ( 2 ), - 1 ), OffsetArrays . IdOffsetRange (Base . OneTo ( 2 ), 2 ) ))
162
161
# https://github.com/JuliaArrays/OffsetArrays.jl/issues/27
163
162
g = OffsetArray (Vector (- 2 : 3 ), (- 3 ,))
164
163
gv = view (g, - 1 : 2 )
165
164
@test axes (gv, 1 ) === Base. OneTo (4 )
166
165
@test collect (gv) == - 1 : 2
167
166
gv = view (g, OffsetArray (- 1 : 2 , (- 2 ,)))
168
- @test axes (gv, 1 ) === Base. IdentityUnitRange ( - 1 : 2 )
167
+ @test axes (gv, 1 ) === OffsetArrays . IdOffsetRange ( Base. OneTo ( 4 ), - 2 )
169
168
@test collect (gv) == - 1 : 2
170
169
gv = view (g, OffsetArray (- 1 : 2 , (- 1 ,)))
171
- @test axes (gv, 1 ) === Base. IdentityUnitRange ( 0 : 3 )
170
+ @test axes (gv, 1 ) === OffsetArrays . IdOffsetRange ( Base. OneTo ( 4 ), - 1 )
172
171
@test collect (gv) == - 1 : 2
173
172
174
173
# iteration
@@ -199,7 +198,7 @@ str = String(take!(io))
199
198
show (io, parent (v))
200
199
@test str == String (take! (io))
201
200
smry = summary (v)
202
- @test occursin (" OffsetArray{Float64, 1 " , smry)
201
+ @test occursin (" OffsetArray(::Vector {Float64" , smry)
203
202
@test occursin (" with indices -1:1" , smry)
204
203
function cmp_showf (printfunc, io, A; options = ())
205
204
ioc = IOContext (io, :limit => true , :compact => true , options... )
@@ -216,11 +215,11 @@ cmp_showf(Base.print_matrix, io, OffsetArray(rand(10^3,10^3), (10,-9))) # neithe
216
215
cmp_showf (Base. print_matrix, io, OffsetArray (reshape (range (- 0.212121212121 , stop= 2 / 11 , length= 3 * 29 ), 3 , 29 ), (- 2 , - 15 )); options= (:displaysize => (53 ,210 ),))
217
216
cmp_showf (show, io, OffsetArray (collect (1 : 100 ), (100 ,))) # issue #31641
218
217
219
- targets1 = [" 0-dimensional $OAs_name . OffsetArray{Float64, 0, Array{Float64, 0}} :\n 1.0" ,
220
- " 1-element $OAs_name . OffsetArray{Float64, 1, Vector{ Float64}} with indices 2:2:\n 1.0" ,
221
- " 1×1 $OAs_name . OffsetArray{Float64, 2, Matrix{ Float64}} with indices 2:2×3:3:\n 1.0" ,
222
- " 1×1×1 $OAs_name . OffsetArray{Float64, 3, Array{Float64 , 3}} with indices 2:2×3:3×4:4:\n [:, :, 4] =\n 1.0" ,
223
- " 1×1×1×1 $OAs_name . OffsetArray{Float64, 4, Array{Float64, 4}} with indices 2:2×3:3×4:4×5:5:\n [:, :, 4, 5] =\n 1.0" ]
218
+ targets1 = [" 0-dimensional OffsetArray(:: Array{Float64, 0}) with eltype Float64 :\n 1.0" ,
219
+ " 1-element OffsetArray(::Vector {Float64}, 2:2) with eltype Float64 with indices 2:2:\n 1.0" ,
220
+ " 1×1 OffsetArray(::Matrix {Float64} , 2:2, 3:3) with eltype Float64 with indices 2:2×3:3:\n 1.0" ,
221
+ " 1×1×1 OffsetArray(::Array {Float64, 3}, 2:2 , 3:3, 4:4) with eltype Float64 with indices 2:2×3:3×4:4:\n [:, :, 4] =\n 1.0" ,
222
+ " 1×1×1×1 OffsetArray(::Array {Float64, 4}, 2:2, 3:3, 4:4, 5:5) with eltype Float64 with indices 2:2×3:3×4:4×5:5:\n [:, :, 4, 5] =\n 1.0" ]
224
223
targets2 = [" (fill(1.0), fill(1.0))" ,
225
224
" ([1.0], [1.0])" ,
226
225
" ([1.0], [1.0])" ,
@@ -235,7 +234,7 @@ targets2 = ["(fill(1.0), fill(1.0))",
235
234
end
236
235
P = OffsetArray (rand (8 ,8 ), (1 ,1 ))
237
236
PV = view (P, 2 : 3 , :)
238
- @test endswith (summary (PV), " with indices Base.OneTo(2)×2:9" )
237
+ @test endswith (summary (PV), " with indices Base.OneTo(2)×OffsetArrays.IdOffsetRange( 2:9) " )
239
238
240
239
# Similar
241
240
B = similar (A, Float32)
@@ -247,26 +246,26 @@ B = similar(A, (3,4))
247
246
@test axes (B) === (Base. OneTo (3 ), Base. OneTo (4 ))
248
247
B = similar (A, (- 3 : 3 ,1 : 4 ))
249
248
@test isa (B, OffsetArray{Int,2 })
250
- @test axes (B) === Base. IdentityUnitRange .(( - 3 : 3 , 1 : 4 ))
249
+ @test axes (B) === (OffsetArrays . IdOffsetRange ( Base. OneTo ( 7 ), - 4 ), OffsetArrays . IdOffsetRange (Base . OneTo ( 4 ) ))
251
250
B = similar (parent (A), (- 3 : 3 ,1 : 4 ))
252
251
@test isa (B, OffsetArray{Int,2 })
253
- @test axes (B) === Base. IdentityUnitRange .(( - 3 : 3 , 1 : 4 ))
252
+ @test axes (B) === (OffsetArrays . IdOffsetRange ( Base. OneTo ( 7 ), - 4 ), OffsetArrays . IdOffsetRange (Base . OneTo ( 4 ) ))
254
253
255
254
# Indexing with OffsetArray indices
256
255
i1 = OffsetArray ([2 ,1 ], (- 5 ,))
257
256
i1 = OffsetArray ([2 ,1 ], - 5 )
258
257
b = A0[i1, 1 ]
259
- @test axes (b) === (Base. IdentityUnitRange ( - 4 : - 3 ),)
258
+ @test axes (b) === (OffsetArrays . IdOffsetRange ( Base. OneTo ( 2 ), - 5 ),)
260
259
@test b[- 4 ] == 2
261
260
@test b[- 3 ] == 1
262
261
b = A0[1 ,i1]
263
- @test axes (b) === (Base. IdentityUnitRange ( - 4 : - 3 ),)
262
+ @test axes (b) === (OffsetArrays . IdOffsetRange ( Base. OneTo ( 2 ), - 5 ),)
264
263
@test b[- 4 ] == 3
265
264
@test b[- 3 ] == 1
266
265
v = view (A0, i1, 1 )
267
- @test axes (v) === (Base. IdentityUnitRange ( - 4 : - 3 ),)
266
+ @test axes (v) === (OffsetArrays . IdOffsetRange ( Base. OneTo ( 2 ), - 5 ),)
268
267
v = view (A0, 1 : 1 , i1)
269
- @test axes (v) === (Base. OneTo (1 ), Base. IdentityUnitRange ( - 4 : - 3 ))
268
+ @test axes (v) === (Base. OneTo (1 ), OffsetArrays . IdOffsetRange ( Base. OneTo ( 2 ), - 5 ))
270
269
271
270
# copyto! and fill!
272
271
a = OffsetArray {Int} (undef, (- 3 : - 1 ,))
@@ -395,7 +394,7 @@ v2 = copy(v)
395
394
v = OffsetArray (v0, (- 3 ,))
396
395
@test lastindex (v) == 1
397
396
@test v ≈ v
398
- @test axes (v' ) === (Base. OneTo (1 ),Base. IdentityUnitRange ( - 2 : 1 ))
397
+ @test axes (v' ) === (Base. OneTo (1 ), OffsetArrays . IdOffsetRange ( Base. OneTo ( 4 ), - 3 ))
399
398
@test parent (v) == collect (v)
400
399
rv = reverse (v)
401
400
@test axes (rv) == axes (v)
@@ -411,7 +410,7 @@ A = OffsetArray(rand(4,4), (-3,5))
411
410
@test lastindex (A, 1 ) == 1
412
411
@test lastindex (A, 2 ) == 9
413
412
@test A ≈ A
414
- @test axes (A' ) === Base. IdentityUnitRange .(( 6 : 9 , - 2 : 1 ))
413
+ @test axes (A' ) === (OffsetArrays . IdOffsetRange ( Base. OneTo ( 4 ), 5 ), OffsetArrays . IdOffsetRange (Base . OneTo ( 4 ) , - 3 ))
415
414
@test parent (copy (A' )) == copy (parent (A)' )
416
415
@test collect (A) == parent (A)
417
416
@test maximum (A) == maximum (parent (A))
@@ -583,9 +582,21 @@ module SimilarUR
583
582
end
584
583
ur = MyURange (1 ,3 )
585
584
a = Vector {Int} (undef, 2 )
586
- @test_throws MethodError similar (a, ur)
587
- @test_throws MethodError similar (a, Float64, ur)
588
- @test_throws MethodError similar (a, Float64, (ur,))
585
+
586
+ function catch_exception (f, args... )
587
+ try
588
+ f (args... )
589
+ catch err
590
+ return err
591
+ end
592
+ end
593
+ # type-piracy https://github.com/JuliaArrays/OffsetArrays.jl/issues/87
594
+ @test_broken (catch_exception (similar, a, ur) isa MethodError)
595
+ @test_broken (catch_exception (similar, a, Float64, ur) isa MethodError)
596
+ @test_broken (catch_exception (similar, a, Float64, (ur,)) isa MethodError)
597
+ # @test_throws MethodError similar(a, ur)
598
+ # @test_throws MethodError similar(a, Float64, ur)
599
+ # @test_throws MethodError similar(a, Float64, (ur,))
589
600
@test_throws MethodError similar (a, (2.0 ,3.0 ))
590
601
end
591
602
@@ -630,3 +641,101 @@ end
630
641
@test last (v, 100 ) != = v
631
642
@test last (v, 1 ) == [v[end ]]
632
643
end
644
+
645
+ @testset " Resizing OffsetVectors" begin
646
+ local a = OffsetVector (rand (5 ),- 3 )
647
+ axes (a,1 ) == - 2 : 2
648
+ length (a) == 5
649
+ resize! (a,3 )
650
+ length (a) == 3
651
+ axes (a,1 ) == - 2 : 0
652
+ @test_throws ArgumentError resize! (a,- 3 )
653
+ end
654
+
655
+ @testset " issue #37199: offset range indices" begin
656
+ # https://github.com/JuliaArrays/OffsetArrays.jl/issues/133
657
+ A0 = [1 3 ; 2 4 ]
658
+ A = OffsetArray (A0, (- 1 ,2 ))
659
+
660
+ r = OffsetArrays. IdOffsetRange (1 : 2 , - 1 )
661
+ v1 = view (A, r, 3 )
662
+ @test v1[0 ] == 1
663
+ @test v1[1 ] == 2
664
+ @test axes (v1, 1 ) == axes (r, 1 )
665
+ v2 = view (A, UnitRange (r), 3 )
666
+ for (indflat, indoffset) in enumerate (r)
667
+ @test v1[indoffset] == v2[indflat]
668
+ end
669
+
670
+ r = OffsetArrays. IdOffsetRange (1 : 2 , 2 )
671
+ v1 = view (A, 1 , r)
672
+ @test v1[3 ] == 2
673
+ @test v1[4 ] == 4
674
+ @test axes (v1, 1 ) == axes (r, 1 )
675
+ v2 = view (A, 1 , UnitRange (r))
676
+ for (indflat, indoffset) in enumerate (r)
677
+ @test v1[indoffset] == v2[indflat]
678
+ end
679
+
680
+ a12 = zeros (3 : 8 , 3 : 4 )
681
+ r = OffsetArrays. IdOffsetRange (Base. OneTo (3 ), 5 )
682
+ a12[r, 4 ] .= 3
683
+ @test all (a12[r, 4 ] .== 3 )
684
+ @test all (a12[UnitRange (r), 4 ] .== 3 )
685
+
686
+ # https://github.com/JuliaArrays/OffsetArrays.jl/issues/100
687
+ S = view (A, axes (A)... )
688
+ @test S == A
689
+ @test S[0 ,3 ] == S[1 ] == 1
690
+ @test S[1 ,3 ] == S[2 ] == 2
691
+ @test S[0 ,4 ] == S[3 ] == 3
692
+ @test S[1 ,4 ] == S[4 ] == 4
693
+ @test_throws BoundsError S[1 ,1 ]
694
+ @test axes (S) == OffsetArrays. IdOffsetRange .((0 : 1 , 3 : 4 ))
695
+ S = view (A, axes (A, 1 ), 3 )
696
+ @test S == A[:, 3 ]
697
+ @test S[0 ] == 1
698
+ @test S[1 ] == 2
699
+ @test_throws BoundsError S[length (S)]
700
+ @test axes (S) == (OffsetArrays. IdOffsetRange (0 : 1 ), )
701
+ S = view (A, 1 , axes (A, 2 ))
702
+ @test S == A[1 , :]
703
+ @test S[3 ] == 2
704
+ @test S[4 ] == 4
705
+ @test_throws BoundsError S[1 ]
706
+ @test axes (S) == (OffsetArrays. IdOffsetRange (3 : 4 ), )
707
+
708
+ A0 = collect (reshape (1 : 24 , 2 , 3 , 4 ))
709
+ A = OffsetArray (A0, (- 1 ,2 ,1 ))
710
+ S = view (A, axes (A, 1 ), 3 : 4 , axes (A, 3 ))
711
+ @test S == A[:, 3 : 4 , :]
712
+ @test S[0 , 1 , 2 ] == A[0 , 3 , 2 ]
713
+ @test S[0 , 2 , 2 ] == A[0 , 4 , 2 ]
714
+ @test S[1 , 1 , 2 ] == A[1 , 3 , 2 ]
715
+ @test axes (S) == (OffsetArrays. IdOffsetRange (0 : 1 ), Base. OneTo (2 ), OffsetArrays. IdOffsetRange (2 : 5 ))
716
+ end
717
+
718
+ @testset " IdentityUnitRange indexing" begin
719
+ a = OffsetVector (3 : 4 , 2 : 3 )
720
+ ax = IdentityUnitRange (2 : 3 )
721
+ @test a[ax[2 ]] == a[ax][2 ]
722
+
723
+ s = - 2 : 2 : 4
724
+ r = 5 : 8
725
+ y = OffsetArray (s, r)
726
+ @test axes (y) == (r,)
727
+ @test step (y) == step (s)
728
+
729
+ a = OffsetVector (3 : 4 , 10 : 11 )
730
+ ax = OffsetArrays. IdOffsetRange (5 : 6 , 5 )
731
+ @test axes (a[ax]) == axes (ax)
732
+ for i in axes (ax,1 )
733
+ @test a[ax[i]] == a[ax][i]
734
+ end
735
+
736
+ ax = IdentityUnitRange (10 : 11 )
737
+ @test axes (a[ax]) == axes (ax)
738
+ for i in axes (ax,1 )
739
+ @test a[ax[i]] == a[ax][i]
740
+ end
741
+ end
0 commit comments