@@ -93,7 +93,8 @@ struct OffsetArray{T,N,AA<:AbstractArray{T,N}} <: AbstractArray{T,N}
93
93
parent:: AA
94
94
offsets:: NTuple{N,Int}
95
95
function OffsetArray {T, N, AA} (parent:: AA , offsets:: NTuple{N, Int} ) where {T, N, AA<: AbstractArray{T,N} }
96
- @boundscheck overflow_check .(axes (parent), offsets)
96
+ # allocation of `map` on tuple is optimized away
97
+ map (overflow_check, axes (parent), offsets)
97
98
new {T, N, AA} (parent, offsets)
98
99
end
99
100
end
@@ -126,40 +127,40 @@ end
126
127
127
128
# Tuples of integers are treated as offsets
128
129
# Empty Tuples are handled here
129
- function OffsetArray (A:: AbstractArray , offsets:: Tuple{Vararg{Integer}} )
130
+ @inline function OffsetArray (A:: AbstractArray , offsets:: Tuple{Vararg{Integer}} )
130
131
_checkindices (A, offsets, " offsets" )
131
132
OffsetArray {eltype(A), ndims(A), typeof(A)} (A, offsets)
132
133
end
133
134
134
135
# These methods are necessary to disallow incompatible dimensions for
135
136
# the OffsetVector and the OffsetMatrix constructors
136
137
for (FT, ND) in ((:OffsetVector , :1 ), (:OffsetMatrix , :2 ))
137
- @eval function $FT (A:: AbstractArray{<:Any,$ND} , offsets:: Tuple{Vararg{Integer}} )
138
+ @eval @inline function $FT (A:: AbstractArray{<:Any,$ND} , offsets:: Tuple{Vararg{Integer}} )
138
139
_checkindices (A, offsets, " offsets" )
139
140
OffsetArray {eltype(A), $ND, typeof(A)} (A, offsets)
140
141
end
141
142
FTstr = string (FT)
142
- @eval function $FT (A:: AbstractArray , offsets:: Tuple{Vararg{Integer}} )
143
+ @eval @inline function $FT (A:: AbstractArray , offsets:: Tuple{Vararg{Integer}} )
143
144
throw (ArgumentError ($ FTstr* " requires a " * string ($ ND)* " D array" ))
144
145
end
145
146
end
146
147
147
148
# # OffsetArray constructors
148
149
for FT in (:OffsetArray , :OffsetVector , :OffsetMatrix )
149
150
# Nested OffsetArrays may strip off the wrapper and collate the offsets
150
- @eval function $FT (A:: OffsetArray , offsets:: Tuple{Vararg{Integer}} )
151
+ @eval @inline function $FT (A:: OffsetArray , offsets:: Tuple{Vararg{Integer}} )
151
152
_checkindices (A, offsets, " offsets" )
152
153
$ FT (parent (A), map (+ , A. offsets, offsets))
153
154
end
154
155
155
156
# In general, indices get converted to AbstractUnitRanges.
156
157
# CartesianIndices{N} get converted to N ranges
157
- @eval function $FT (A:: AbstractArray , inds:: Tuple{Any,Vararg{Any}} )
158
+ @eval @inline function $FT (A:: AbstractArray , inds:: Tuple{Any,Vararg{Any}} )
158
159
$ FT (A, _toAbstractUnitRanges (to_indices (A, axes (A), inds)))
159
160
end
160
161
161
162
# convert ranges to offsets
162
- @eval function $FT (A:: AbstractArray , inds:: Tuple{AbstractUnitRange,Vararg{AbstractUnitRange}} )
163
+ @eval @inline function $FT (A:: AbstractArray , inds:: Tuple{AbstractUnitRange,Vararg{AbstractUnitRange}} )
163
164
_checkindices (A, inds, " indices" )
164
165
# Performance gain by wrapping the error in a function: see https://github.com/JuliaLang/julia/issues/37558
165
166
throw_dimerr (lA, lI) = throw (DimensionMismatch (" supplied axes do not agree with the size of the array (got size $lA for the array and $lI for the indices" ))
@@ -169,27 +170,27 @@ for FT in (:OffsetArray, :OffsetVector, :OffsetMatrix)
169
170
$ FT (A, map (_offset, axes (A), inds))
170
171
end
171
172
172
- @eval $ FT (A:: AbstractArray , inds:: Vararg ) = $ FT (A, inds)
173
+ @eval @inline $ FT (A:: AbstractArray , inds:: Vararg ) = $ FT (A, inds)
173
174
174
- @eval $ FT (A:: AbstractArray , origin:: Origin ) = $ FT (A, origin (A))
175
+ @eval @inline $ FT (A:: AbstractArray , origin:: Origin ) = $ FT (A, origin (A))
175
176
end
176
177
177
178
# array initialization
178
- function OffsetArray {T,N} (init:: ArrayInitializer , inds:: Tuple{Vararg{OffsetAxisKnownLength}} ) where {T,N}
179
+ @inline function OffsetArray {T,N} (init:: ArrayInitializer , inds:: Tuple{Vararg{OffsetAxisKnownLength}} ) where {T,N}
179
180
_checkindices (N, inds, " indices" )
180
181
AA = Array {T,N} (init, map (_indexlength, inds))
181
182
OffsetArray {T, N, typeof(AA)} (AA, map (_indexoffset, inds))
182
183
end
183
- function OffsetArray {T, N} (init:: ArrayInitializer , inds:: Tuple ) where {T, N}
184
+ @inline function OffsetArray {T, N} (init:: ArrayInitializer , inds:: Tuple ) where {T, N}
184
185
OffsetArray {T, N} (init, _toAbstractUnitRanges (inds))
185
186
end
186
- OffsetArray {T,N} (init:: ArrayInitializer , inds:: Vararg ) where {T,N} = OffsetArray {T,N} (init, inds)
187
+ @inline OffsetArray {T,N} (init:: ArrayInitializer , inds:: Vararg ) where {T,N} = OffsetArray {T,N} (init, inds)
187
188
188
- OffsetArray {T} (init:: ArrayInitializer , inds:: NTuple{N, OffsetAxisKnownLength} ) where {T,N} = OffsetArray {T,N} (init, inds)
189
- function OffsetArray {T} (init:: ArrayInitializer , inds:: Tuple ) where {T}
189
+ @inline OffsetArray {T} (init:: ArrayInitializer , inds:: NTuple{N, OffsetAxisKnownLength} ) where {T,N} = OffsetArray {T,N} (init, inds)
190
+ @inline function OffsetArray {T} (init:: ArrayInitializer , inds:: Tuple ) where {T}
190
191
OffsetArray {T} (init, _toAbstractUnitRanges (inds))
191
192
end
192
- OffsetArray {T} (init:: ArrayInitializer , inds:: Vararg ) where {T} = OffsetArray {T} (init, inds)
193
+ @inline OffsetArray {T} (init:: ArrayInitializer , inds:: Vararg ) where {T} = OffsetArray {T} (init, inds)
193
194
194
195
Base. IndexStyle (:: Type{OA} ) where {OA<: OffsetArray } = IndexStyle (parenttype (OA))
195
196
parenttype (:: Type{OffsetArray{T,N,AA}} ) where {T,N,AA} = AA
0 commit comments