// Temperature and TempChange classes (Copyright 1994, // --------------------------------- Information Disciplines, Inc.) // These classes support operations on temperatures. #ifndef TEMPERATURE #define TEMP_CHANGE const TempChange #define TEMPERATURE const Temperature // Temperature Change (extent) class // ------------------ class TempChange { friend class Temperature; // Allow Temperature methods to retrieve value double value; // Internal representation degrees Kelvin or Celsius // Constructor // ----------- public: TempChange(DOUBLE x = 0) : value(x) {} // Compiler will supply acceptable copy constructor, destructor, // and assignment operator // Arithmetic Operators // -------------------- #define Class TempChange #define PureType double #include "Additive.hpp" /* Additive pattern for binary operators */ // Relational operators // -------------------- bool operator== (TEMP_CHANGE rs) const {return value == rs.value;} bool operator< (TEMP_CHANGE rs) const {return value < rs.value;} // I-O operations // -------------- static char* unit; // Unit name ("degree") for messages ostream& put(ostream& s) const; istream& get(istream& s); }; // ************ End of class definition // Inline member and non-member functions // -------------------------------------- inline ostream& operator<< (ostream& ls, TEMP_CHANGE rs) {return rs.put(ls);} inline istream& operator>> (istream& ls, TempChange& rs){return rs.get(ls);} inline TempChange& TempChange::operator+=(TEMP_CHANGE rs) {value += rs.value; return *this; } inline TempChange& TempChange::operator-=(TEMP_CHANGE rs) {value -= rs.value; return *this; } inline TempChange& TempChange::operator*=(DOUBLE rs) {value *= rs; return *this; } inline TempChange& TempChange::operator/=(DOUBLE rs) {value /= rs; return *this; } inline double TempChange::operator/ (TEMP_CHANGE rs) const { return value / rs.value; } // Temperature class // ---------- // This class defines Temperature objects. class Temperature { double value; // Internal representation public: static DOUBLE zeroCelsius; // Constructor, accessors, and conversion functions // ------------------------------------------------ Temperature(double kelvin=0.0) : value(kelvin) {assert(value>=0.0);} // Compiler will supply acceptable copy constructor, destructor, // and assignment operator double toKelvin() {return value;} double toCelsius() {return value - zeroCelsius;} double toFahrenheit() {return 1.8*toCelsius()+32;} inline static Temperature fromCelsius (DOUBLE x) {return x+zeroCelsius;} inline static Temperature fromFahrenheit(DOUBLE x) {return fromCelsius((x-32)/1.8);} // Arithmetic Operators #define PointClass Temperature #include "PointExt.hpp" // Relational operators // -------------------- bool operator== (Temperature rs) const {return value == rs.value;} bool operator< (Temperature rs) const {return value < rs.value;} // I-O operations // -------------- static char* unit; // Unit name ("K") for messages ostream& put(ostream& s) const; istream& get(istream& s); }; // Inline member and non-member functions // -------------------------------------- inline ostream& operator<< (ostream& ls, Temperature rs) {return rs.put(ls);} inline istream& operator>> (istream& ls, Temperature& rs){return rs.get(ls);} inline Temperature& Temperature::operator+= (TEMP_CHANGE rs) {assert(value >= -rs.value); value += rs.value; return *this;} inline Temperature& Temperature::operator-= (TEMP_CHANGE rs) {assert(value >= rs.value); value -= rs.value; return *this;} #undef Class #undef PointClass #endif