Hi Sheehan, The inbounds macro just sets a flag around the block, which works fine here - see the output of `macroexpand( :(@inbounds ...) )`. Unfortunately it looks like the flag is as-yet unsupported at the compiler level for non-native arrays. See:
https://github.com/JuliaLang/julia/issues/7799 https://github.com/JuliaLang/julia/issues/9077 Cheers, Isaiah On Tue, Dec 23, 2014 at 5:38 PM, Sheehan Olver <[email protected]> wrote: > I'm making a custom "BandedMatrix" data type that overrides setindex!, and > I want to use @inbounds: > > @inbounds A[k,j]=4 > > > The issue is that @inbounds doesn't seem to go "inside" the setindex! > call. Any idea to allow @inbounds to work? My solution is to add another > call ibsetindex!, but this makes the set syntax uglier. Code is below. > > > > > immutable BandedMatrix{T} > data::Matrix{T} > a::Int > b::Int > n::Int #Number of rows > end > function BandedMatrix{T}(data::Matrix{T},a,b,n) > @assert size(data,1)==b-a+1 > BandedMatrix{data,a,b,n} > end > > > bazeros{T}(::Type{T},a::Integer,b,n,m)=BandedMatrix(zeros(T,b-a+1,m),a,b,n) > bazeros{T}(::Type{T},a::Integer,b,n)=bazeros(T,a,b,n,n) > bazeros(a::Integer,b,n,m)=bazeros(Float64,a,b,n,m) > bazeros(a::Integer,b,n)=bazeros(Float64,a,b,n,n) > > Base.size(A::BandedMatrix,k)=ifelse(k==1,A.n,size(A.data,2)) > Base.size(A::BandedMatrix)=A.n,size(A.data,2) > > usgetindex(A::BandedMatrix,k,j::Integer)=A.data[k-j+A.b+1,j] > > getindex{T}(A::BandedMatrix{T},k::Integer,j::Integer)=(A.a≤j-k≤A.b)?usgetindex(A,k,j):(k≤A.n?zero(T):throw(BoundsError())) > getindex(A::BandedMatrix,kr::Range,j::Integer)=A.a≤j-kr[end]≤j-kr[1]≤A.b?usgetindex(A,kr,j):[A[k,j] > for k=kr] > getindex(A::BandedMatrix,k::Integer,jr::Range)=[A[k,j] for j=jr] > getindex(A::BandedMatrix,kr::Range,jr::Range)=[A[k,j] for k=kr,j=jr] > Base.full(A::BandedMatrix)=A[1:size(A,1),1:size(A,2)] > > > ibsetindex!(A::BandedMatrix,v,k,j::Integer)=(@inbounds > A.data[k-j+A.b+1,j]=v) > setindex!(A::BandedMatrix,v,k,j::Integer)=(A.data[k-j+A.b+1,j]=v) > > function setindex!(A::BandedMatrix,v,kr::Range,jr::Range) > for j in jr > A[kr,j]=slice(v,:,j) > end > end > function setindex!(A::BandedMatrix,v,k::Integer,jr::Range) > for j in jr > A[k,j]=v[j] > end > end > > >
