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)
434435end
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)
445444end
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
533532end
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)
542547end
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