#include <stdio.h>
#include "algorithm.h"
#include "list.h"


void print_int(int i)
{
  printf("%i\n", i);
}

void print_char(int i)
{
  printf("'%c'\n", i);
}

int vec[] = { 11, 12, 13, 14, 15, 16 };
int vec2[] = { 1, 3, 4, 5, 7 };
int vec3[] = { 0, 2, 2, 4, 6, 8 };
int vec4[] = { 'a', 's', 'o', 'r', 't', 'i', 'n', 'g', 'e', 'x', 'a', 'm', 'p', 'l', 'e' };

int main()
{
  list<int> l;

  l.push_front(0);
  l.push_front(1);
  l.push_front(2);
  l.push_front(3);
  l.push_front(4);
  l.push_front(5);
  l.push_front(6);
  l.push_front(7);
  l.push_front(8);
  l.push_front(9);

  printf(">\n");

  for_each(l.begin(), l.end(), print_int);

  printf("\n");

  for_each(l.rbegin(), l.rend(), print_int);

  printf("\n");

  l.erase(l.begin());
  for_each(l.begin(), l.end(), print_int);

  printf("\n");

  l.erase(--l.end());
  for_each(l.begin(), l.end(), print_int);

  printf("\n");

  l.erase(++(++l.begin()));
  for_each(l.begin(), l.end(), print_int);

  printf("\n");

  printf(">\n");

  l.clear();
  for_each(l.begin(), l.end(), print_int);

  printf("<\n\n");

  l.insert(l.begin(), &vec[0], &vec[6]);
  for_each(l.begin(), l.end(), print_int);

  printf("\n");

  list<int> l2(++l.begin(), --l.end());
  for_each(l2.begin(), l2.end(), print_int);

  printf("\n");

  l.swap(l2);

  printf("l:\n");
  for_each(l.begin(), l.end(), print_int);

  printf("\n");

  printf("l2:\n");
  for_each(l2.begin(), l2.end(), print_int);

  printf("\n\n");

  l2.reverse();
  for_each(l2.begin(), l2.end(), print_int);

  printf("\n\n");

  l2.push_front(15);
  l2.push_front(15);
  l2.push_front(15);

  l2.push_front(16);
  for_each(l2.begin(), l2.end(), print_int);

  printf("\n\n");

  l2.unique();
  for_each(l2.begin(), l2.end(), print_int);

  printf("\n\n");

  l2.push_front(16);

  for_each(l2.begin(), l2.end(), print_int);

  printf("\n\n");

  l2.remove(16);
  for_each(l2.begin(), l2.end(), print_int);

  printf("\n\n");

  list<int>l3(&vec2[0], &vec2[5]);
  list<int>l4(&vec3[0], &vec3[6]);

  l3.merge(l4);
  for_each(l3.begin(), l3.end(), print_int);

  printf(">\n");
  for_each(l4.begin(), l4.end(), print_int);
  printf("<\n\n");

  l2.splice(++l2.begin(), l3, ++l3.begin(), l3.end());

  for_each(l2.begin(), l2.end(), print_int);

  printf(">\n");
  for_each(l3.begin(), l3.end(), print_int);
  printf("<\n\n");

  l3 = l2;
  for_each(l3.begin(), l3.end(), print_int);
  printf("\n\n");

  l3.assign(5, 1234);
  for_each(l3.begin(), l3.end(), print_int);
  printf("\n\n");

  l3.resize(10, 5678);
  for_each(l3.begin(), l3.end(), print_int);
  printf("\n\n");

  l3.resize(5, 5678);
  for_each(l3.begin(), l3.end(), print_int);
  printf("\n\n");

  l4 = l3;

  printf("l3 == l4 %i\n", l3 == l4);
  l4.push_front(12);
  printf("l3 == l4 %i\n", l3 == l4);

  printf("\n\n");

  list<int>l5(&vec4[0], &vec4[15]);
  for_each(l5.begin(), l5.end(), print_char);

  printf("\n\n");

  l5.sort();
  for_each(l5.begin(), l5.end(), print_char);

  printf("\n\n");

  list<int>l6;
  l5.swap(l6);

  printf(">\n");
  for_each(l5.begin(), l5.end(), print_char);
  printf("<\n");
  printf("\n\n");

  printf(">\n");
  for_each(l6.begin(), l6.end(), print_char);
  printf("<\n");
  printf("\n\n");

  printf("<\n");
}
