http://d.puremagic.com/issues/show_bug.cgi?id=7666


Andrej Mitrovic <andrej.mitrov...@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |andrej.mitrov...@gmail.com


--- Comment #1 from Andrej Mitrovic <andrej.mitrov...@gmail.com> 2012-10-27 
15:07:05 PDT ---
First thing I could come up with, but it requires editing the Tuple!() struct.
A public alias is added in Tuple struct:

alias Reverse!fieldSpecs revFieldSpecs; 

And the internal FieldSpec struct is moved outside and made public. Then the
following is possible:


auto reversed(T)(T tup)
    if (isTuple!T)
{
    static string getMixin(T)()
    {
        string[] result;
        foreach (i; 0 .. T.Types.length)
        {
            result ~= xformat("tup.field[%d]", i);
        }

        return result.retro.join(", ");
    }

    static string getSpecs(T)()
    {
        string[] result;
        foreach (spec; T.revFieldSpecs)
        {
            result ~= spec.Type.stringof;
            result ~= xformat(`"%s"`, spec.name);
        }

        return result.join(", ");
    }

    enum str = xformat("return Tuple!(%s)(%s);", getSpecs!(T)(),
getMixin!(T)());
    mixin(str);
}

void main()
{
    alias Tuple!(int, "index", string, "value") Entry;
    Entry e;
    e.index = 4;
    e.value = "Hello";

    auto rev = reversed(e);
    assert(e.index == 4);
    assert(e.value == "Hello");
    writeln(e);
    writeln(rev);
}

Prints:
Tuple!(int,"index",string,"value")(4, "Hello")
Tuple!(string,"value",int,"index")("Hello", 4)

If there is a non-invasive way of doing this it would be welcome.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to