/* Temperature.h is the header file for class Temperature.
 * 
 * INVARIANT: myScale == 'F' || myScale == 'C' || myScale == 'K'
 *            && myDegrees is valid for myScale.
 */
 
#ifndef TEMPERATURE
#define TEMPERATURE
 
#include<iostream>
using namespace std;

const double MIN_CELSIUS    = -273.15;
const double MIN_FAHRENHEIT = -459.67;
const double MIN_KELVIN     = 0.0;

class Temperature
{
 public:
    Temperature();
    Temperature(double initialDegrees, char initialScale);
    
    double getDegrees() const;
	char getScale() const;

    Temperature inFahrenheit() const;
    Temperature inCelsius() const;
    Temperature inKelvin() const;
    
    bool operator<  (const Temperature & rightOperand) const;
    bool operator== (const Temperature & rightOperand) const;
    
	void print(ostream& out) const;
    void read(istream & in);
    	
    static bool isValid(double degrees, char scale);
	
 private:
 
    int compare(const Temperature& rightOperand) const;
    
	double myDegrees;
	char   myScale;	// 'F', 'C', or 'K'
};


// -------- Default-value constructor -----------------------------

inline Temperature::Temperature()
{
   myDegrees = 0.0;
   myScale = 'C';
}

// -------- Degrees extractor -------------------------------------

inline double Temperature::getDegrees() const
{
   return myDegrees;
}

// -------- Scale extractor ---------------------------------------

inline char Temperature::getScale() const
{
   return myScale;
}



// -------- Output method --------------------------------

inline void Temperature::print(ostream& out) const
{
   out << myDegrees << ' ' << myScale;
}

// -------- less-than ----------------------------------------------

inline bool Temperature::operator< (const Temperature & rightOperand) const
{
   return compare(rightOperand) < 0;
}

// -------- equality ----------------------------------------------

inline bool Temperature::operator== (const Temperature & rightOperand) const
{
   return compare(rightOperand) == 0;
}

#endif
