On Saturday, 9 July 2022 at 23:04:20 UTC, anonymouse wrote:
On Saturday, 9 July 2022 at 14:46:36 UTC, Adam D Ruppe wrote:
Impossible; Variant's type is only known at runtime, and this
would require compile time knowledge.
Hmmm. Okay, thanks. What I really need to know is how many
dimensions an array has and the total elements per dimension so
that I can create temporary storage for it later.
this(T)(T a)
in(imported!"std.traits".isDynamic!T)
{
data = a; // data is of type Variant
shape = [a.length, {?, ...}]; // what's the best way
to deterine?
}
Thanks,
--anonymouse
```d
import std.variant : Variant;
size_t[] shape(Variant v) {
import std.variant : VariantException;
size_t[] s;
try {
while (true) {
Variant elem = v[0];
s ~= v.length;
v = elem;
}
} catch (VariantException e) {
return s;
}
}
unittest {
assert([3, 1] == [[1], [2], [3]].Variant.shape);
assert([2, 1] == [[1], [2]].Variant.shape);
assert([2, 2] == [[1, 0], [2, 0]].Variant.shape);
assert([2] == [1, 2].Variant.shape);
assert([] == 2.Variant.shape);
// irregularity not checked
assert([2, 2] == [[1, 0], [2]].Variant.shape);
// arguably should be [2, 0]
assert([2] == [[], []].Variant.shape);
}
```