|
1 | | -using .TypeParameterAccessors: IsWrappedArray, unwrap_array_type, set_eltype |
| 1 | +using Base: DimOrInd, Dims, OneTo |
| 2 | +using .TypeParameterAccessors: IsWrappedArray, unwrap_array_type, set_eltype, similartype |
2 | 3 |
|
3 | 4 | ## Custom `NDTensors.similar` implementation. |
4 | 5 | ## More extensive than `Base.similar`. |
|
96 | 97 | # Use the `size` to determine the dimensions |
97 | 98 | # NDTensors.similar |
98 | 99 | similar(array::AbstractArray) = NDTensors.similar(typeof(array), size(array)) |
99 | | - |
100 | | -## similartype |
101 | | - |
102 | | -function similartype(arraytype::Type{<:AbstractArray}, eltype::Type, dims::Tuple) |
103 | | - return similartype(similartype(arraytype, eltype), dims) |
104 | | -end |
105 | | - |
106 | | -@traitfn function similartype( |
107 | | - arraytype::Type{ArrayT}, eltype::Type |
108 | | -) where {ArrayT; !IsWrappedArray{ArrayT}} |
109 | | - return set_eltype(arraytype, eltype) |
110 | | -end |
111 | | - |
112 | | -@traitfn function similartype( |
113 | | - arraytype::Type{ArrayT}, dims::Tuple |
114 | | -) where {ArrayT; !IsWrappedArray{ArrayT}} |
115 | | - return set_indstype(arraytype, dims) |
116 | | -end |
117 | | - |
118 | | -function similartype(arraytype::Type{<:AbstractArray}, dims::DimOrInd...) |
119 | | - return similartype(arraytype, dims) |
120 | | -end |
121 | | - |
122 | | -function similartype(arraytype::Type{<:AbstractArray}) |
123 | | - return similartype(arraytype, eltype(arraytype)) |
124 | | -end |
125 | | - |
126 | | -## Wrapped arrays |
127 | | -@traitfn function similartype( |
128 | | - arraytype::Type{ArrayT}, eltype::Type |
129 | | -) where {ArrayT; IsWrappedArray{ArrayT}} |
130 | | - return similartype(unwrap_array_type(arraytype), eltype) |
131 | | -end |
132 | | - |
133 | | -@traitfn function similartype( |
134 | | - arraytype::Type{ArrayT}, dims::Tuple |
135 | | -) where {ArrayT; IsWrappedArray{ArrayT}} |
136 | | - return similartype(unwrap_array_type(arraytype), dims) |
137 | | -end |
138 | | - |
139 | | -# This is for uniform `Diag` storage which uses |
140 | | -# a Number as the data type. |
141 | | -# TODO: Delete this when we change to using a |
142 | | -# `FillArray` instead. This is a stand-in |
143 | | -# to make things work with the current design. |
144 | | -function similartype(numbertype::Type{<:Number}) |
145 | | - return numbertype |
146 | | -end |
147 | | - |
148 | | -# Instances |
149 | | -function similartype(array::AbstractArray, eltype::Type, dims...) |
150 | | - return similartype(typeof(array), eltype, dims...) |
151 | | -end |
152 | | -similartype(array::AbstractArray, eltype::Type) = similartype(typeof(array), eltype) |
153 | | -similartype(array::AbstractArray, dims...) = similartype(typeof(array), dims...) |
0 commit comments