Skip to content

Commit 24ebce0

Browse files
committed
more iterator trait declarations
1 parent dc593ad commit 24ebce0

File tree

11 files changed

+25
-10
lines changed

11 files changed

+25
-10
lines changed

base/dict.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,9 @@ isempty(v::Union{KeyIterator,ValueIterator}) = isempty(v.dict)
190190
_tt1{A,B}(::Type{Pair{A,B}}) = A
191191
_tt2{A,B}(::Type{Pair{A,B}}) = B
192192
eltype{D}(::Type{KeyIterator{D}}) = _tt1(eltype(D))
193+
iteratoreltype{D}(::Type{KeyIterator{D}}) = HasEltype()
193194
eltype{D}(::Type{ValueIterator{D}}) = _tt2(eltype(D))
195+
iteratoreltype{D}(::Type{ValueIterator{D}}) = HasEltype()
194196

195197
start(v::Union{KeyIterator,ValueIterator}) = start(v.dict)
196198
done(v::Union{KeyIterator,ValueIterator}, state) = done(v.dict, state)

base/generator.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,6 @@ size(g::Generator) = size(g.iter)
5454

5555
iteratoreltype{T<:AbstractArray}(::Type{T}) = HasEltype()
5656
iteratoreltype{T<:AbstractString}(::Type{T}) = HasEltype()
57+
iteratoreltype{T<:Union{Number,Char}}(::Type{T}) = HasEltype()
5758
iteratoreltype{I,T}(::Type{Generator{I,Type{T}}}) = HasEltype()
5859
eltype{I,T}(::Type{Generator{I,Type{T}}}) = T

base/intset.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ end
1212
IntSet(itr) = (s=IntSet(); for a in itr; push!(s,a); end; s)
1313

1414
eltype(::Type{IntSet}) = Int64
15+
iteratoreltype(::Type{IntSet}) = HasEltype()
1516
similar(s::IntSet) = IntSet()
1617

1718
function show(io::IO, s::IntSet)

base/io.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ function done(itr::EachLine, nada)
375375
end
376376
next(itr::EachLine, nada) = (readline(itr.stream), nothing)
377377
eltype(::Type{EachLine}) = ByteString
378+
iteratoreltype(::Type{EachLine}) = HasEltype()
378379

379380
readlines(s=STDIN) = collect(eachline(s))
380381

base/multidimensional.jl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
### Multidimensional iterators
44
module IteratorsMD
55

6-
import Base: eltype, length, start, done, next, last, getindex, setindex!, linearindexing, min, max, eachindex, ndims
6+
import Base: eltype, length, size, start, done, next, last, getindex, setindex!, linearindexing, min, max, eachindex, ndims, iteratoreltype, iteratorsize
77
importall ..Base.Operators
88
import Base: simd_outer_range, simd_inner_length, simd_index, @generated
99
import Base: @nref, @ncall, @nif, @nexprs, LinearFast, LinearSlow, to_index, AbstractCartesianIndex
@@ -103,6 +103,8 @@ end
103103
end
104104

105105
eltype{I}(::Type{CartesianRange{I}}) = I
106+
iteratoreltype{I}(::Type{CartesianRange{I}}) = Base.HasEltype()
107+
iteratorsize{I}(::Type{CartesianRange{I}}) = Base.HasShape()
106108

107109
@generated function start{I<:CartesianIndex}(iter::CartesianRange{I})
108110
N = length(I)
@@ -135,13 +137,15 @@ start{I<:CartesianIndex{0}}(iter::CartesianRange{I}) = false
135137
next{I<:CartesianIndex{0}}(iter::CartesianRange{I}, state) = iter.start, true
136138
done{I<:CartesianIndex{0}}(iter::CartesianRange{I}, state) = state
137139

138-
@generated function length{I<:CartesianIndex}(iter::CartesianRange{I})
140+
@generated function size{I<:CartesianIndex}(iter::CartesianRange{I})
139141
N = length(I)
140-
N == 0 && return 1
142+
N == 0 && return ()
141143
args = [:(iter.stop[$i]-iter.start[$i]+1) for i=1:N]
142-
Expr(:call,:*,args...)
144+
Expr(:tuple,args...)
143145
end
144146

147+
length(iter::CartesianRange) = prod(size(iter))
148+
145149
last(iter::CartesianRange) = iter.stop
146150

