@@ -21,30 +21,32 @@ ArrayInitializer(unwrap = t->false) = ArrayInitializer(unwrap, default_array)
21
21
22
22
(s:: ArrayInitializer )(S, d) = s. unwrap (S) ? buildfromschema (typ -> s (typ, d), S) : s. default_array (S, d)
23
23
24
+ _reshape (v, itr) = _reshape (v, itr, Base. IteratorSize (itr))
24
25
_reshape (v, itr, :: Base.HasShape ) = reshape (v, axes (itr))
25
26
_reshape (v, itr, :: Union{Base.HasLength, Base.SizeUnknown} ) = v
26
27
27
28
function collect_structarray (itr; initializer = default_initializer)
28
- sz = Base. IteratorSize (itr)
29
- v = collect_structarray (itr, sz, initializer = initializer)
30
- _reshape (v, itr, sz)
29
+ fr = iterate (itr)
30
+ fr === nothing ? collect_empty_structarray (itr; initializer = initializer) : collect_structarray (itr, fr; initializer = initializer)
31
31
end
32
32
33
+ collect_structarray (itr, fr; initializer = default_initializer) =
34
+ collect_structarray (itr, fr, Base. IteratorSize (itr); initializer = initializer)
35
+
33
36
function collect_empty_structarray (itr:: T ; initializer = default_initializer) where {T}
34
37
S = Core. Compiler. return_type (first, Tuple{T})
35
- initializer (S, (0 ,))
38
+ res = initializer (S, (0 ,))
39
+ _reshape (res, itr)
36
40
end
37
41
38
- function collect_structarray (itr, :: Union{Base.HasShape, Base.HasLength} ;
42
+ function collect_structarray (itr, elem, sz :: Union{Base.HasShape, Base.HasLength} ;
39
43
initializer = default_initializer)
40
-
41
- st = iterate (itr)
42
- st === nothing && return collect_empty_structarray (itr, initializer = initializer)
43
- el, i = st
44
+ el, i = elem
44
45
S = typeof (el)
45
46
dest = initializer (S, (length (itr),))
46
47
dest[1 ] = el
47
- collect_to_structarray! (dest, itr, 2 , i)
48
+ v = collect_to_structarray! (dest, itr, 2 , i)
49
+ _reshape (v, itr, sz)
48
50
end
49
51
50
52
function collect_to_structarray! (dest:: AbstractArray{T} , itr, offs, st) where {T}
@@ -67,9 +69,7 @@ function collect_to_structarray!(dest::AbstractArray{T}, itr, offs, st) where {T
67
69
return dest
68
70
end
69
71
70
- function collect_structarray (itr, :: Base.SizeUnknown ; initializer = default_initializer)
71
- elem = iterate (itr)
72
- elem === nothing && return collect_empty_structarray (itr; initializer = initializer)
72
+ function collect_structarray (itr, elem, :: Base.SizeUnknown ; initializer = default_initializer)
73
73
el, st = elem
74
74
dest = initializer (typeof (el), (1 ,))
75
75
dest[1 ] = el
0 commit comments