views:

110

answers:

3

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. :)

+3  A: 

Using D 1.0, have a QuickSort!

http://paste.dprogramming.com/dplgp5ic

FeepingCreature
I would suggest putting the code some place different since "paste" is not permanent.
he_the_great
+1  A: 

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;
BCS
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. :)
DK
A: 

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..." );
DK