@@ -11,25 +11,6 @@ Base.similar(A::AbstractDimArrayGenerator, ::Type{T}, D::DimTuple) where T =
11
11
Base. similar (A:: AbstractDimArrayGenerator , :: Type{T} , D:: Tuple{} ) where T =
12
12
dimconstructor (D)(A; data= similar (Array{T}, ()), dims= (), refdims= (), metadata= NoMetadata ())
13
13
14
- # Indexing that returns a new object with the same number of dims
15
- for f in (:getindex , :dotview , :view )
16
- T = Union{Colon,AbstractVector}
17
- @eval @propagate_inbounds function Base. $f (di:: AbstractDimArrayGenerator , i1:: $T , i2:: $T , Is:: $T... )
18
- I = (i1, i2, Is... )
19
- newdims, _ = slicedims (dims (di), I)
20
- rebuild (di; dims= newdims)
21
- end
22
- @eval @propagate_inbounds Base.$ f (di:: AbstractDimArrayGenerator{<:Any,1} , i:: $T ) =
23
- rebuild (di; dims= (dims (di, 1 )[i],))
24
- @eval @propagate_inbounds Base.$ f (dg:: AbstractDimArrayGenerator , i:: Integer ) =
25
- Base.$ f (dg, Tuple (CartesianIndices (dg)[i])... )
26
- if f == :view
27
- @eval @propagate_inbounds Base.$ f (A:: AbstractDimArrayGenerator ) = A
28
- else
29
- @eval @propagate_inbounds Base.$ f (:: AbstractDimArrayGenerator ) = ()
30
- end
31
- end
32
-
33
14
@inline Base. permutedims (A:: AbstractDimArrayGenerator{<:Any,2} ) =
34
15
rebuild (A; dims= reverse (dims (A)))
35
16
@inline Base. permutedims (A:: AbstractDimArrayGenerator{<:Any,1} ) =
@@ -454,3 +435,46 @@ function mergedims(A::DimExtensionArray, dim_pairs::Pair...)
454
435
data_merged = reshape (parent (Aperm), map (length, dims_new))
455
436
return DimArray (data_merged, dims_new)
456
437
end
438
+
439
+ const SelectorOrStandard = Union{SelectorOrInterval,StandardIndices}
440
+ const DimensionIndsArrays = Union{AbstractArray{<: Dimension },AbstractArray{<: DimTuple }}
441
+ const DimensionalIndices = Union{DimTuple,DimIndices,DimSelectors,Dimension,DimensionIndsArrays}
442
+ const _DimIndicesAmb = Union{AbstractArray{Union{}},DimIndices{<: Integer },DimSelectors{<: Integer }}
443
+
444
+ # Indexing that returns a new object with the same number of dims
445
+ for f in (:getindex , :dotview , :view )
446
+ T = Union{Colon,AbstractVector}
447
+ _dim_f = Symbol (:_dim_ , f)
448
+ @eval begin
449
+ @propagate_inbounds function Base. $f (di:: AbstractDimArrayGenerator , i1:: $T , i2:: $T , Is:: $T... )
450
+ I = (i1, i2, Is... )
451
+ newdims, _ = slicedims (dims (di), I)
452
+ rebuild (di; dims= newdims)
453
+ end
454
+ @propagate_inbounds function Base. $f (
455
+ di:: AbstractDimArrayGenerator ,
456
+ i1:: DimensionalIndices ,
457
+ i2:: DimensionalIndices ,
458
+ Is:: DimensionalIndices...
459
+ )
460
+ rebuild (di; dims= newdims)
461
+ end
462
+ @propagate_inbounds Base.$ f (A:: AbstractDimArrayGenerator , i:: DimIndices ) = $ _dim_f (A, i)
463
+ @propagate_inbounds Base.$ f (A:: AbstractDimArrayGenerator , i:: DimSelectors ) = $ _dim_f (A, i)
464
+ @propagate_inbounds Base.$ f (A:: AbstractDimArrayGenerator , i:: DimensionalIndices ) = $ _dim_f (A, i)
465
+ @propagate_inbounds Base.$ f (A:: AbstractDimArrayGenerator , i:: _DimIndicesAmb ) = $ _dim_f (A, i)
466
+ @propagate_inbounds Base.$ f (A:: AbstractDimArrayGenerator{<:Any,1} , i:: DimIndices ) = $ _dim_f (A, i)
467
+ @propagate_inbounds Base.$ f (A:: AbstractDimArrayGenerator{<:Any,1} , i:: DimSelectors ) = $ _dim_f (A, i)
468
+ @propagate_inbounds Base.$ f (A:: AbstractDimArrayGenerator{<:Any,1} , i:: DimensionalIndices ) = $ _dim_f (A, i)
469
+ @propagate_inbounds Base.$ f (A:: AbstractDimArrayGenerator{<:Any,1} , i:: _DimIndicesAmb ) = $ _dim_f (A, i)
470
+ @propagate_inbounds Base.$ f (di:: AbstractDimArrayGenerator{<:Any,1} , i:: $T ) =
471
+ rebuild (di; dims= (dims (di, 1 )[i],))
472
+ @propagate_inbounds Base.$ f (dg:: AbstractDimArrayGenerator , i:: Integer ) =
473
+ Base.$ f (dg, Tuple (CartesianIndices (dg)[i])... )
474
+ end
475
+ if f == :view
476
+ @eval @propagate_inbounds Base.$ f (A:: AbstractDimArrayGenerator ) = A
477
+ else
478
+ @eval @propagate_inbounds Base.$ f (:: AbstractDimArrayGenerator ) = ()
479
+ end
480
+ end
0 commit comments