Listing 4: Class order_by implementation

//order_by.h
#ifndef __ORDER_BY_H__
#define __ORDER_BY_H__

#include <algorithm>
#include <iterator>
#include <Typelist.h>

template <typename CONT, typename TLIST, int i = 0>
class order_by
{
private:
  typedef typename CONT::iterator iter;
  enum{n = Loki::TL::Length<TLIST>::value};
  typedef typename Loki::TL::TypeAt<TLIST, i>::Result
    comp_type;

public:
  order_by(iter begin, iter end)
  {
    std::sort(begin, end, comp_type());
    pair<iter, iter> range;
    while(true)
    {
      range = std::equal_range(begin, end, *begin, comp_type());
      if(range.first == end)
        return;
      order_by<CONT, TLIST, ((i+1==n)?(0xFFFF):(i+1))>
        o(range.first, range.second);
      begin = range.second;
    }
  }
};

//specialized object to end template recursion
template <typename CONT, typename TLIST>
class order_by<CONT, TLIST, 0xFFFF>
{
private:
  typedef typename CONT::iterator iter;

public:
  order_by(iter begin, iter end){}
};

#endif