147151
@generated function simd_outer_range{I}(iter::CartesianRange{I})

base/regex.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ immutable RegexMatchIterator
325325
end
326326
compile(itr::RegexMatchIterator) = (compile(itr.regex); itr)
327327
eltype(::Type{RegexMatchIterator}) = RegexMatch
328+
iteratoreltype(::Type{RegexMatchIterator}) = HasEltype()
328329
start(itr::RegexMatchIterator) = match(itr.regex, itr.string, 1, UInt32(0))
329330
done(itr::RegexMatchIterator, prev_match) = (prev_match === nothing)
330331

base/set.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Set() = Set{Any}()
1010
Set(itr) = Set{eltype(itr)}(itr)
1111

1212
eltype{T}(::Type{Set{T}}) = T
13+
iteratoreltype{T<:AbstractSet}(::Type{T}) = HasEltype()
1314
similar{T}(s::Set{T}) = Set{T}()
1415

1516
function show(io::IO, s::Set)

base/strings/basic.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,8 @@ start(e::EachStringIndex) = start(e.s)
197197
next(e::EachStringIndex, state) = (state, nextind(e.s, state))
198198
done(e::EachStringIndex, state) = done(e.s, state)
199199
eltype(::Type{EachStringIndex}) = Int
200+
iteratoreltype(::Type{EachStringIndex}) = HasEltype()
201+
iteratorsize(::Type{EachStringIndex}) = HasLength()
200202

201203
typealias Chars Union{Char,Tuple{Vararg{Char}},AbstractVector{Char},Set{Char}}
202204

base/unicode/utf8proc.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Various Unicode functionality from the utf8proc library
44
module UTF8proc
55

6-
import Base: show, ==, hash, string, symbol, isless, length, eltype, start, next, done, convert, isvalid, lowercase, uppercase
6+
import Base: show, ==, hash, string, symbol, isless, length, eltype, start, next, done, convert, isvalid, lowercase, uppercase, iteratoreltype, iteratorsize
77

88
export isgraphemebreak
99

@@ -191,6 +191,8 @@ end
191191
graphemes(s::AbstractString) = GraphemeIterator{typeof(s)}(s)
192192

193193
eltype{S}(::Type{GraphemeIterator{S}}) = SubString{S}
194+
iteratoreltype{S}(::Type{GraphemeIterator{S}}) = Base.HasEltype()
195+
iteratorsize{S}(::Type{GraphemeIterator{S}}) = Base.HasLength()
194196

195197
function length(g::GraphemeIterator)
196198
c0 = Char(0x00ad) # soft hyphen (grapheme break always allowed after this)

test/simdloop.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,17 +104,17 @@ end
104104
crng = CartesianRange(CartesianIndex{4}(2,0,1,3),
105105
CartesianIndex{4}(4,1,1,5))
106106
indexes = simd_cartesian_range!(Array(eltype(crng), 0), crng)
107-
@test indexes == collect(crng)
107+
@test indexes == vec(collect(crng))
108108

109109
crng = CartesianRange(CartesianIndex{2}(-1,1),
110110
CartesianIndex{2}(1,3))
111111
indexes = simd_cartesian_range!(Array(eltype(crng), 0), crng)
112-
@test indexes == collect(crng)
112+
@test indexes == vec(collect(crng))
113113

114114
crng = CartesianRange(CartesianIndex{2}(-1,1),
115115
CartesianIndex{2}(-1,3))
116116
indexes = simd_cartesian_range!(Array(eltype(crng), 0), crng)
117-
@test indexes == collect(crng)
117+
@test indexes == vec(collect(crng))
118118

119119
crng = CartesianRange(CartesianIndex{1}(2),
120120
CartesianIndex{1}(4))
@@ -124,7 +124,7 @@ indexes = simd_cartesian_range!(Array(eltype(crng), 0), crng)
124124
crng = CartesianRange(CartesianIndex{0}(),
125125
CartesianIndex{0}())
126126
indexes = simd_cartesian_range!(Array(eltype(crng), 0), crng)
127-
@test indexes == collect(crng)
127+
@test indexes == vec(collect(crng))
128128

129129
# @simd with array as "range"
130130
# issue #13869

0 commit comments

Comments
 (0)