From e9c27cd8646aeddd6d000a0e1d56bd5c2e7b3ece Mon Sep 17 00:00:00 2001 From: Dmitry Kokorin Date: Fri, 18 Mar 2016 14:30:57 +0300 Subject: [PATCH] clock: passes tests, iteration 1 (?) --- cpp/clock/clock.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++++ cpp/clock/clock.h | 35 ++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 cpp/clock/clock.cpp create mode 100644 cpp/clock/clock.h diff --git a/cpp/clock/clock.cpp b/cpp/clock/clock.cpp new file mode 100644 index 0000000..8f34e4e --- /dev/null +++ b/cpp/clock/clock.cpp @@ -0,0 +1,71 @@ +#include "clock.h" + +#include + +namespace date_independent { + +namespace { + +const minutes_t minutes_per_hour = 60; +const hours_t hours_per_day = 24; +const total_t minutes_per_day = hours_per_day * minutes_per_hour; + +inline void make_date_independent(total_t total_minutes) +{ + while (total_minutes < 0) + total_minutes += minutes_per_day; + + total_minutes = total_minutes % minutes_per_day; +} + +} + + +clock::clock(hours_t hours, minutes_t minutes) +{ + total_minutes_ = minutes_per_hour*hours + minutes; + make_date_independent(total_minutes_); +} + +bool clock::operator==(const clock &other) const +{ + return total_minutes_ == other.total_minutes_; +} + +bool clock::operator!=(const clock &other) const +{ + return !(*this == other); +} + +clock clock::at(hours_t hours, minutes_t minutes) +{ + return clock(hours, minutes); +} + +clock clock::plus(minutes_t minutes) const +{ + clock result(*this); + + result.total_minutes_ += minutes; + make_date_independent(result.total_minutes_); + + return result; +} + +clock clock::minus(minutes_t minutes) const +{ + return plus(-minutes); +} + +clock::operator std::string() const +{ + minutes_t minutes = total_minutes_ % minutes_per_hour + hours_t hours = total_minutes_ / minutes_per_hour; + + char buff[6]; + snprintf(buff, 6, "%.2i:%.2i", hours, minutes); + + return buff; +} + +} diff --git a/cpp/clock/clock.h b/cpp/clock/clock.h new file mode 100644 index 0000000..3d2253d --- /dev/null +++ b/cpp/clock/clock.h @@ -0,0 +1,35 @@ +#pragma once + +#define EXERCISM_RUN_ALL_TESTS + +#include + +namespace date_independent { + +typedef long total_t; +typedef short hours_t; +typedef short minutes_t; + + +class clock +{ + total_t total_minutes_; + +public: + + clock(hours_t hours = 0, minutes_t minutes = 0); + clock(const clock&) = default; + clock &operator=(const clock&) = default; + + bool operator==(const clock&) const; + bool operator!=(const clock&) const; + + static clock at(hours_t hours, minutes_t minutes = 0); + + clock plus(minutes_t minutes) const; + clock minus(minutes_t minutes) const; + + operator std::string() const; +}; + +}