|
| 1 | +using BlockArrays: AbstractBlockedUnitRange |
| 2 | +using ..LabelledNumbers: islabelled |
| 3 | + |
| 4 | +# Represents the range `1:1` or `Base.OneTo(1)`. |
| 5 | +struct OneToOne{T} <: AbstractUnitRange{T} end |
| 6 | +OneToOne() = OneToOne{Bool}() |
| 7 | +Base.first(a::OneToOne) = one(eltype(a)) |
| 8 | +Base.last(a::OneToOne) = one(eltype(a)) |
| 9 | + |
| 10 | +# == is just a range comparison that ignores labels. Need dedicated function to check equality. |
| 11 | +gradedisequal(::AbstractBlockedUnitRange, ::AbstractUnitRange) = false |
| 12 | +gradedisequal(::AbstractUnitRange, ::AbstractBlockedUnitRange) = false |
| 13 | +gradedisequal(::AbstractBlockedUnitRange, ::OneToOne) = false |
| 14 | +gradedisequal(::OneToOne, ::AbstractBlockedUnitRange) = false |
| 15 | +function gradedisequal(a1::AbstractBlockedUnitRange, a2::AbstractBlockedUnitRange) |
| 16 | + return blockisequal(a1, a2) |
| 17 | +end |
| 18 | +function gradedisequal(a1::AbstractGradedUnitRange, a2::AbstractGradedUnitRange) |
| 19 | + return blockisequal(a1, a2) && (blocklabels(a1) == blocklabels(a2)) |
| 20 | +end |
| 21 | +gradedisequal(::GradedUnitRangeDual, ::GradedUnitRange) = false |
| 22 | +gradedisequal(::GradedUnitRange, ::GradedUnitRangeDual) = false |
| 23 | +function gradedisequal(a1::GradedUnitRangeDual, a2::GradedUnitRangeDual) |
| 24 | + return gradedisequal(nondual(a1), nondual(a2)) |
| 25 | +end |
| 26 | + |
| 27 | +gradedisequal(::OneToOne, ::OneToOne) = true |
| 28 | + |
| 29 | +function gradedisequal(::OneToOne, g::AbstractUnitRange) |
| 30 | + return !islabelled(eltype(g)) && (first(g) == last(g) == 1) |
| 31 | +end |
| 32 | +gradedisequal(g::AbstractUnitRange, a0::OneToOne) = gradedisequal(a0, g) |
| 33 | + |
| 34 | +gradedisequal(::UnitRangeDual, ::AbstractUnitRange) = false |
| 35 | +gradedisequal(::AbstractUnitRange, ::UnitRangeDual) = false |
| 36 | +gradedisequal(::OneToOne, ::UnitRangeDual) = false |
| 37 | +gradedisequal(::UnitRangeDual, ::OneToOne) = false |
| 38 | +function gradedisequal(a1::UnitRangeDual, a2::UnitRangeDual) |
| 39 | + return gradedisequal(nondual(a1), nondual(a2)) |
| 40 | +end |
| 41 | + |
| 42 | +gradedisequal(a1::AbstractUnitRange, a2::AbstractUnitRange) = a1 == a2 |
0 commit comments