@@ -429,23 +429,27 @@ 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- # Use tuple (dim, offset) as runtime value instead of type parameter
432+ # Use runtime fields instead of type parameters for type stability
433433struct RaggedEnd
434- data:: Tuple{Int, Int} # (dimension, offset)
434+ dim:: Int
435+ offset:: Int
435436end
436- RaggedEnd (dim:: Int ) = RaggedEnd (( dim, 0 ) )
437+ RaggedEnd (dim:: Int ) = RaggedEnd (dim, 0 )
437438
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) ))
439+ Base.:+ (re:: RaggedEnd , n:: Integer ) = RaggedEnd (re. dim , re. offset + Int (n))
440+ Base.:- (re:: RaggedEnd , n:: Integer ) = RaggedEnd (re. dim , re. offset - Int (n))
440441Base.:+ (n:: Integer , re:: RaggedEnd ) = re + n
441442
442443struct RaggedRange
443- data:: Tuple{Int, Int, Int, Int} # (dim, start, step, offset)
444+ dim:: Int
445+ start:: Int
446+ step:: Int
447+ offset:: Int
444448end
445449
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 ]) )
450+ Base.:(:)(stop:: RaggedEnd ) = RaggedRange (stop. dim , 1 , 1 , stop. offset )
451+ Base.:(:)(start:: Integer , stop:: RaggedEnd ) = RaggedRange (stop. dim , Int (start), 1 , stop. offset )
452+ Base.:(:)(start:: Integer , step:: Integer , stop:: RaggedEnd ) = RaggedRange (stop. dim , Int (start), Int (step), stop. offset )
449453
450454@inline function _is_ragged_dim (VA:: AbstractVectorOfArray , d:: Integer )
451455 length (VA. u) <= 1 && return false
@@ -533,17 +537,11 @@ end
533537
534538@inline _resolve_ragged_index (idx, :: AbstractVectorOfArray , :: Any ) = idx
535539@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
540+ return lastindex (VA. u[col], idx. dim) + idx. offset
539541end
540542@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)
543+ stop_val = lastindex (VA. u[col], idx. dim) + idx. offset
544+ return Base. range (idx. start; step = idx. step, stop = stop_val)
547545end
548546@inline function _resolve_ragged_index (idx:: AbstractRange{<:RaggedEnd} , VA:: AbstractVectorOfArray , col)
549547 return Base. range (_resolve_ragged_index (first (idx), VA, col); step = step (idx),
0 commit comments