Sunday, May 1, 2011

D Templates: Sort a list of types

Assume you have a type like the following:

struct Value(int v_)
{
  static const v = v_:
}

How would you sort a list of these types, assuming an interface something like this:

alias Sorted!(Value!(4), Value!(2), Value!(1), Value!(3)) SortedValues;

You may use D 2.x features if it makes for a better solution, but please state if you do so.

I'll post my solution in a day or so. :)

From stackoverflow
  • Using D 1.0, have a QuickSort!

    http://paste.dprogramming.com/dplgp5ic

    he_the_great : I would suggest putting the code some place different since "paste" is not permanent.
  • By the way unless you have other reasons to do it there is no need to wrap the value in structs as tuples work just fine with values as well.

    alias Sorted!(4, 2, 1, 3) SortedValues;
    
    DK : True; but I believe that tuples break with aliases. Using a wrapper struct was just the more general form of the question I could think of. :)
  • Here's my solution. Note quite as cool as FeepingCreature's, but probably simpler to understand; it works by recursively inserting the first type into the rest of the list (after having sorting it).

    module sort;
    
    /*
     * Tango users substitute "tango.core.Tuple" for "std.typetuple" and "Tuple"
     * for "TypeTuple".
     */
    
    import std.typetuple;
    
    struct Val(string v_)
    {
        static const v = v_;
    }
    
    template Sorted_impl(T)
    {
        alias TypeTuple!(T) Sorted_impl;
    }
    
    template Sorted_impl(T, U, V...){
    
        static if( T.v < U.v )
            alias TypeTuple!(T, U, V) Sorted_impl;
    
        else
            alias TypeTuple!(U, Sorted_impl!(T, V)) Sorted_impl;
    }
    
    template Sorted(T)
    {
        alias TypeTuple!(T) Sorted;
    }
    
    template Sorted(T, U...)
    {
        alias Sorted_impl!(T, Sorted_impl!(U)) Sorted;
    }
    
    pragma(msg, Sorted!(Val!("a")).stringof);
    
    pragma(msg, Sorted!(Val!("b"), Val!("a")).stringof);
    
    pragma(msg, Sorted!(
        Val!("d"), Val!("a"), Val!("b"), Val!("c")
    ).stringof);
    
    static assert( false, "nothing to compile here, move along..." );
    

0 comments:

Post a Comment