Change year_month_day_last to store a {year, month_day_last}

* from storing a {year, month}.
    * Change constructor from {year, month} to {year, month_day_last}.
    * Add getter from year_month_day_last().
    * Fix up operator/() as required.
    * This is an API change, but not a functionality change.
    * Rationale: consistency.
This commit is contained in:
Howard Hinnant
2015-08-09 18:37:46 -04:00
parent 7796894a1c
commit 4b8ca1c24d

48
date.h
View File

@@ -575,20 +575,22 @@ std::ostream& operator<<(std::ostream& os, const year_month_day& ymd);
class year_month_day_last class year_month_day_last
{ {
date::year y_; date::year y_;
date::month m_; date::month_day_last mdl_;
public: public:
CONSTCD11 year_month_day_last(const date::year& y, const date::month& m) noexcept; CONSTCD11 year_month_day_last(const date::year& y,
const date::month_day_last& mdl) noexcept;
year_month_day_last& operator+=(const months& m) noexcept; year_month_day_last& operator+=(const months& m) noexcept;
year_month_day_last& operator-=(const months& m) noexcept; year_month_day_last& operator-=(const months& m) noexcept;
year_month_day_last& operator+=(const years& y) noexcept; year_month_day_last& operator+=(const years& y) noexcept;
year_month_day_last& operator-=(const years& y) noexcept; year_month_day_last& operator-=(const years& y) noexcept;
CONSTCD11 date::year year() const noexcept; CONSTCD11 date::year year() const noexcept;
CONSTCD11 date::month month() const noexcept; CONSTCD11 date::month month() const noexcept;
CONSTCD14 date::day day() const noexcept; CONSTCD11 date::month_day_last month_day_last() const noexcept;
CONSTCD14 date::day day() const noexcept;
CONSTCD14 operator day_point() const noexcept; CONSTCD14 operator day_point() const noexcept;
CONSTCD11 bool ok() const noexcept; CONSTCD11 bool ok() const noexcept;
@@ -703,7 +705,7 @@ class year_month_weekday_last
public: public:
CONSTCD11 year_month_weekday_last(const date::year& y, const date::month& m, CONSTCD11 year_month_weekday_last(const date::year& y, const date::month& m,
const date::weekday_last& wdl) noexcept; const date::weekday_last& wdl) noexcept;
year_month_weekday_last& operator+=(const months& m) noexcept; year_month_weekday_last& operator+=(const months& m) noexcept;
year_month_weekday_last& operator-=(const months& m) noexcept; year_month_weekday_last& operator-=(const months& m) noexcept;
@@ -1964,9 +1966,9 @@ operator<<(std::ostream& os, const month_weekday_last& mwdl)
CONSTCD11 CONSTCD11
inline inline
year_month_day_last::year_month_day_last(const date::year& y, year_month_day_last::year_month_day_last(const date::year& y,
const date::month& m) noexcept const date::month_day_last& mdl) noexcept
: y_(y) : y_(y)
, m_(m) , mdl_(mdl)
{} {}
inline inline
@@ -2002,7 +2004,15 @@ year_month_day_last::operator-=(const years& y) noexcept
} }
CONSTCD11 inline year year_month_day_last::year() const noexcept {return y_;} CONSTCD11 inline year year_month_day_last::year() const noexcept {return y_;}
CONSTCD11 inline month year_month_day_last::month() const noexcept {return m_;} CONSTCD11 inline month year_month_day_last::month() const noexcept {return mdl_.month();}
CONSTCD11
inline
month_day_last
year_month_day_last::month_day_last() const noexcept
{
return mdl_;
}
CONSTCD14 CONSTCD14
inline inline
@@ -2011,7 +2021,7 @@ year_month_day_last::day() const noexcept
{ {
CONSTDATA date::day d[] = CONSTDATA date::day d[] =
{31_d, 28_d, 31_d, 30_d, 31_d, 30_d, 31_d, 31_d, 30_d, 31_d, 30_d, 31_d}; {31_d, 28_d, 31_d, 30_d, 31_d, 30_d, 31_d, 31_d, 30_d, 31_d, 30_d, 31_d};
return m_ != feb || !y_.is_leap() ? d[static_cast<unsigned>(m_)-1] : 29_d; return month() != feb || !y_.is_leap() ? d[static_cast<unsigned>(month())-1] : 29_d;
} }
CONSTCD11 CONSTCD11
@@ -2019,7 +2029,7 @@ inline
bool bool
year_month_day_last::ok() const noexcept year_month_day_last::ok() const noexcept
{ {
return y_.ok() && m_.ok(); return y_.ok() && mdl_.ok();
} }
CONSTCD11 CONSTCD11
@@ -2027,7 +2037,7 @@ inline
bool bool
operator==(const year_month_day_last& x, const year_month_day_last& y) noexcept operator==(const year_month_day_last& x, const year_month_day_last& y) noexcept
{ {
return x.year() == y.year() && x.month() == y.month(); return x.year() == y.year() && x.month_day_last() == y.month_day_last();
} }
CONSTCD11 CONSTCD11
@@ -2045,7 +2055,7 @@ operator<(const year_month_day_last& x, const year_month_day_last& y) noexcept
{ {
return x.year() < y.year() ? true return x.year() < y.year() ? true
: (x.year() > y.year() ? false : (x.year() > y.year() ? false
: (x.month() < y.month())); : (x.month_day_last() < y.month_day_last()));
} }
CONSTCD11 CONSTCD11
@@ -2076,7 +2086,7 @@ inline
std::ostream& std::ostream&
operator<<(std::ostream& os, const year_month_day_last& ymdl) operator<<(std::ostream& os, const year_month_day_last& ymdl)
{ {
return os << ymdl.year() << '/' << ymdl.month() << "/last"; return os << ymdl.year() << '/' << ymdl.month_day_last();
} }
CONSTCD14 CONSTCD14
@@ -2108,7 +2118,7 @@ inline
year_month_day_last year_month_day_last
operator+(const year_month_day_last& ymdl, const years& dy) noexcept operator+(const year_month_day_last& ymdl, const years& dy) noexcept
{ {
return {ymdl.year()+dy, ymdl.month()}; return {ymdl.year()+dy, ymdl.month_day_last()};
} }
CONSTCD11 CONSTCD11
@@ -2210,7 +2220,7 @@ CONSTCD14
inline inline
year_month_day_last::operator day_point() const noexcept year_month_day_last::operator day_point() const noexcept
{ {
return day_point(y_/m_/day()); return day_point(year()/month()/day());
} }
CONSTCD14 CONSTCD14
@@ -2879,7 +2889,7 @@ inline
year_month_day_last year_month_day_last
operator/(const year_month& ym, last_spec) noexcept operator/(const year_month& ym, last_spec) noexcept
{ {
return {ym.year(), ym.month()}; return {ym.year(), month_day_last{ym.month()}};
} }
CONSTCD11 CONSTCD11
@@ -2887,7 +2897,7 @@ inline
year_month_day_last year_month_day_last
operator/(const year& y, const month_day_last& mdl) noexcept operator/(const year& y, const month_day_last& mdl) noexcept
{ {
return {y, mdl.month()}; return {y, mdl};
} }
CONSTCD11 CONSTCD11