@@ -109,8 +109,36 @@ size(a::Array{<:Any,N}) where {N} = (@_inline_meta; ntuple(M -> size(a, M), Val(
109
109
110
110
asize_from (a:: Array , n) = n > ndims (a) ? () : (arraysize (a,n), asize_from (a, n+ 1 )... )
111
111
112
+ """
113
+ Base.isbitsunion(::Type{T})
114
+
115
+ Return whether a type is an "is-bits" Union type, meaning each type included in a Union is `isbits`.
116
+ """
117
+ function isbitsunion end
118
+
119
+ function isbitsunion (U:: Union )
120
+ for u in Base. uniontypes (U)
121
+ isbits (u) || return false
122
+ end
123
+ return true
124
+ end
125
+ isbitsunion (T) = false
126
+
127
+ """
128
+ Base.bitsunionsize(U::Union)
129
+
130
+ For a Union of `isbits` types, return the size of the largest type.
131
+ """
132
+ function bitsunionsize (U:: Union )
133
+ sz = 0
134
+ for u in Base. uniontypes (U)
135
+ sz = max (sz, sizeof (u))
136
+ end
137
+ return sz
138
+ end
139
+
112
140
length (a:: Array ) = arraylen (a)
113
- elsize (a:: Array{T} ) where {T} = isbits (T) ? sizeof (T) : sizeof (Ptr)
141
+ elsize (a:: Array{T} ) where {T} = isbits (T) ? sizeof (T) : ( isbitsunion (T) ? bitsunionsize (T) : sizeof (Ptr) )
114
142
sizeof (a:: Array ) = Core. sizeof (a)
115
143
116
144
function isassigned (a:: Array , i:: Int... )
@@ -187,7 +215,7 @@ original.
187
215
copy (a:: T ) where {T<: Array } = ccall (:jl_array_copy , Ref{T}, (Any,), a)
188
216
189
217
function reinterpret (:: Type{T} , a:: Array{S,1} ) where T where S
190
- nel = Int (div (length (a)* sizeof (S),sizeof (T)))
218
+ nel = Int (div (length (a) * sizeof (S), sizeof (T)))
191
219
# TODO : maybe check that remainder is zero?
192
220
return reinterpret (T, a, (nel,))
193
221
end
@@ -206,7 +234,7 @@ function reinterpret(::Type{T}, a::Array{S}, dims::NTuple{N,Int}) where T where
206
234
end
207
235
isbits (T) || throwbits (S, T, T)
208
236
isbits (S) || throwbits (S, T, S)
209
- nel = div (length (a)* sizeof (S),sizeof (T))
237
+ nel = div (length (a) * sizeof (S), sizeof (T))
210
238
if prod (dims) != nel
211
239
_throw_dmrsa (dims, nel)
212
240
end
0 commit comments