//---------------------------------------------------------------------------
#ifndef datumH_3435
#define datumH_3435
/*
Datum.h
Besitzt alle nötigen Funktionen um ein Datum darzustellen, abzuspeichern
einzulesen und zu vergleichen.
Anwendung:
Datum.h evt. umbenennen und in den Include Pfad kopieren
(oder Pfad wo Header Dateien erwartet werden)
Datum.obj evt umbennen und in den Pfad für Objektdateien kopieren
Dem Compiler die Objektdatei bekanntgeben
Sollte in einer .cpp Datei die Uhrzeit gebraucht werden am Anfang:
#include "Uhrzeit.h"
und dann entweder using namespace mr;
oder jedesmal mit mr::Uhrzeit aufrufen
Bsp:
//user.c
int main() {
        Datum Jetzt;
        Jetzt.SetDatum();               //aktuelles Datum wird gesetzt
        cout << Jetzt << endl;          //Datum wird ausgegeben
        ofstream Datei ("c:\\datum.dat",ios::binary|ios::out);
        Jetzt.Save(Datei);              //Jetzt wird in datum.dat kopiert
        Datei.close();
        Datum dMorgen;
        ifstream InDatei ("c:\\datum.dat",ios::binary|ios::out);
        dMorgen.Load(InDatei);          //Datum ist in dMorgen
        cout << dMorgen << endl;
}
*/
//Author: Markus Raab
//Firma:  Metropolitan
// 24. August 2001
#include 
#include 
using namespace std;
#ifdef __cplusplus
namespace mr
{
#endif
class Overflow {}; //wird bei zahlenueberlauf geworfen
class Datum
{
private:
        short itsTag, itsMonat, itsJahr;
public:
        Datum (int itsTag = 1, int itsMonat = 1, int itsJahr = 1)
        {
                if (!SetDatum(itsTag, itsMonat, itsJahr))
                        itsTag = itsMonat = itsJahr = 1;
        }
                //Konstruktor und Defaultkonstruktor
        void SetDatum();
                //setzt akutelles Datum
        bool SetDatum(int itsTag, int itsMonat, int itsJahr);
                //ueberprueftes einlesen eines Datums
        bool SetTag(int Tag);
        bool SetMonat(int Monat);
        bool SetJahr(int Jahr);
                //Achtung:: IMMER zuerst Tag setzen, sonst ist Ueberpruefung bei
                //Monat undefiniert!!! (Februartage usw)
                //geschuetzte Zugriffsmethoden
protected:
        void Tag(int tag)       {itsTag = tag;}
        void Monat(int monat)   {itsMonat = monat;}
        void Jahr(int jahr)     {itsJahr = jahr;}
                //besonders schneller zugriff! Sollte NICHT verwendet werden!
public:
        int GetTag()    const {return itsTag;}
        int GetMonat()  const {return itsMonat;}
        int GetJahr()   const {return itsJahr;}
                //man kann jedes Element einzeln lesen
        string AsString() const;
        void SetString(string str);
        void AsChar(char * ch) const;
        void SetChar (char * str);
        int AsTage() const;
        int AsMonate() const;
        int AsJahre() const;
                //benoetigte Vergleichsoperatoren:
        bool operator != (const Datum & d) const;
        bool operator == (const Datum & d) const;
        bool operator >= (const Datum & d) const;
        bool operator <= (const Datum & d) const;
        bool operator >  (const Datum & d) const;
        bool operator <  (const Datum & d) const;
                //Ausgabeoperatoren fuer Console
        friend ostream & operator << (ostream & os, Datum & d);
        friend istream & operator >> (istream & is, Datum & d);
                //Ausgabeoperatoren fuer Dateien
        bool Save (ofstream & os);
        bool Load (ifstream & os);
};
        //so wird ein Schaltjahr berechnet!
inline bool isLeapYear (int itsJahr)
{
        return (itsJahr % 4 == 0 && itsJahr %100 != 0) || itsJahr % 400 == 0;
}
#ifdef __cplusplus
} //MR ende
#endif
#endif