@@ -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... )
@@ -154,7 +182,7 @@ copy!(dest::Array{T}, src::Array{T}) where {T} = copy!(dest, 1, src, 1, length(s
154
182
copy (a:: T ) where {T<: Array } = ccall (:jl_array_copy , Ref{T}, (Any,), a)
155
183
156
184
function reinterpret (:: Type{T} , a:: Array{S,1} ) where T where S
157
- nel = Int (div (length (a)* sizeof (S),sizeof (T)))
185
+ nel = Int (div (length (a) * sizeof (S), sizeof (T)))
158
186
# TODO : maybe check that remainder is zero?
159
187
return reinterpret (T, a, (nel,))
160
188
end
@@ -173,7 +201,7 @@ function reinterpret(::Type{T}, a::Array{S}, dims::NTuple{N,Int}) where T where
173
201
end
174
202
isbits (T) || throwbits (S, T, T)
175
203
isbits (S) || throwbits (S, T, S)
176
- nel = div (length (a)* sizeof (S),sizeof (T))
204
+ nel = div (length (a) * sizeof (S), sizeof (T))
177
205
if prod (dims) != nel
178
206
_throw_dmrsa (dims, nel)
179
207
end
0 commit comments