diff options
Diffstat (limited to 'src/lib/util/coreutil.h')
-rw-r--r-- | src/lib/util/coreutil.h | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/src/lib/util/coreutil.h b/src/lib/util/coreutil.h index 167f696970e..4e5526fc6f0 100644 --- a/src/lib/util/coreutil.h +++ b/src/lib/util/coreutil.h @@ -29,8 +29,48 @@ uint32_t bcd_2_dec(uint32_t a); GREGORIAN CALENDAR HELPERS ***************************************************************************/ -int gregorian_is_leap_year(int year); -int gregorian_days_in_month(int month, int year); +constexpr bool gregorian_is_leap_year(int year) +{ + return !((year % 100) ? (year % 4) : (year % 400)); +} + + + +//------------------------------------------------- +// gregorian_days_in_month - given a year and a one-counted +// month, return the amount of days in that month +//------------------------------------------------- + +inline int gregorian_days_in_month(int month, int year) +{ + int result; + switch (month) + { + case 4: case 6: + case 9: case 11: + // Thirty days have September, April, June, and November. + result = 30; + break; + + case 1: case 3: + case 5: case 7: + case 8: case 10: + case 12: + // All the rest have Thirty One + result = 31; + break; + + case 2: + // No exceptions, but save one: Twenty Eight hath February + // in fine, and each leap year Twenty Nine + result = gregorian_is_leap_year(year) ? 29 : 28; + break; + + default: + throw false; + } + return result; +} /*************************************************************************** |