#include <iostream.h>
#include <fstream.h>
#include <algorithm>
#include <functional>
#include <vector>
#include "person.h"

typedef vector<Person*> Cont;
typedef Cont::iterator Itor;

template <class T> struct printPtr : public unary_function<T, void>
{
  printPtr(ostream& out) : os(out) {}
  void operator() (T x) { os << *x  << endl; }
  ostream& os;
};

struct increaseAge : public unary_function<Person*, void>
{
  increaseAge(int by) : amt(by) {}
  void operator() (Person* p) 
    { p->setAge(p->Age() + amt); }
  int amt;
};

main()
{
  Cont c;
  Person* p;
  ifstream f;

  f.open("data.txt");

  p = new Person;
  f >> *p;

  while(f) {
    c.push_back(p);
    p = new Person;
    f >> *p;
  }
   
  for_each(c.begin(),c.end(),printPtr<Person*>(cout));

  for_each(c.begin(),c.end(),increaseAge(1));

  for_each(c.begin(),c.end(),printPtr<Person*>(cout));
}

