Skip to content

Commit 6b90b4d

Browse files
committed
more iterator trait declarations
make HasEltype and HasLength the default
1 parent eb0e591 commit 6b90b4d

12 files changed

+35
-20
lines changed

base/channels.jl

+2
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,5 @@ function done(c::Channel, state::Ref)
9595
end
9696
end
9797
next{T}(c::Channel{T}, state) = (v=get(state[]); state[]=nothing; (v, state))
98+
99+
iteratorsize{C<:Channel}(::Type{C}) = SizeUnknown()

base/dict.jl

-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44

55
abstract Associative{K,V}
66

7-
iteratorsize{T<:Associative}(::Type{T}) = HasLength()
8-
iteratoreltype{T<:Associative}(::Type{T}) = HasEltype()
9-
107
const secret_table_token = :__c782dbf1cf4d6a2e5e3865d7e95634f2e09b5902__
118

129
haskey(d::Associative, k) = in(k,keys(d))

base/generator.jl

+4-6
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ abstract IteratorSize
2626
immutable SizeUnknown <: IteratorSize end
2727
immutable HasLength <: IteratorSize end
2828
immutable HasShape <: IteratorSize end
29+
immutable IsInfinite <: IteratorSize end
2930

3031
iteratorsize(x) = iteratorsize(typeof(x))
31-
iteratorsize(::Type) = SizeUnknown()
32+
iteratorsize(::Type) = HasLength() # HasLength is the default
3233

3334
and_iteratorsize{T}(isz::T, ::T) = isz
3435
and_iteratorsize(::HasLength, ::HasShape) = HasLength()
@@ -40,19 +41,16 @@ immutable EltypeUnknown <: IteratorEltype end
4041
immutable HasEltype <: IteratorEltype end
4142

4243
iteratoreltype(x) = iteratoreltype(typeof(x))
43-
iteratoreltype(::Type) = EltypeUnknown()
44+
iteratoreltype(::Type) = HasEltype() # HasEltype is the default
4445

4546
and_iteratoreltype{T}(iel::T, ::T) = iel
4647
and_iteratoreltype(a, b) = EltypeUnknown()
4748

4849
iteratorsize{T<:AbstractArray}(::Type{T}) = HasShape()
49-
iteratorsize{T<:AbstractString}(::Type{T}) = HasLength()
50-
iteratorsize{T<:Tuple}(::Type{T}) = HasLength()
5150
iteratorsize{I,F}(::Type{Generator{I,F}}) = iteratorsize(I)
5251
length(g::Generator) = length(g.iter)
5352
size(g::Generator) = size(g.iter)
5453

55-
iteratoreltype{T<:AbstractArray}(::Type{T}) = HasEltype()
56-
iteratoreltype{T<:AbstractString}(::Type{T}) = HasEltype()
54+
iteratoreltype{I,T}(::Type{Generator{I,T}}) = EltypeUnknown()
5755
iteratoreltype{I,T}(::Type{Generator{I,Type{T}}}) = HasEltype()
5856
eltype{I,T}(::Type{Generator{I,Type{T}}}) = T

base/io.jl

+2
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,8 @@ eltype(::Type{EachLine}) = ByteString
378378

379379
readlines(s=STDIN) = collect(eachline(s))
380380

381+
iteratorsize(::Type{EachLine}) = SizeUnknown()
382+
381383
# IOStream Marking
382384
# Note that these functions expect that io.mark exists for
383385
# the concrete IO type. This may not be true for IO types

base/iterator.jl

+8-2
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ done(f::Filter, s) = s[1]
125125

126126
eltype{I}(::Type{Filter{I}}) = eltype(I)
127127
iteratoreltype{F,I}(::Type{Filter{F,I}}) = iteratoreltype(I)
128+
iteratorsize{T<:Filter}(::Type{T}) = SizeUnknown()
128129

129130
# Rest -- iterate starting at the given state
130131

@@ -140,6 +141,7 @@ done(i::Rest, st) = done(i.itr, st)
140141

141142
eltype{I}(::Type{Rest{I}}) = eltype(I)
142143
iteratoreltype{I,S}(::Type{Rest{I,S}}) = iteratoreltype(I)
144+
iteratorsize{T<:Rest}(::Type{T}) = SizeUnknown()
143145

144146
# Count -- infinite counting
145147

@@ -152,12 +154,13 @@ countfrom(start::Number) = Count(start, one(start))
152154
countfrom() = Count(1, 1)
153155

154156
eltype{S}(::Type{Count{S}}) = S
155-
iteratoreltype{I<:Count}(::Type{I}) = HasEltype()
156157

157158
start(it::Count) = it.start
158159
next(it::Count, state) = (state, state + it.step)
159160
done(it::Count, state) = false
160161

162+
iteratorsize{S}(::Type{Count{S}}) = IsInfinite()
163+
161164
# Take -- iterate through the first n elements
162165

163166
immutable Take{I}
@@ -168,6 +171,7 @@ take(xs, n::Int) = Take(xs, n)
168171

169172
eltype{I}(::Type{Take{I}}) = eltype(I)
170173
iteratoreltype{I}(::Type{Take{I}}) = iteratoreltype(I)
174+
iteratorsize{T<:Take}(::Type{T}) = SizeUnknown() # TODO
171175

