/*************************************************/
// R. A. Hillyard
// inventory04.cpp
// November 2001
//
// class with constructors, friend functions and operator overloading
// use of const keyword for reference parameters and functions
/*************************************************/
#include<iostream>
#include<iomanip>

using namespace std;

class Inventory
  {
  public:
    //friend functions 
    friend istream& operator >>(istream& ins, Inventory& p1);
    friend ostream& operator <<(ostream& outs, const Inventory& p1);
    friend bool operator > (const Inventory& p1, const Inventory& p2);
    friend Inventory hasMost(const Inventory& p1, const Inventory& p2, const Inventory& p3);

    //constructors
    Inventory();
    Inventory (int num);
    Inventory (int num, int stock, double price);
    //accessor functions
    int getPartNum() const;
    int getInStock() const;
    double getCost() const;
    //mutator functions
    void setPartNum(int num);
    void setInStock(int num) ;
    void setCost(double num);
  private:
    int partNum;
    int inStock;
    double cost;
  };
/****************************************************************/
istream& operator >>(istream& ins, Inventory& p1)
  {
  ins >> p1.partNum >> p1.inStock >> p1.cost;
  return ins;
  }
/****************************************************************/
ostream& operator <<(ostream& outs, const Inventory& p1)
  {
  outs << setw(5) << p1.partNum << setw(6) << p1.inStock << setw(10) << p1.cost << endl;
  return outs;
  }
/****************************************************************/
bool operator > (const Inventory& p1, const Inventory& p2)
  {   return(p1.inStock > p2.inStock);  }
/****************************************************************/
Inventory hasMost(const Inventory& p1, const Inventory& p2, const Inventory& p3)
  {
  if(p1 > p2 && p1 > p3)    {return p1;}
  if(p2 > p1 && p2 > p3)    {return p2;}
  return p3;
  }
/****************************************************************/
Inventory::Inventory()
  {
  partNum = -1;
  inStock = 0;
  cost = 0.0;
  }
/****************************************************************/
Inventory::Inventory (int num)
  {
  partNum = num;
  inStock = 0;
  cost = 0.0;
  }
/****************************************************************/
Inventory::Inventory (int num, int stock, double price)
  {
  partNum = num;
  inStock = stock;
  cost = price;
  }
/****************************************************************/
int Inventory::getPartNum() const
  {  return partNum;  }
/****************************************************************/
int Inventory::getInStock() const
  {  return inStock;  }
/****************************************************************/
double Inventory::getCost() const
  {  return cost;  }
/****************************************************************/
void Inventory::setPartNum(int num)
  {  partNum = num;  }
/****************************************************************/
void Inventory::setInStock(int num)
  {  inStock = num;  }
/****************************************************************/
void Inventory::setCost(double num)
  {  cost = num;  }
/****************************************************************/
int main()
  {
  Inventory part1(1234, 542, 12.99);
  Inventory part2(2345, 234, 77.69);
  Inventory part3;

  cout << "enter partNum stock and cost: ";
  cin >> part3;                                  //use of >> operator

  double value = (part1.getInStock() * part1.getCost())
               + (part2.getInStock() * part2.getCost())
               + (part3.getInStock() * part3.getCost()); 

  Inventory part4 = hasMost(part1, part2, part3);

  cout << "*** Inventory Database ***\n";
  cout << part1 << part2 << part3 << endl;       //use of << operator
  cout << "\nTotal value of inventory: " << value << endl;

  cout << "The part with the most stock is: " << part4 << endl;
  return 0;
  }
/****************************************************************/
/*******************Program Output******************************

enter partNum stock and cost: 6543 434 34.56
*** Inventory Database ***
1234 542 12.99
2345 234 77.69
6543 434 34.56


Total value of inventory: 40219.1
The part with the most stock is: 1234 542 12.99


*/