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