// generic bubble sort in C++
// pointer version written Jan 00 by Ulrich Stern

#include <iostream.h>

template<class Object, class Comparator>
void mysort(Object* a[], int n, Comparator cmp) {
  for(int i=0; i<n-1; i++)
    for(int j=n-1; j>i; j--)
      if(!cmp(a[j-1], a[j])) {
        Object* tmp = a[j-1];
        a[j-1] = a[j];
        a[j] = tmp;
      }
}

struct Range {
  int lb, ub;
  Range() {}
  Range(int l, int u): lb(l), ub(u) {}
};

ostream& operator << (ostream& out, const Range* r) {
  return out << '[' << r->lb << ',' << r->ub << ']';
}

struct LBComparator {
  bool operator() (const Range* a, const Range* b) const {
    return a->lb < b->lb;
  }
};

struct UBComparator {
  bool operator() (const Range* a, const Range* b) const {
    return a->ub < b->ub;
  }
};

int main() {
  const int N = 10000;
  Range* a[N];

  for(int i=0; i<N; i++)
    a[i] = new Range(i*7%1000, i*13%1000);

  cout << "sorting...\n";  cout.flush();

  mysort(a, N, LBComparator());
  mysort(a, N, UBComparator());

  cout << "done.\n";  cout.flush();
}

