// ==========================================================================
// $Id: vehicle.cpp,v 1.4 2008/10/15 21:27:22 jlang Exp $
// CSI2372 example Code for lecture 6
// ==========================================================================
// (C)opyright:
//
//   Jochen Lang
//   SITE, University of Ottawa
//   800 King Edward Ave.
//   Ottawa, On., K1N 6N5
//   Canada. 
//   http://www.site.uottawa.ca
// 
// Creator: jlang (Jochen Lang)
// Email:   jlang@site.uottawa.ca
// ==========================================================================
// $Log: vehicle.cpp,v $
// Revision 1.4  2008/10/15 21:27:22  jlang
// Reverting to 1.2
//
// Revision 1.2  2006/10/12 13:21:31  jlang
// Renoved extra CRs
//
// Revision 1.1  2006/10/05 01:56:46  jlang
// Added material for lecture 6
//
//
// ==========================================================================

#include <iostream>
#include <string>

class Chassis {
  float d_length;
};

class Engine {
  float d_horsePower;
public:
  Engine( double _horsePower=50.0 );
  double getHorsePower() const;
};

class Wheel {
  float d_diameter;
};

class Starter {
  std::string d_manufacturer;
public:
  Starter( const std::string& _manufacturer );
};

class Battery {
  float d_voltage;
};

class Vehicle {
  Chassis d_chassis;
  Engine d_engine;
  Wheel d_wheels[4];
  Starter* d_start;
  Battery d_battery;
public:
  Vehicle(const Chassis& _chassis, 
 	  const Engine& _engine 	);
  ~Vehicle();

  Engine getEngineA();
  const Engine& getEngineB();
  const Engine* getEngineC();
}; 


Engine::Engine( double _horsePower ) 
  : d_horsePower( _horsePower )
{
}

double Engine::getHorsePower() const {
  return d_horsePower;
}

Starter::Starter(const std::string& _manufacturer) 
  : d_manufacturer(_manufacturer) 
{
}

Vehicle::Vehicle( const Chassis& _chassis,
		  const Engine& _engine ) 
  : d_engine( _engine ), d_chassis( _chassis ), d_start(0) {
  if ( d_engine.getHorsePower() < 100 ) {
    d_start = new Starter( "Mini" );
  } else {
    d_start = new Starter( "Bosch" );
  }
}

Vehicle::~Vehicle() {
  if (d_start != 0) {
    delete d_start;
  }
 }


Engine Vehicle::getEngineA() {
  return d_engine;
}

const Engine& Vehicle::getEngineB() {
  return d_engine;
}

const Engine* Vehicle::getEngineC() {
  return &d_engine;
} 



int main() {
  // External Aggregation
  Engine eng;
  Chassis chas;
  // Pass by reference
  Vehicle car( chas, eng );
  
  std::cout << "A) Car has " << car.getEngineA().getHorsePower() 
	    << " hp" << std::endl;
  std::cout << "B) Car has " << car.getEngineB().getHorsePower() 
	    << " hp" << std::endl;
  std::cout << "C) Car has " << car.getEngineC()->getHorsePower() 
	    << " hp" << std::endl;

  return 0;
}
