#include <iostream>
#include <list>
#include <algorithm>

#include "vehicle.h"
#include "car.h"
#include "bus.h"
#include "truck.h"

using namespace std;

void global_print( vehicle *vp )
{
  vp->print();
}

struct dealloc
{
  void operator()( vehicle *vp )
  {
    delete vp;
  }
};

int main()
{
  list<vehicle*> vl;
  vl.push_back( new car( "abc123" ) );
  vl.push_back( new bus( "bbb123", 45 ) );
  vl.push_back( new truck( "eee765", 4.5 ) );
  vl.push_back( new truck( "fff098", 3.5 ) );
  vl.push_back( new bus( "ccc456", 55 ) );
  vl.push_back( new car( "bcd2" ) );

/*for ( list<vehicle*>::iterator vi = vl.begin(); vi != vl.end(); ++vi)
  {
    global_print(*vi);
  }
 */
  for_each( vl.begin(), vl.end(), global_print );
  for_each( vl.begin(), vl.end(), dealloc() );
  return 0;
}