/*************************************************/
// R. A. Hillyard
// inventory.h
// November 2001
//
// The Inventory class used as an array element
// 
/*************************************************/
//inventory.h
/*************************************************/
#include<iostream>

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);

    //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;
  };
/*************************************************/
/*************************************************/
// R. A. Hillyard
// inventory.cpp
// November 2001
//
// The Inventory class used as an array element
// 
/*************************************************/
#include <iostream>
#include <iomanip>
#include "inventory.h"

/****************************************************************/
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;  }
/****************************************************************/
/*************************************************/
// R. A. Hillyard
// inventoryListMain.cpp
//
// Test program to demonstrate the use
// of classes as array elements
/*************************************************/

#include <iostream>
#include <fstream>
#include <iomanip>
#include "inventory.h"

using namespace std;

//function prototypes
void display(Inventory list[], int numVals);
int getInput(Inventory list[], int size);
void sortList(Inventory list[], int numVals);

const int ListSize = 10;   

int main(void)
  {
  Inventory inventoryList[ListSize];  //declate an array of type Inventory 
  int numVals = 0;                    //variable to hold number of array elements

  numVals = getInput(inventoryList, ListSize);  //get Input from file
  sortList(inventoryList, numVals);             //sort the list
  display(inventoryList, numVals);              //display the list
  }
/*************************************************/
  
/*************************************************/
//getInput
// open a file for reading and read file data into
// an array of Inventory objects up to "size" values.
// prints message if file is empty or greater than size
// returns the actual number of entries read 
/*************************************************/
int getInput(Inventory list[], int size)
  {
  int num = 0;      //counter for number of entries read

  char inFile[] = "inv.dat";  //file name for testing - allow user to enter later
  ifstream ins(inFile);       //open file and check for success
  if(ins.fail())
    {
    cout << "failed to open " << inFile << endl;
    exit(1);
    }
    
  //read data from file - stop when all data is read
  //or maximum size is reached
  //note use of extraction 
    while((num < size) && (ins >> list[num]))  
    {
    num++;
    }
  //check for error conditions
  if(num == 0)
    {cout << "Data file was empty\n";}
  if(num == size && !ins.eof())
    {cout << "Data file has more than " << size << " entries\n";}
  return num;  //return actual number of entries read
  }
/*************************************************/
// print each element of the array
// note use of insertion operator
/*************************************************/
void display(Inventory list[], int numVals)
  {
  for (int i = 0; i< numVals; i++)
    cout << list[i];
  }
/*************************************************/
//sort list based on part number  
/*************************************************/
void sortList(Inventory list[], int numVals)
  {
  Inventory temp;
  int i, j;
  int smallest;
  int smallestIndex = 0;
  for(i = 0; i< numVals; i++)
    {
    smallest = list[i].getPartNum();
    smallestIndex = i;
    for(j = i+1; j < numVals; j++)
      {
      if(list[j].getPartNum() < smallest)
        {
        smallest = list[j].getPartNum();
        smallestIndex = j;
        }
      }
    //swap
    temp = list[i];
    list[i] = list[smallestIndex];
    list[smallestIndex] = temp;  
    }
  }
/*************************************************/
/***********************Data File*****************/
3563	126	 13.88
8734	238	  7.33
2345	765	 12.88
1456	345	 100.51
8723	7654	0.88
/*************************Output******************/
 1456   345    100.51
 2345   765     12.88
 3563   126     13.88
 8723  7654      0.88
 8734   238      7.33