172176
start(it::Take) = (it.n, start(it.xs))
173177

@@ -192,6 +196,7 @@ drop(xs, n::Int) = Drop(xs, n)
192196

193197
eltype{I}(::Type{Drop{I}}) = eltype(I)
194198
iteratoreltype{I}(::Type{Drop{I}}) = iteratoreltype(I)
199+
iteratorsize{T<:Drop}(::Type{T}) = SizeUnknown() # TODO
195200

196201
function start(it::Drop)
197202
xs_state = start(it.xs)
@@ -217,6 +222,7 @@ cycle(xs) = Cycle(xs)
217222

218223
eltype{I}(::Type{Cycle{I}}) = eltype(I)
219224
iteratoreltype{I}(::Type{Cycle{I}}) = iteratoreltype(I)
225+
iteratorsize{I}(::Type{Cycle{I}}) = IsInfinite()
220226

221227
function start(it::Cycle)
222228
s = start(it.xs)
@@ -241,7 +247,7 @@ immutable Repeated{O}
241247
end
242248
repeated(x) = Repeated(x)
243249
eltype{O}(::Type{Repeated{O}}) = O
244-
iteratoreltype{O}(::Type{Repeated{O}}) = HasEltype()
250+
iteratorsize{O}(::Type{Repeated{O}}) = IsInfinite()
245251
start(it::Repeated) = nothing
246252
next(it::Repeated, state) = (it.x, nothing)
247253
done(it::Repeated, state) = false

base/libgit2/reference.jl

+2
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ function Base.next(bi::GitBranchIter, state)
181181
return (state[1:2], (GitReference(ref_ptr_ptr[]), btype[1], false))
182182
end
183183

184+
Base.iteratorsize(::Type{GitBranchIter}) = Base.SizeUnknown()
185+
184186
function Base.map(f::Function, bi::GitBranchIter)
185187
res = nothing
186188
s = start(bi)

base/libgit2/walker.jl

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ function Base.next(w::GitRevWalker, state)
2525
return (state[1], (id_ptr[], false))
2626
end
2727

28+
Base.iteratorsize(::Type{GitRevWalker}) = Base.SizeUnknown()
29+
2830
function push_head!(w::GitRevWalker)
2931
@check ccall((:git_revwalk_push_head, :libgit2), Cint, (Ptr{Void},), w.ptr)
3032
return w

base/multidimensional.jl

+7-4
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, 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,7 @@ end
103103
end
104104

105105
eltype{I}(::Type{CartesianRange{I}}) = I
106+
iteratorsize{I}(::Type{CartesianRange{I}}) = Base.HasShape()
106107

107108
@generated function start{I<:CartesianIndex}(iter::CartesianRange{I})
108109
N = length(I)
@@ -135,13 +136,15 @@ start{I<:CartesianIndex{0}}(iter::CartesianRange{I}) = false
135136
next{I<:CartesianIndex{0}}(iter::CartesianRange{I}, state) = iter.start, true
136137
done{I<:CartesianIndex{0}}(iter::CartesianRange{I}, state) = state
137138

138-
@generated function length{I<:CartesianIndex}(iter::CartesianRange{I})
139+
@generated function size{I<:CartesianIndex}(iter::CartesianRange{I})
139140
N = length(I)
140-
N == 0 && return 1
141+
N == 0 && return ()
141142
args = [:(iter.stop[$i]-iter.start[$i]+1) for i=1:N]
142-
Expr(:call,:*,args...)
143+
Expr(:tuple,args...)
143144
end
144145

146+
length(iter::CartesianRange) = prod(size(iter))
147+
145148
last(iter::CartesianRange) = iter.stop
146149

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

base/regex.jl

+1
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ compile(itr::RegexMatchIterator) = (compile(itr.regex); itr)
327327
eltype(::Type{RegexMatchIterator}) = RegexMatch
328328
start(itr::RegexMatchIterator) = match(itr.regex, itr.string, 1, UInt32(0))
329329
done(itr::RegexMatchIterator, prev_match) = (prev_match === nothing)
330+
iteratorsize(::Type{RegexMatchIterator}) = SizeUnknown()
330331

331332
# Assumes prev_match is not nothing
332333
function next(itr::RegexMatchIterator, prev_match)

base/task.jl

+2
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,8 @@ function done(t::Task, val)
253253
istaskdone(t)
254254
end
255255
next(t::Task, val) = (t.result, nothing)
256+
iteratorsize(::Type{Task}) = SizeUnknown()
257+
iteratoreltype(::Type{Task}) = EltypeUnknown()
256258

257259
isempty(::Task) = error("isempty not defined for Tasks")
258260

test/simdloop.jl

+4-4
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

test/unicode/utf8proc.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ let grphtest = (("b\u0300lahβlahb\u0302láh", ["b\u0300","l","a","h",
244244
@test typeof(first(graphemes(s_))) == SubString{typeof(s_)}
245245
end
246246
grph = collect(graphemes(s_))
247-
@test isempty(grph) || eltype(grph) == SubString{typeof(s_)}
247+
@test eltype(grph) == SubString{typeof(s_)}
248248
@test grph == g_
249249
@test length(graphemes(s_)) == length(grph)
250250
end

0 commit comments

Comments
 (0)