Hi,
I saw in the release notes that Julia added support for different array
indexing methods. I decided to try my hand at implementing zero indexed
vectors, and started with the instructions
here http://docs.julialang.org/en/latest/devdocs/offset-arrays/ I found
this part of the documentation to be unhelpful compared to other parts of
the Julia docs (is that just me?), but with a bit of hacking I came up with
this
immutable ZeroIndexedVector{T} <: AbstractArray{T, 1}
data::Array{T,1}
end
Base.linearindices{T}(A::ZeroIndexedVector{T}) = 0:(length(A.data)-1)
Base.getindex{T}(A::ZeroIndexedVector{T}, i::Int) = A.data[i + 1]
Base.setindex!{T}(A::ZeroIndexedVector{T}, v, i::Int) = (A.data[i + 1] = v)
Base.indices{T}(A::ZeroIndexedVector{T}) =
(0:(length(A.data)-1),)
Base.endof{T}(A::ZeroIndexedVector{T}) = length(A.data) - 1
Base.show{T}(A::ZeroIndexedVector{T}) = show(A.data)
function Base.display{T}(A::ZeroIndexedVector{T})
@printf("%d-element ZeroIndexedVector{%s, 1}:\n",
length(A.data),
string(T))
for elt in A.data
@printf("%s\n", string(elt))
end
end
Apart from some obvious failings (eg, not copying he backing array) it
seems to work. What's the best way to write this code? How does one extend
this to multidimensional arrays? IMO, the explanation of how to do these
two things would have served as good examples on the doc page.
-- Brian