From ca2446e4fde4939da3e58dfd24ede944901fb6e2 Mon Sep 17 00:00:00 2001 From: Martin Holters Date: Thu, 14 Sep 2017 14:05:47 +0200 Subject: [PATCH] Make CartesianIndex iterable Make iterating a CartesianIndex equivalent to iterating the tuple it holds, being consistent with its indexing behavior. --- base/multidimensional.jl | 6 ++++++ test/arrayops.jl | 2 ++ 2 files changed, 8 insertions(+) diff --git a/base/multidimensional.jl b/base/multidimensional.jl index c9af4fef644ae..53293cd67f640 100644 --- a/base/multidimensional.jl +++ b/base/multidimensional.jl @@ -88,6 +88,12 @@ module IteratorsMD # indexing getindex(index::CartesianIndex, i::Integer) = index.I[i] + eltype(index::CartesianIndex) = eltype(index.I) + + # iteration + start(index::CartesianIndex) = start(index.I) + next(index::CartesianIndex, state) = next(index.I, state) + done(index::CartesianIndex, state) = done(index.I, state) # zeros and ones zero(::CartesianIndex{N}) where {N} = zero(CartesianIndex{N}) diff --git a/test/arrayops.jl b/test/arrayops.jl index 2f1b4309bc9b2..a12860f036fcd 100644 --- a/test/arrayops.jl +++ b/test/arrayops.jl @@ -1542,6 +1542,8 @@ end @test min(CartesianIndex((2,3)), CartesianIndex((5,2))) == CartesianIndex((2,2)) @test max(CartesianIndex((2,3)), CartesianIndex((5,2))) == CartesianIndex((5,3)) + @test [I1...] == [I1[n] for n in 1:length(I1)] + # CartesianIndex allows construction at a particular dimensionality @test length(CartesianIndex{3}()) == 3 @test length(CartesianIndex{3}(1,2)) == 3