Skip to content

Commit 13266b1

Browse files
committed
Fix type instability for exponent iterator with no variable
1 parent 014104d commit 13266b1

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

src/comparison.jl

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -459,11 +459,6 @@ struct ExponentsIterator{M,D<:Union{Nothing,Int},O}
459459
),
460460
)
461461
end
462-
if length(object) == 0 && isnothing(maxdegree)
463-
# Otherwise, it will incorrectly think that the iterator is infinite
464-
# while it actually has zero elements
465-
maxdegree = mindegree
466-
end
467462
return new{M,typeof(maxdegree),typeof(object)}(
468463
object,
469464
mindegree,
@@ -477,21 +472,39 @@ Base.eltype(::Type{ExponentsIterator{M,D,O}}) where {M,D,O} = O
477472
function Base.IteratorSize(::Type{<:ExponentsIterator{M,Nothing}}) where {M}
478473
return Base.IsInfinite()
479474
end
475+
function Base.IteratorSize(it::ExponentsIterator{M,Nothing}) where {M}
476+
if isempty(it.object)
477+
return Base.HasLength()
478+
end
479+
return Base.IsInfinite()
480+
end
480481
function Base.IteratorSize(::Type{<:ExponentsIterator{M,Int}}) where {M}
481482
return Base.HasLength()
482483
end
483484

484-
function Base.length(it::ExponentsIterator{M,Int}) where {M}
485-
if it.maxdegree < it.mindegree
485+
function _length(it::ExponentsIterator, maxdegree)
486+
if maxdegree < it.mindegree
486487
return 0
487488
end
488-
len = binomial(nvariables(it) + it.maxdegree, nvariables(it))
489+
len = binomial(nvariables(it) + maxdegree, nvariables(it))
489490
if it.mindegree > 0
490491
len -= binomial(nvariables(it) + it.mindegree - 1, nvariables(it))
491492
end
492493
return len
493494
end
494495

496+
function Base.length(it::ExponentsIterator{M,Int}) where {M}
497+
return _length(it, it.maxdegree)
498+
end
499+
500+
function Base.length(it::ExponentsIterator{M,Nothing}) where {M}
501+
if isempty(it.object)
502+
return _length(it, it.mindegree)
503+
else
504+
error("The iterator is infinity because `maxdegree` is `nothing`.")
505+
end
506+
end
507+
495508
nvariables(it::ExponentsIterator) = length(it.object)
496509

497510
_last_lex_index(n, ::Type{LexOrder}) = n

0 commit comments

Comments
 (0)