|
616 | 616 | end |
617 | 617 | @inline _has_ragged_end(x, xs...) = _has_ragged_end(x) || _has_ragged_end(xs) |
618 | 618 |
|
| 619 | +# Helper function to resolve RaggedEnd objects in a tuple of arguments |
| 620 | +@inline function _resolve_ragged_end_args(A::AbstractVectorOfArray, args::Tuple) |
| 621 | + # Handle empty tuple case |
| 622 | + length(args) == 0 && return args |
| 623 | + if !_has_ragged_end(args...) |
| 624 | + return args |
| 625 | + end |
| 626 | + # For now, we need to resolve only the last argument if it's RaggedEnd (column selector) |
| 627 | + # This handles the common case sol[:x, end] where end gets converted to RaggedEnd(0, lastindex) |
| 628 | + if args[end] isa RaggedEnd |
| 629 | + resolved_last = _column_indices(A, args[end]) |
| 630 | + if length(args) == 1 |
| 631 | + return (resolved_last,) |
| 632 | + else |
| 633 | + return (Base.front(args)..., resolved_last) |
| 634 | + end |
| 635 | + elseif args[end] isa RaggedRange |
| 636 | + resolved_last = _resolve_ragged_index(args[end], A, 1) |
| 637 | + if length(args) == 1 |
| 638 | + return (resolved_last,) |
| 639 | + else |
| 640 | + return (Base.front(args)..., resolved_last) |
| 641 | + end |
| 642 | + end |
| 643 | + return args |
| 644 | +end |
| 645 | + |
619 | 646 | @inline function _ragged_getindex(A::AbstractVectorOfArray, I...) |
620 | 647 | n = ndims(A) |
621 | 648 | # Special-case when user provided one fewer index than ndims(A): last index is column selector. |
@@ -752,7 +779,9 @@ Base.@propagate_inbounds function Base.getindex(A::AbstractVectorOfArray, _arg, |
752 | 779 | _getindex(A, symtype, _arg, args...) |
753 | 780 | end |
754 | 781 | else |
755 | | - _getindex(A, symtype, elsymtype, _arg, args...) |
| 782 | + # Resolve any RaggedEnd objects in args before passing to symbolic indexing |
| 783 | + resolved_args = _resolve_ragged_end_args(A, args) |
| 784 | + _getindex(A, symtype, elsymtype, _arg, resolved_args...) |
756 | 785 | end |
757 | 786 | end |
758 | 787 |
|
|
0 commit comments