#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>

#include "Tracer.h"

using namespace std;

// Template version of Iterator Question from Lecture 14
// The "typename" in the parameter list is needed so that
// the compiler knows that vector<T>::iterator is a type
// and not a field, since it doesn't know yet what T is.
template <typename T>
void OrderPair(typename vector<T>::iterator it1) {
  auto it2 = it1 + 1;
  if (*it2 < *it1) {
    auto tmp = *it2;
    *it2 = *it1;
    *it1 = tmp;
  }
}

void PrintOut(const Tracer &p) {
  cout << "  printout: " << p << endl;
}

int main(int argc, char **argv) {
  Tracer a, b, c;
  vector<Tracer> vec;

  vec.push_back(c);
  vec.push_back(a);
  vec.push_back(b);

  cout << "order first 2 elements:" << endl;
  OrderPair<Tracer>(vec.begin());
  cout << "done ordering!" << endl;
  for_each(vec.begin(), vec.end(), &PrintOut);

  return EXIT_SUCCESS;
}