// implementation file: /Source/I3/Clocks/Clock.cpp:
   				  
#include <cassert>
#include "clock.hpp"

	namespace I3
	{
		namespace Clocks
		{
			bool Clock::is_valid_time (int an_hour, int a_minute)
			{
				return
					0 <= an_hour && an_hour < hours_per_day && 
					0 <= a_minute && a_minute < minutes_per_hour;
			}
			
			void Clock::set (int new_hour, int new_minute) 
			{
				assert(is_valid_time(new_hour, new_minute)); // Precondition
				hour			= new_hour;
				minute			= new_minute;
				assert(is_valid_time(hour, minute)); // Invariant
			}
			
			void Clock::tick () 
			{
				assert(is_valid_time(hour, minute)); // Invariant
				minute = (minute + 1) % minutes_per_hour;
				if (minute == 0) 
				{
					hour = (hour + 1) % hours_per_day;
				}
				assert(is_valid_time(hour, minute)); // Invariant
			}
		} // end of Clocks
	} // end of I3
