Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import std.stdio;
- import std.typetuple;
- import std.conv;
- import std.traits;
- template Cat(T...) {
- template Impl(string cont, uint n, T...) {
- static if(T.length == 1) {
- const string Impl = cont ~ "T[" ~ n.to!string ~ "] f" ~ n.to!string ~ ";}";
- } else {
- const string Impl = Impl!(cont ~ "T[" ~ n.to!string ~ "] f" ~ n.to!string ~ ";", n + 1, T[1 .. $]);
- }
- }
- mixin(Impl!("static struct Container {", 0, T));
- alias Cat = Container;
- }
- template CatRawGet(Cat, uint n) {
- alias CatRawGet = FieldTypeTuple!(Cat)[n];
- }
- template CatGet(C, F) {
- alias T = FieldTypeTuple!C;
- alias Field = T[0];
- alias Value = T[1];
- static if(T.length == 2) {
- static if(is(F == Field)) {
- alias CatGet = Value;
- } else {
- static assert(0, "Field " ~ F.stringof ~ " not found.");
- }
- } else static if(is(F == Field)) {
- alias CatGet = Value;
- } else {
- alias CatGet = CatGet!(Cat!(T[2 .. $]), F);
- }
- }
- template CatSet(C, F, V) {
- alias T = FieldTypeTuple!C;
- pragma(msg, FieldTypeTuple!C);
- alias Field = T[0];
- alias Value = T[1];
- static if(T.length == 2) {
- static if(is(F == Field)) {
- alias CatSet = Cat!(F, V);
- } else {
- static assert(0, "Field " ~ F.stringof ~ " not found.");
- }
- } else static if(is(F == Field)) {
- alias CatSet = Cat!(F, V, Cat!(T[2 .. $]));
- } else {
- alias CatSet = Cat!(Field, Value, FieldTypeTuple!(CatSet!(Cat!(T[2 .. $]), F, V)));
- }
- }
- struct PairLeft { }
- struct PairRight { }
- template PairNew(X, Y) {
- alias PairNew = Cat!(PairLeft, X, PairRight, Y);
- }
- struct N0 { }
- struct N1 { }
- template Succ(Num) {
- static if(is(Num == N0)) {
- alias Succ = N1;
- } else static if(is(Num == N1)) {
- alias Succ = PairNew!(N1, N0);
- } else static if(is(CatGet!(Num, PairRight) == N0)) {
- alias Succ = PairNew!(CatGet!(Num, PairLeft), N1);
- } else static if(is(CatGet!(Num, PairRight) == N1)) {
- alias Succ = PairNew!(Succ!(CatGet!(Num, PairLeft)), N0);
- } else {
- static assert(0, "Err");
- }
- }
- void main() {
- alias Q = PairNew!(PairNew!(PairNew!(N1, N1), N1), N1);
- alias R = Succ!(Q);
- alias P = PairNew!(PairNew!(PairNew!(PairNew!(N1, N0), N0), N0), N0);
- static assert(is(R == P));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement