Skip to content

Commit 36561a0

Browse files
committed
avoid type parameter
1 parent e5a9c0b commit 36561a0

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

src/vector_of_array.jl

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ end
407407
return lastindex(VA.u)
408408
elseif d < ndims(VA)
409409
isempty(VA.u) && return 0
410-
return _is_ragged_dim(VA, d) ? RaggedEnd{d}() : size(VA.u[1], d)
410+
return RaggedEnd(Int(d))
411411
else
412412
return 1
413413
end
@@ -429,24 +429,23 @@ Base.getindex(A::AbstractDiffEqArray, I::AbstractArray{Int}) = A.u[I]
429429
__parameterless_type(T) = Base.typename(T).wrapper
430430

431431
# `end` support for ragged inner arrays
432-
struct RaggedEnd{D}
433-
offset::Int
432+
# Use tuple (dim, offset) as runtime value instead of type parameter
433+
struct RaggedEnd
434+
data::Tuple{Int, Int} # (dimension, offset)
434435
end
435-
RaggedEnd{D}() where {D} = RaggedEnd{D}(0)
436+
RaggedEnd(dim::Int) = RaggedEnd((dim, 0))
436437

437-
Base.:+(re::RaggedEnd{D}, n::Integer) where {D} = RaggedEnd{D}(re.offset + Int(n))
438-
Base.:-(re::RaggedEnd{D}, n::Integer) where {D} = RaggedEnd{D}(re.offset - Int(n))
439-
Base.:+(n::Integer, re::RaggedEnd{D}) where {D} = re + n
438+
Base.:+(re::RaggedEnd, n::Integer) = RaggedEnd((re.data[1], re.data[2] + Int(n)))
439+
Base.:-(re::RaggedEnd, n::Integer) = RaggedEnd((re.data[1], re.data[2] - Int(n)))
440+
Base.:+(n::Integer, re::RaggedEnd) = re + n
440441

441-
struct RaggedRange{D}
442-
start::Int
443-
step::Int
444-
stop::RaggedEnd{D}
442+
struct RaggedRange
443+
data::Tuple{Int, Int, Int, Int} # (dim, start, step, offset)
445444
end
446445

447-
Base.:(:)(stop::RaggedEnd{D}) where {D} = RaggedRange{D}(1, 1, stop)
448-
Base.:(:)(start::Integer, stop::RaggedEnd{D}) where {D} = RaggedRange{D}(Int(start), 1, stop)
449-
Base.:(:)(start::Integer, step::Integer, stop::RaggedEnd{D}) where {D} = RaggedRange{D}(Int(start), Int(step), stop)
446+
Base.:(:)(stop::RaggedEnd) = RaggedRange((stop.data[1], 1, 1, stop.data[2]))
447+
Base.:(:)(start::Integer, stop::RaggedEnd) = RaggedRange((stop.data[1], Int(start), 1, stop.data[2]))
448+
Base.:(:)(start::Integer, step::Integer, stop::RaggedEnd) = RaggedRange((stop.data[1], Int(start), Int(step), stop.data[2]))
450449

451450
@inline function _is_ragged_dim(VA::AbstractVectorOfArray, d::Integer)
452451
length(VA.u) <= 1 && return false
@@ -533,12 +532,18 @@ end
533532
end
534533

535534
@inline _resolve_ragged_index(idx, ::AbstractVectorOfArray, ::Any) = idx
536-
@inline function _resolve_ragged_index(idx::RaggedEnd{D}, VA::AbstractVectorOfArray, col) where {D}
537-
return lastindex(VA.u[col], D) + idx.offset
538-
end
539-
@inline function _resolve_ragged_index(idx::RaggedRange{D}, VA::AbstractVectorOfArray, col) where {D}
540-
stop_val = _resolve_ragged_index(idx.stop, VA, col)
541-
return Base.range(idx.start; step = idx.step, stop = stop_val)
535+
@inline function _resolve_ragged_index(idx::RaggedEnd, VA::AbstractVectorOfArray, col)
536+
dim = idx.data[1]
537+
offset = idx.data[2]
538+
return lastindex(VA.u[col], dim) + offset
539+
end
540+
@inline function _resolve_ragged_index(idx::RaggedRange, VA::AbstractVectorOfArray, col)
541+
dim = idx.data[1]
542+
start_val = idx.data[2]
543+
step_val = idx.data[3]
544+
offset = idx.data[4]
545+
stop_val = lastindex(VA.u[col], dim) + offset
546+
return Base.range(start_val; step = step_val, stop = stop_val)
542547
end
543548
@inline function _resolve_ragged_index(idx::AbstractRange{<:RaggedEnd}, VA::AbstractVectorOfArray, col)
544549
return Base.range(_resolve_ragged_index(first(idx), VA, col); step = step(idx),

0 commit comments

Comments
 (0)