Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

struct Typedef( T ) {
T payload;
alias payload this;
}

alias Typedef!int myInt;

There you go.

Yah, perfect - that would be the subtype. I think we should work on adding a pseudo-supertype as well, and also on a completely independent type. Then we can add these abstractions to std.typecons.

Actually, alias this makes it more of a parallel type.
This code, however, allows for subtypes, supertypes, parallel types, as
well as independent types. please critique.

enum Type {
    Independent,
    Super,
    Sub,
    Parallel,
}

struct Typedef( T, T init = T.init, Type type = Type.Sub, string _f = __FILE__, int _l = __LINE__ ) {
    T payload = init;

    static if ( type != Type.Independent ) {
        this( T value ) {
            payload = value;
        }
    }
    static if ( type == Type.Sub || type == Type.Parallel ) {
        alias payload this;
    }
    static if ( type == Type.Super ) {
        typeof( this ) opAssign( T value ) {
            payload = value;
            return this;
        }
    } else static if ( type == Type.Sub ) {
        @disable
        void opAssign( T value );
    }
}

unittest {
    alias Typedef!( int, 1, Type.Super ) superInt;
    alias Typedef!( int, 2, Type.Sub ) subInt;
    alias Typedef!( int, 3, Type.Independent ) independentInt;
    alias Typedef!( int, 3, Type.Parallel ) parallelInt;

    int i;
    superInt m1;
    subInt m2;
    independentInt m3;
    parallelInt m4;

    // Construct
    static assert(  is( typeof({ superInt j = i; })));
    static assert(  is( typeof({ subInt j = i; })));
    static assert( !is( typeof({ IndependentInt j = i; })));
    static assert(  is( typeof({ parallelInt j = i; })));

    // Assign from base
    static assert(  is( typeof({ m1 = i; })));
    static assert( !is( typeof({ m2 = i; })));
    static assert( !is( typeof({ m3 = i; })));
    static assert(  is( typeof({ m4 = i; })));

    // Assign to base
    static assert( !is( typeof({ i = m1; })));
    static assert(  is( typeof({ i = m2; })));
    static assert( !is( typeof({ i = m3; })));
    static assert(  is( typeof({ i = m4; })));

    // Assign from other type
    static assert(  is( typeof({ m1 = m2; })));
    static assert( !is( typeof({ m2 = m1; })));
    static assert( !is( typeof({ m1 = m3; })));
    static assert( !is( typeof({ m2 = m3; })));
    static assert( !is( typeof({ m3 = m1; })));
    static assert( !is( typeof({ m3 = m2; })));
    static assert(  is( typeof({ m1 = m4; })));
    static assert( !is( typeof({ m2 = m4; })));
    static assert( !is( typeof({ m3 = m4; })));
    static assert( !is( typeof({ m4 = m1; })));
    static assert(  is( typeof({ m4 = m2; })));
    static assert( !is( typeof({ m4 = m3; })));
}

--
Simen

Reply via email to