//******************************************************************
// IMPLEMENTATION FILE (timetyp1.cpp)
// This file implements the TimeType member functions
//******************************************************************
#include "timetyp1.h"
#include <iostream>

using namespace std;

// Private members of class:
//     int hrs;
//     int mins;
//     int secs;

//******************************************************************

void TimeType::Set( /* in */ int hours,
                    /* in */ int minutes,
                    /* in */ int seconds )

// Precondition:
//     0 <= hours <= 23  &&  0 <= minutes <= 59
//  && 0 <= seconds <= 59
// Postcondition:
//     hrs == hours  &&  mins == minutes  &&  secs == seconds
// NOTE:
//     This function MUST be called prior to
//     any of the other member functions

{
    hrs = hours;
    mins = minutes;
    secs = seconds;
}

//******************************************************************

void TimeType::Increment()

// Precondition:
//     The Set function has been invoked at least once
// Postcondition:
//     Time has been advanced by one second, with
//     23:59:59 wrapping around to 0:0:0

{
    secs++;
    if (secs > 59)
    {
        secs = 0;
        mins++;
        if (mins > 59)
        {
            mins = 0;
            hrs++;
            if (hrs > 23)
                hrs = 0;
        }
    }
}

//******************************************************************

void TimeType::Write() const

// Precondition:
//     The Set function has been invoked at least once
// Postcondition:
//     Time has been output in the form HH:MM:SS

{
    if (hrs < 10)
        cout << '0';
    cout << hrs << ':';
    if (mins < 10)
        cout << '0';
    cout << mins << ':';
    if (secs < 10)
        cout << '0';
    cout << secs;
}

//******************************************************************

bool TimeType::Equal( /* in */ TimeType otherTime ) const

// Precondition:
//     The Set function has been invoked at least once
//     for both this time and otherTime
// Postcondition:
//     Function value == true, if this time equals otherTime
//                    == false, otherwise

{
    return (hrs == otherTime.hrs && mins == otherTime.mins &&
            secs == otherTime.secs);
}

//******************************************************************

bool TimeType::LessThan( /* in */ TimeType otherTime ) const

// Precondition:
//     The Set function has been invoked at least once
//     for both this time and otherTime
//  && This time and otherTime represent times in the
//     same day
// Postcondition:
//     Function value == true, if this time is earlier
//                             in the day than otherTime
//                    == false, otherwise

{
    return (hrs < otherTime.hrs ||
            hrs == otherTime.hrs && mins < otherTime.mins ||
            hrs == otherTime.hrs && mins == otherTime.mins
                                 && secs < otherTime.secs);
}
