@@ -10,7 +10,7 @@ export CircularArray, CircularVector
1010
1111`N`-dimensional array backed by an `AbstractArray{T, N}` of type `A` with fixed size and circular indexing.
1212
13- array[index] == array[mod1(index, size)]
13+ array[index... ] == array[mod1. (index, size)... ]
1414"""
1515struct CircularArray{T, N, A} <: AbstractArray{T, N}
1616 data:: A
2323One-dimensional array backed by an `AbstractArray{T, 1}` of type `A` with fixed size and circular indexing.
2424Alias for [`CircularArray{T,1,A}`](@ref).
2525
26- array[index] == array[mod1(index, size )]
26+ array[index] == array[mod1(index, length )]
2727"""
2828const CircularVector{T} = CircularArray{T, 1 }
2929
30- @inline clamp_bounds (arr:: CircularArray , I:: Tuple{Vararg{Int}} ):: AbstractArray{Int, 1} = map (Base. splat (mod), zip (I, axes (arr. data)))
31-
3230CircularArray (data:: AbstractArray{T,N} ) where {T,N} = CircularArray {T,N} (data)
3331CircularArray {T} (data:: AbstractArray{T,N} ) where {T,N} = CircularArray {T,N} (data)
3432CircularArray (def:: T , size) where T = CircularArray (fill (def, size))
3533
36- @inline Base. getindex (arr:: CircularArray , i:: Int ) = @inbounds getindex (arr. data, mod (i, Base. axes1 (arr. data)))
37- @inline Base. setindex! (arr:: CircularArray , v, i:: Int ) = @inbounds setindex! (arr. data, v, mod (i, Base. axes1 (arr. data)))
38- @inline Base. getindex (arr:: CircularArray , I:: Vararg{Int} ) = @inbounds getindex (arr. data, clamp_bounds (arr, I)... )
39- @inline Base. setindex! (arr:: CircularArray , v, I:: Vararg{Int} ) = @inbounds setindex! (arr. data, v, clamp_bounds (arr, I)... )
34+ @inline Base. getindex (arr:: CircularArray , i:: Int ) =
35+ @inbounds getindex (arr. data, mod1 (i, length (arr. data)))
36+ @inline Base. getindex (arr:: CircularArray{T,N} , I:: Vararg{<:Int,N} ) where {T,N} =
37+ @inbounds getindex (arr. data, map (mod, I, axes (arr. data))... )
38+
39+ @inline Base. setindex! (arr:: CircularArray , v, i:: Int ) =
40+ @inbounds setindex! (arr. data, v, mod1 (i, length (arr. data)))
41+ @inline Base. setindex! (arr:: CircularArray{T,N} , v, I:: Vararg{<:Int,N} ) where {T,N} =
42+ @inbounds setindex! (arr. data, v, map (mod, I, axes (arr. data))... )
43+
4044@inline Base. size (arr:: CircularArray ) = size (arr. data)
4145@inline Base. axes (arr:: CircularArray ) = axes (arr. data)
46+ Base. parent (arr:: CircularArray ) = arr. data
4247
43- @inline Base. checkbounds (:: CircularArray , _... ) = nothing
48+ @inline function Base. checkbounds (arr:: CircularArray , I... )
49+ J = Base. to_indices (arr, I)
50+ length (J) == 1 || length (J) >= ndims (arr) || throw (BoundsError (arr, I))
51+ nothing
52+ end
4453
4554@inline _similar (arr:: CircularArray , :: Type{T} , dims) where T = CircularArray (similar (arr. data,T,dims))
4655@inline Base. similar (arr:: CircularArray , :: Type{T} , dims:: Tuple{Base.DimOrInd, Vararg{Base.DimOrInd}} ) where T = _similar (arr,T,dims)
@@ -50,6 +59,14 @@ CircularArray(def::T, size) where T = CircularArray(fill(def, size))
5059CircularVector (data:: AbstractArray{T, 1} ) where T = CircularVector {T} (data)
5160CircularVector (def:: T , size:: Int ) where T = CircularVector {T} (fill (def, size))
5261
62+ Base. IndexStyle (:: Type{CircularArray{T,N,A}} ) where {T,N,A} = IndexCartesian ()
5363Base. IndexStyle (:: Type{<:CircularVector} ) = IndexLinear ()
5464
65+ function Base. showarg (io:: IO , arr:: CircularArray , toplevel)
66+ print (io, ndims (arr) == 1 ? " CircularVector(" : " CircularArray(" )
67+ Base. showarg (io, parent (arr), false )
68+ print (io, ' )' )
69+ # toplevel && print(io, " with eltype ", eltype(arr))
70+ end
71+
5572end
0 commit comments