#include <iostream>
#include <stdexcept>
typedef unsigned int uint;
const uint MAX_TIMESTAMP = (23 * 3600) + (59 * 60) + 59;
typedef struct TimeStamp
{
uint stamp;
TimeStamp() : stamp(0)
{
}
TimeStamp(int hour, int minute, int second)
{
if (hour < 0)
{
throw std::invalid_argument("TimeStamp: Hour cannot be less than zero");
}
else if (minute < 0)
{
throw std::invalid_argument("TimeStamp: Minute cannot be less than zero");
}
else if (second < 0)
{
throw std::invalid_argument("TimeStamp: Second cannot be less than zero");
}
uint temp = (hour * 3600) + (minute * 60) + second;
if (temp > MAX_TIMESTAMP)
{
throw std::out_of_range("TimeStamp: value provided is too large");
}
stamp = temp;
}
uint GetHour() const
{
return stamp / 3600;
}
uint GetMinute() const
{
return (stamp % 3600) / 60;
}
uint GetSecond() const
{
return (stamp % 3600) % 60;
}
} TimeStamp;
std::ostream& operator<<(std::ostream& output, TimeStamp& t)
{
uint hour = t.GetHour();
uint minute = t.GetMinute();
uint second = t.GetSecond();
if (hour != 0 && hour != 12 && hour % 12 < 10)
{
output << "0";
}
output << (hour == 0 || hour == 12 ? 12 : hour % 12) << ":" << (minute < 10 ? "0" : "") << minute << ":" <<
(second < 10 ? "0" : "") << second << " " << (hour < 12 ? "AM" : "PM");
return output;
}
int main(void)
{
TimeStamp t(13, 45, 82);
std::cout << t.stamp << ": " << t << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKCmNvbnN0IHVpbnQgTUFYX1RJTUVTVEFNUCA9ICgyMyAqIDM2MDApICsgKDU5ICogNjApICsgNTk7Cgp0eXBlZGVmIHN0cnVjdCBUaW1lU3RhbXAKewoJdWludCBzdGFtcDsKCVRpbWVTdGFtcCgpIDogc3RhbXAoMCkKCXsKCX0KCQoJVGltZVN0YW1wKGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kKQoJewoJCWlmIChob3VyIDwgMCkKCQl7CgkJCXRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGltZVN0YW1wOiBIb3VyIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybyIpOwoJCX0KCQllbHNlIGlmIChtaW51dGUgPCAwKQoJCXsKCQkJdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJUaW1lU3RhbXA6IE1pbnV0ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8iKTsKCQl9CgkJZWxzZSBpZiAoc2Vjb25kIDwgMCkKCQl7CgkJCXRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGltZVN0YW1wOiBTZWNvbmQgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvIik7CgkJfQoJCQoJCXVpbnQgdGVtcCA9IChob3VyICogMzYwMCkgKyAobWludXRlICogNjApICsgc2Vjb25kOwoJCWlmICh0ZW1wID4gTUFYX1RJTUVTVEFNUCkKCQl7CgkJCXRocm93IHN0ZDo6b3V0X29mX3JhbmdlKCJUaW1lU3RhbXA6IHZhbHVlIHByb3ZpZGVkIGlzIHRvbyBsYXJnZSIpOwoJCX0KCQkKCQlzdGFtcCA9IHRlbXA7Cgl9CgkKCXVpbnQgR2V0SG91cigpIGNvbnN0Cgl7CgkJcmV0dXJuIHN0YW1wIC8gMzYwMDsKCX0KCQoJdWludCBHZXRNaW51dGUoKSBjb25zdAoJewoJCXJldHVybiAoc3RhbXAgJSAzNjAwKSAvIDYwOwoJfQoJCgl1aW50IEdldFNlY29uZCgpIGNvbnN0Cgl7CgkJcmV0dXJuIChzdGFtcCAlIDM2MDApICUgNjA7Cgl9CgkJCn0gVGltZVN0YW1wOwoKc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0cHV0LCBUaW1lU3RhbXAmIHQpCnsKCXVpbnQgaG91ciA9IHQuR2V0SG91cigpOwoJdWludCBtaW51dGUgPSB0LkdldE1pbnV0ZSgpOwoJdWludCBzZWNvbmQgPSB0LkdldFNlY29uZCgpOwoJCglpZiAoaG91ciAhPSAwICYmIGhvdXIgIT0gMTIgJiYgaG91ciAlIDEyIDwgMTApCgl7CgkJb3V0cHV0IDw8ICIwIjsKCX0KCQoJb3V0cHV0IDw8IChob3VyID09IDAgfHwgaG91ciA9PSAxMiA/IDEyIDogaG91ciAlIDEyKSA8PCAiOiIgPDwgKG1pbnV0ZSA8IDEwID8gIjAiIDogIiIpIDw8IG1pbnV0ZSA8PCAiOiIgPDwKCQkoc2Vjb25kIDwgMTAgPyAiMCIgOiAiIikgPDwgc2Vjb25kIDw8ICIgIiA8PCAoaG91ciA8IDEyID8gIkFNIiA6ICJQTSIpOwoJCQoJcmV0dXJuIG91dHB1dDsKfQoKaW50IG1haW4odm9pZCkKewoJVGltZVN0YW1wIHQoMTMsIDQ1LCA4Mik7CglzdGQ6OmNvdXQgPDwgdC5zdGFtcCA8PCAiOiAiIDw8IHQgPDwgc3RkOjplbmRsOwoJCglyZXR1cm4gMDsKfQoJ