
//
// To jest przykładowy kod z podrozdziału 9.8 „Klasa Date” książki „Programming Principles and Practice using C++” Bjarne'a Stroustrupa.
//

#include <iostream>

using namespace std;

//------------------------------------------------------------------------------

namespace Chrono {

//------------------------------------------------------------------------------

class Date {
public:
    enum Month {
        jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
    };

    class Invalid { };                 // Do zgłaszania wyjątków.

    Date(int y, Month m, int d);       // Sprawdza poprawność daty i wykonuje inicjację.
    Date();                            // Konstruktor domyślny
    // Domyślne operacje kopiowania są w porządku.

    // Operacje niemodyfikujące:
    int   day()   const { return d; }
    Month month() const { return m; }
    int   year()  const { return y; }

    // Operacje modyfikujące:
    void add_day(int n);        
    void add_month(int n);
    void add_year(int n);
private:
    int   y;
    Month m;
    int   d;
};

//------------------------------------------------------------------------------

bool is_date(int y, Date::Month m, int d); // true, jeśli data jest poprawna.

//------------------------------------------------------------------------------

bool leapyear(int y);                  // true, jeśli y jest rokiem przestępnym.

//------------------------------------------------------------------------------

bool operator==(const Date& a, const Date& b);
bool operator!=(const Date& a, const Date& b);

//------------------------------------------------------------------------------

ostream& operator<<(ostream& os, const Date& d);
istream& operator>>(istream& is, Date& dd);

//------------------------------------------------------------------------------

} // Chrono
