indexing
	description: "Absolute times"
	status: "See notice at end of class"
	date: "$Date$"
	revision: "$Revision$"
	access: time
class interface
	TIME
create 
	make (h, m, s: INTEGER)
			minutesecondhms
		require
			correct_time: is_correct_time (h, m, s, False)
		ensure
			hour_set: hour = h
			minute_set: minute = m
			second_set: second = s
	make_fine (h, m: INTEGER; s: DOUBLE)
			minutesecondhm
			s
			fractional_seconds
		require
			correct_time: is_correct_time (h, m, s, False)
		ensure
			hour_set: hour = h
			minute_set: minute = m
			fine_second_set: fine_second = s
	make_now
			
	make_by_seconds (sec: INTEGER)
			sec
		require
			s_large_enough: sec >= 0
			s_small_enough: sec < seconds_in_day
		ensure
			seconds_set: seconds = sec
	make_by_fine_seconds (sec: DOUBLE)
			sec
		require
			s_large_enough: sec >= 0
			s_small_enough: sec < seconds_in_day
	make_from_string (s: STRING; code: STRING)
			
			code
		require
			s_exists: s /= void
			c_exists: code /= void
			time_valid: time_valid (s, code)
	make_from_string_default (s: STRING)
			
			default_format_string
		require
			s_exists: s /= void
			time_valid: time_valid (s, default_format_string)
	make_by_compact_time (c_t: INTEGER)
			compact_time
		require
			c_t_not_void: c_t /= void
			c_t_valid: compact_time_valid (c_t)
		ensure
			compact_time_set: compact_time = c_t
feature 
	make (h, m, s: INTEGER)
			minutesecondhms
		require
			correct_time: is_correct_time (h, m, s, False)
		ensure
			hour_set: hour = h
			minute_set: minute = m
			second_set: second = s
	make_by_compact_time (c_t: INTEGER)
			compact_time
		require
			c_t_not_void: c_t /= void
			c_t_valid: compact_time_valid (c_t)
		ensure
			compact_time_set: compact_time = c_t
	make_by_fine_seconds (sec: DOUBLE)
			sec
		require
			s_large_enough: sec >= 0
			s_small_enough: sec < seconds_in_day
	make_by_seconds (sec: INTEGER)
			sec
		require
			s_large_enough: sec >= 0
			s_small_enough: sec < seconds_in_day
		ensure
			seconds_set: seconds = sec
	make_fine (h, m: INTEGER; s: DOUBLE)
			minutesecondhm
			s
			fractional_seconds
		require
			correct_time: is_correct_time (h, m, s, False)
		ensure
			hour_set: hour = h
			minute_set: minute = m
			fine_second_set: fine_second = s
	make_from_string (s: STRING; code: STRING)
			
			code
		require
			s_exists: s /= void
			c_exists: code /= void
			time_valid: time_valid (s, code)
	make_from_string_default (s: STRING)
			
			default_format_string
		require
			s_exists: s /= void
			time_valid: time_valid (s, default_format_string)
	make_now
			
	
feature 
	compact_time: INTEGER
			
			 TIME_VALUE
	fine_second: DOUBLE
			
			 TIME_VALUE
	fractional_second: DOUBLE
			fine_second
			 TIME_VALUE
	hour: INTEGER
			
			 TIME_VALUE
	Hours_in_day: INTEGER is 24
			
			 TIME_CONSTANTS
	micro_second: INTEGER
			
			 TIME_VALUE
	milli_second: INTEGER
			
			 TIME_VALUE
	minute: INTEGER
			
			 TIME_VALUE
	Minutes_in_hour: INTEGER is 60
			
			 TIME_CONSTANTS
	nano_second: INTEGER
			
			 TIME_VALUE
	origin: TIME
			
		ensure  ABSOLUTE
			result_exists: Result /= void
	second: INTEGER
			
			 TIME_VALUE
	Seconds_in_day: INTEGER is 86400
			
			 TIME_CONSTANTS
	Seconds_in_hour: INTEGER is 3600
			
			 TIME_CONSTANTS
	Seconds_in_minute: INTEGER is 60
			
			 TIME_CONSTANTS
	time_default_format_string: STRING
			
			 TIME_CONSTANTS
	
feature 
	duration: TIME_DURATION
			
		ensure then
			seconds_large_enough: duration.seconds_count >= 0
			seconds_small_enough: duration.seconds_count < seconds_in_day
	fine_seconds: DOUBLE
			
	seconds: INTEGER
			
		ensure
			result_definition: Result = duration.seconds_count
	
