clock: passes tests, iteration 1 (?)
This commit is contained in:
parent
eb066800db
commit
e9c27cd864
2 changed files with 106 additions and 0 deletions
71
cpp/clock/clock.cpp
Normal file
71
cpp/clock/clock.cpp
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
#include "clock.h"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
35
cpp/clock/clock.h
Normal file
35
cpp/clock/clock.h
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define EXERCISM_RUN_ALL_TESTS
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue