Skip to content

Commit d7ef4cc

Browse files
committed
Add default IsScalar trait
1 parent 13008a5 commit d7ef4cc

File tree

4 files changed

+12
-2
lines changed

4 files changed

+12
-2
lines changed

base/array.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ promote_rule{T,n,S}(::Type{Array{T,n}}, ::Type{Array{S,n}}) = Array{promote_type
206206

207207
# make a collection similar to `c` and appropriate for collecting `itr`
208208
_similar_for(c::AbstractArray, T, itr, ::SizeUnknown) = similar(c, T, 0)
209+
_similar_for(c::AbstractArray, T, itr, ::IsScalar) = similar(c, T, ())
209210
_similar_for(c::AbstractArray, T, itr, ::HasLength) = similar(c, T, Int(length(itr)::Integer))
210211
_similar_for(c::AbstractArray, T, itr, ::HasShape) = similar(c, T, convert(Dims,size(itr)))
211212
_similar_for(c, T, itr, isz) = similar(c, T)
@@ -226,7 +227,7 @@ collect(itr) = _collect(1:1 #= Array =#, itr, iteratoreltype(itr), iteratorsize(
226227

227228
collect_similar(cont, itr) = _collect(cont, itr, iteratoreltype(itr), iteratorsize(itr))
228229

229-
_collect(cont, itr, ::HasEltype, isz::Union{HasLength,HasShape}) =
230+
_collect(cont, itr, ::HasEltype, isz::Union{HasLength,HasShape,IsScalar}) =
230231
copy!(_similar_for(cont, eltype(itr), itr, isz), itr)
231232

232233
function _collect(cont, itr, ::HasEltype, isz::SizeUnknown)

base/generator.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,19 @@ end
2929

3030
abstract IteratorSize
3131
immutable SizeUnknown <: IteratorSize end
32+
immutable IsScalar <: IteratorSize end
3233
immutable HasLength <: IteratorSize end
3334
immutable HasShape <: IteratorSize end
3435
immutable IsInfinite <: IteratorSize end
3536

3637
iteratorsize(x) = iteratorsize(typeof(x))
37-
iteratorsize(::Type) = HasLength() # HasLength is the default
38+
iteratorsize(::Type) = IsScalar() # IsScalar is the default
3839

3940
and_iteratorsize{T}(isz::T, ::T) = isz
4041
and_iteratorsize(::HasLength, ::HasShape) = HasLength()
4142
and_iteratorsize(::HasShape, ::HasLength) = HasLength()
43+
and_iteratorsize(::IsScalar, ::Union{HasLength,HasShape}) = IsScalar()
44+
and_iteratorsize(::Union{HasLength,HasShape}, ::IsScalar) = IsScalar()
4245
and_iteratorsize(a, b) = SizeUnknown()
4346

4447
abstract IteratorEltype

base/iterator.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ iteratoreltype{I}(::Type{Enumerate{I}}) = iteratoreltype(I)
3838
abstract AbstractZipIterator
3939

4040
zip_iteratorsize(a, b) = and_iteratorsize(a,b) # as `and_iteratorsize` but inherit `Union{HasLength,IsInfinite}` of the shorter iterator
41+
zip_iteratorsize(::IsScalar, ::IsInfinite) = IsScalar()
4142
zip_iteratorsize(::HasLength, ::IsInfinite) = HasLength()
4243
zip_iteratorsize(::HasShape, ::IsInfinite) = HasLength()
4344
zip_iteratorsize(a::IsInfinite, b) = zip_iteratorsize(b,a)
@@ -413,6 +414,9 @@ iteratorsize{I1,I2}(::Type{Prod{I1,I2}}) = prod_iteratorsize(iteratorsize(I1),it
413414
((x[1][1],x[1][2]...), x[2])
414415
end
415416

417+
prod_iteratorsize(::IsScalar, ::IsScalar) = IsScalar()
418+
prod_iteratorsize(::IsScalar, isz::Union{HasLength,HasShape}) = isz
419+
prod_iteratorsize(isz::Union{HasLength,HasShape}, ::IsScalar) = isz
416420
prod_iteratorsize(::Union{HasLength,HasShape}, ::Union{HasLength,HasShape}) = HasShape()
417421
# products can have an infinite iterator
418422
prod_iteratorsize(::IsInfinite, ::IsInfinite) = IsInfinite()

base/tuple.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ getindex(t::Tuple, b::AbstractArray{Bool}) = getindex(t,find(b))
1212

1313
## iterating ##
1414

15+
iteratorsize(::Tuple) = HasLength()
16+
1517
start(t::Tuple) = 1
1618
done(t::Tuple, i::Int) = (length(t) < i)
1719
next(t::Tuple, i::Int) = (t[i], i+1)

0 commit comments

Comments
 (0)