feature 
	is_equal (other: like Current): BOOLEAN
			other
			
			 COMPARABLE
		require  ANY
			other_not_void: other /= void
		ensure  ANY
			symmetric: Result implies other.is_equal (Current)
			consistent: standard_is_equal (other) implies Result
		ensure then  COMPARABLE
			trichotomy: Result = (not (Current < other) and not (other < Current))
	max (other: like Current): like Current
			other
			 COMPARABLE
		require  COMPARABLE
			other_exists: other /= void
		ensure  COMPARABLE
			current_if_not_smaller: Current >= other implies Result = Current
			other_if_smaller: Current < other implies Result = other
	min (other: like Current): like Current
			other
			 COMPARABLE
		require  COMPARABLE
			other_exists: other /= void
		ensure  COMPARABLE
			current_if_not_greater: Current <= other implies Result = Current
			other_if_greater: Current > other implies Result = other
	three_way_comparison (other: like Current): INTEGER
			other
			
			 COMPARABLE
		require  COMPARABLE
			other_exists: other /= void
		ensure  COMPARABLE
			equal_zero: (Result = 0) = is_equal (other)
			smaller_negative: (Result = - 1) = (Current < other)
			greater_positive: (Result = 1) = (Current > other)
	infix "<" (other: like Current): BOOLEAN
			other
		require  PART_COMPARABLE
			other_exists: other /= void
		ensure then  COMPARABLE
			asymmetric: Result implies not (other < Current)
	infix "<=" (other: like Current): BOOLEAN
			other
			 COMPARABLE
		require  PART_COMPARABLE
			other_exists: other /= void
		ensure then  COMPARABLE
			definition: Result = ((Current < other) or is_equal (other))
	infix ">" (other: like Current): BOOLEAN
			other
			 COMPARABLE
		require  PART_COMPARABLE
			other_exists: other /= void
		ensure then  COMPARABLE
			definition: Result = (other < Current)
	infix ">=" (other: like Current): BOOLEAN
			other
			 COMPARABLE
		require  PART_COMPARABLE
			other_exists: other /= void
		ensure then  COMPARABLE
			definition: Result = (other <= Current)
	
feature 
	set_fine_second (s: DOUBLE)
			fine_seconds
			 TIME_VALUE
		require  TIME_MEASUREMENT
			s_large_enough: s >= 0
			s_small_enough: s < seconds_in_minute
		ensure  TIME_MEASUREMENT
			fine_second_set: fine_second = s
	set_fractionals (f: DOUBLE)
			fractional_secondf
			 TIME_VALUE
		require  TIME_MEASUREMENT
			f_large_enough: f >= 0
			f_small_enough: f < 1
		ensure  TIME_MEASUREMENT
			second_same: second = old second
	set_hour (h: INTEGER)
			hourh
			 TIME_VALUE
		require  TIME_MEASUREMENT
			h_large_enough: h >= 0
			h_small_enough: h < hours_in_day
		ensure  TIME_MEASUREMENT
			hour_set: hour = h
	set_minute (m: INTEGER)
			minutem
			 TIME_VALUE
		require  TIME_MEASUREMENT
			m_large_enough: m >= 0
			m_small_enough: m < minutes_in_hour
		ensure  TIME_MEASUREMENT
			minute_set: minute = m
	set_second (s: INTEGER)
			seconds
			 TIME_VALUE
		require  TIME_MEASUREMENT
			s_large_enough: s >= 0
			s_small_enough: s < seconds_in_minute
		ensure  TIME_MEASUREMENT
			second_set: second = s
	
feature 
	fine_second_add (f: DOUBLE)
			f
			ffractional_second
	hour_add (h: INTEGER)
			h
	hour_back
			
	hour_forth
			
	minute_add (m: INTEGER)
			m
	minute_back
			
	minute_forth
			
	relative_duration (other: like Current): TIME_DURATION
			otherCurrent
		require  ABSOLUTE
			other_exists: other /= void
		ensure  ABSOLUTE
			result_exists: Result /= void
	second_add (s: INTEGER)
			s
	second_back
			
	second_forth
			
	infix "+" (t: TIME_DURATION): TIME
			t
		require
			t_exists: t /= void
		ensure
			result_exists: Result /= void
	infix "-" (other: like Current): INTERVAL [like Current]
			other
			 ABSOLUTE
		require  ABSOLUTE
			other_exists: other /= void
			other_smaller_than_current: other <= Current
		ensure  ABSOLUTE
			result_exists: Result /= void
			result_set: Result.start_bound.is_equal (other) and then Result.end_bound.is_equal (Current)
	
feature 
	formatted_out (s: STRING): STRING
			
			s
		require
			s_exists: s /= void
	out: STRING
			
			time_default_format_string
	
feature 
	compact_time_valid (c_t: INTEGER): BOOLEAN
			c_t
			 TIME_VALIDITY_CHECKER
		require  TIME_VALIDITY_CHECKER
			c_t_not_void: c_t /= void
	is_correct_time (h, m: INTEGER; s: DOUBLE; twelve_hour_scale: BOOLEAN): BOOLEAN
			hmcodes
			twelve_hour_scale
			
			 TIME_VALIDITY_CHECKER
	time_valid (s: STRING; code_string: STRING): BOOLEAN
			
			
			scode_string
			 TIME_VALIDITY_CHECKER
		require  TIME_VALIDITY_CHECKER
			s_exists: s /= void
			code_exists: code_string /= void
	
invariant
	second_large_enough: second >= 0
	second_small_enough: second < seconds_in_minute
	fractionals_large_enough: fractional_second >= 0
	fractionals_small_enough: fractional_second < 1
	minute_large_enough: minute >= 0
	minute_small_enough: minute < minutes_in_hour
	hour_large_enough: hour >= 0
	hour_small_enough: hour < hours_in_day
		 ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)
		 COMPARABLE
	irreflexive_comparison: not (Current < Current)
end -- TIME