enum Weekday {
INVALID,
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
};
Weekday operator+(Weekday w, int n) {
if (w == INVALID) return w;
n %= 7;
if (n < 0) n += 7;
return Weekday((n + (w - 1)) % 7 + 1);
}
Weekday operator+(int n, Weekday w) { return w + n; }
Weekday operator-(Weekday w, int n) { return w + -n; }
std::string str(Weekday d) {
assert(INVALID <= d && d <= SUNDAY); // function precondition
static char const* const days[] = {
"INVALID",
"MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"
};
return days[d];
}
// you would probably not call this directly, but it shows how you simply have to
// pick what day int(0) means, and add any int to that day to get a Weekday
Weekday Weekday_from_num(int n, Weekday zero=MONDAY) {
return zero + n;
}
int main() {
assert(MONDAY + 1 == TUESDAY);
assert(MONDAY + 8 == TUESDAY);
assert(MONDAY - 1 == SUNDAY);
assert(MONDAY - 8 == SUNDAY);
cout << "MONDAY + 3 is " << str(MONDAY + 3) << '\n';
return 0;
}