@propagate_inbounds function Base.getindex()

in src/arraytypes/list.jl [47:75]


@propagate_inbounds function Base.getindex(l::List{T}, i::Integer) where {T}
    @boundscheck checkbounds(l, i)
    @inbounds lo, hi = l.offsets[i]
    S = Base.nonmissingtype(T)
    K = ArrowTypes.ArrowKind(ArrowTypes.ArrowType(S))
    
    if ArrowTypes.isstringtype(K) || S <: Base.CodeUnits
        if S !== T
            if S <: Base.CodeUnits
                return l.validity[i] ?
                       Base.CodeUnits(unsafe_string(pointer(l.data, lo), hi - lo + 1)) :
                       missing
            else
                return l.validity[i] ?
                       ArrowTypes.fromarrow(T, pointer(l.data, lo), hi - lo + 1) : missing
            end
        else
            if S <: Base.CodeUnits
                return Base.CodeUnits(unsafe_string(pointer(l.data, lo), hi - lo + 1))
            else
                return ArrowTypes.fromarrow(T, pointer(l.data, lo), hi - lo + 1)
            end
        end
    elseif S !== T
        return l.validity[i] ? ArrowTypes.fromarrow(T, view(l.data, lo:hi)) : missing
    else
        return ArrowTypes.fromarrow(T, view(l.data, lo:hi))
    end
end