#ifndef TIME24_H
#define TIME24_H

#include <iostream>

using namespace std;

class Time24
{
   public:
      Time24(int h = 0, int m = 0);
         // constructor initializes hour and minute

      void AddTime(int m);
         // update time by adding m minutes to the current time
         // Precondition:  m must be >= 0 
         // Postcondition: The new time is m minutes later 

      Time24 Duration(const Time24& t) const;
         // return the length of time from the current time to some later
         // time t as a Time24 value
         // Precondition:  time t must not be earlier than the current time.
         // if it is, throw a RangeError exception

      void ReadTime(istream& in);
         // input from input stream time in the form hh:mm
         // Postcondition: Assign value hh to hour and mm to minute and 
         // adjust units to the proper range.

      void WriteTime(ostream& out) const;
         // display on output stream the current time in the form hh:mm


      int GetHour() const;
         // return the hour value for the current time
      int GetMinute() const;
         // return the minute value for the current time


      // Overloaded operators as friend functions
      friend bool operator== (const Time24& lhs, const Time24& rhs);
      friend bool operator<  (const Time24& lhs, const Time24& rhs);
      friend Time24 operator+ (const Time24& lhs, const Time24& rhs);
         // form and return lhs + rhs
      friend Time24 operator+ (const Time24& lhs, int min);
         // form and return lhs + min
         // Precondition:  min must be >= 0 
      friend Time24 operator+ (int min, const Time24& rhs);
         // form and return min + rhs
         // Precondition:  min must be >= 0 
      friend Time24 operator- (const Time24& lhs, const Time24& rhs);
         // form and return lhs - rhs
         // Precondition: lhs >= rhs. if not, throw a RangeError exception
 
      Time24& operator+= (const Time24& rhs);
         // current object = current object + rhs
         // Postcondition: the time increases by the value of rhs
      Time24& operator+= (int min);
         // current object = current object + min
         // Precondition:  min must be >= 0 
         // Postcondition: the time increases by min minutes

      friend istream& operator>> (istream& istr, Time24& t);
         // input t in the format hh:mm. may omit the leading digit
         // if hours or minutes < 10
      friend ostream& operator<< (ostream& ostr, const Time24& t);
         // output t in the format hh:mm. always include two digits
         // for the minute (e.g. 15:07). hours before 12 use 1 digit
         // and precede the hour by a blank (e.g. " 7:15")

   private: // data members
      int hour,    // 0-23
          minute;  // 0-59

      // utility function sets the hour value in the range 0 to 23
      // and the minute value in the range 0 to 50
      void NormalizeTime();     
};

#endif   // TIME24_H
