| |
 | Posted by Mr.Bingo | Permalink Reply |
|
Mr.Bingo 
| import std.stdio;
union Vector(T, size_t N = size_t.max)
{
import std.range, std.typecons, std.meta, std.algorithm, std.conv, std.math;
static if (N == size_t.max) // For size_t.max sets N to be infinite/dynamic;
{
mixin("Tuple!("~"T,".repeat(N).join()~") data;");
@property size_t Length() { return rect.length; }
@property double norm(size_t n = 2)()
{
return (iota(0,data.length).map!(a => data[a].pow(n))).pow(1/cast(double)n);
}
}
else
{
mixin("Tuple!("~"T,".repeat(N).join()~") data;");
@property size_t Length() { return N; }
@property double norm(size_t n = 2)()
{
mixin("return ("~(iota(0,N).map!(a => "data["~to!string(a)~"].pow(n)").join("+"))~").pow(1/cast(double)n);");
}
}
auto opDispatch(string s, Args...)(Args v)
if (s.length > 1 && s[0] == 'x')
{
static if (N == size_t.max)
if (data.length < to!int(s[1..$]))
for(int i = 0; i < to!int(s[1..$]) - data.length; i++) data ~= 0;
static if (Args.length == 0)
mixin(`return data[`~s[1..$]~`];`);
else static if (Args.length == 1)
mixin(`data[`~s[1..$]~`] = v[0]; `);
}
alias data this;
}
void main()
{
import std.math, std.variant;
Vector!(Algebraic!(Vector!int, int)) v;
//v.x1 = 3;
//v.x2 = 4;
//v.x3 = 5;
//writeln(v.x3);
//writeln(v.norm);
}
Trying to create a vector of vectors where any entry can be another vector of vectors or an int.
|