// // Készítette: Toldi Balázs Ádám // Dátum: 2020. 04. 07. // #ifndef HF_NAPTAR_NAPTAR_H #define HF_NAPTAR_NAPTAR_H //! @author Toldi Balázs Ádám #include #include #include #include #include #include "Datum.h" /*! * @brief A naptár osztály tárolja azoknak a napoknak a dátumát,amely napok foglaltak már. * Ha az osztály kap egy dátumot, akkor el kell tudnia dönteni,hogy az adott nap szabad-e. * Fontos, hogy egy dátum csak egyszer szerepelhet. * Ha egy adott dátumot egynél többször szeretnénk felvenni, a program hibát dob. */ class Naptar { //! Dinamikusan méretezett tömb. A konstruktorban jön létre és a destruktorban szűnik meg. Datum **napok; //! A tömb aktuális mérete size_t db; /*! * @brief Rendezi a dinamikusan foglalt tömböt, időrendben növekvőre. */ void rendez(); //!Másolás letiltására Naptar(const Naptar& ) = delete; //!Másolás letiltására Naptar& operator=(const Naptar&) = delete; public: class iterator; /*! * @brief A tömb aktuális mérete * @return @copybrief size() */ size_t size() const; /*! * @brief Paraméter nélkül hívható konstruktor */ Naptar(); /*! * @brief Konstruktor első elemmel * @param n Az első elem * \code{.cpp} * Naptar np(new Datum()); * \endcode */ explicit Naptar(Datum* n); /*! * @brief Megnézi, hogy egy adott dátum foglalt-e * @param nap A keresett dátum * @return Logikai változó az alapján, hogy foglalt-e */ bool foglalt(const Datum& nap); /*! * @copybrief foglalt() * @param ev @copybrief Datum.ev * @param honap @copybrief Datum.honap * @param nap @copybrief Datum.nap * @return Logikai változó az alapján, hogy foglalt-e */ bool foglalt(int ev, int honap, int nap); /*! * @brief Kivesz egy Datum osztályt a tömbből * @param nap A Datum osztály, amit el szeretnénk távolítani * @note Ha az elem nem található,akkor a tartalma változatlan marad (Viszont erőforrást igényel). */ void felszabadit(const Datum &nap); /*! * @copybrief felszabadit() * @param ev @copybrief Datum.ev * @param honap @copybrief Datum.honap * @param nap @copybrief Datum.nap * @note Ha az elem nem található,akkor a tartalma változatlan marad (Viszont erőforrást igényel). */ void felszabadit(int ev, int honap, int nap); /*! * @brief Kiüríti a tömböt. */ void urit(); /*! * @brief Hozzáad egy új elemet a listához. * @param n A hozzáadandó datum osztály mutató * @warning Ha a dátum már foglalt, kivételt dob. */ void hozzaad(Datum* n); /*! * @copybrief hozzaad() * @param ev @copybrief Datum.ev * @param honap @copybrief Datum.honap * @param nap @copybrief Datum.nap * @warning Ha a dátum már foglalt, kivételt dob. */ void hozzaad(int ev, int honap, int nap); /*! * @brief Kiírja a megadott évre tervezett eseményeket * @param ev Az év,amely eseményeit szeretnénk kiírni * @param os A stream amire kiírja * @param spacer A karakter,amivel a tagokat elválasztja */ void printTable(int ev,std::ostream& os=std::cout,char spacer='\t'); /*! * @brief Kiírja a megadott hónapra tervezett eseményeket * @param ev Az év,amely eseményeit szeretnénk kiírni * @param honap A hónap,amely eseményeit szeretnénk kiírni * @param os A stream amire kiírja * @param spacer A karakter,amivel a tagokat elválasztja */ void printTable(int ev,int honap,std::ostream& os=std::cout,char spacer='\t'); /*! * @brief Kiírja az összes bejegyzett eseményt * @param os A stream amire kiírja * @param spacer A karakter,amivel a tagokat elválasztja */ void printAll(std::ostream& os=std::cout,char spacer='\t'); /*! * @brief A naptár tartalmát kimenti egy CSV fájlba * @param path A fájl elérési útvonala * @note A naptár osztály tartalmát kiírja egy CSV fájlba. * A CSV táblázat oszlopai pontosvesszővel( ; ),a sorai sortöréssel vannak elválasztva. */ void exportCSV(const char* path); /*! * @brief Egy CSV fájlból kiolvas Dátumokat,és ha szabad, behelyezi azokat a naptárba. * @param path A fájl elérési útvonala * @note A CSV táblázat oszlopai pontosvesszővel( ; ),a sorai sortöréssel vannak elválasztva. */ void importCSV(const char* path); /*! * @brief Destruktor. Itt törlődik az összes elem. */ virtual ~Naptar(); /*! * @brief Bejáró kezdete * @return Bejáró kezdete */ iterator begin(); /*! * @brief Bejáró vége * @return Bejáró vége */ iterator end(); /*! * @brief Visszaadja az adott helyen lévő Datum \link Naptar.iterator iterátor\endlink-át * @param id Az adott tag sorszáma * @return Az adott helyen lévő Datum \link Naptar.iterator iterátor\endlink-át * @note Az események időrendi sorrendben vannak */ iterator at(size_t id); /*! * Tömb iteráló(bejáró) */ class iterator{ //! Mutató az aktuális elemre Datum **akt; //! Mutató a tömb végére Datum **veg; public: //! Paraméter nélkül hívható konstruktor iterator() : akt(NULL), veg(NULL) {}; /*! * @param nptr Naptár osztály,amihez szeretnénk a bejárót * @param n Az elem sorszáma */ explicit iterator(Naptar &nptr, int n = 0) : akt(nptr.napok + n), veg(nptr.napok + nptr.db) {}; /*! * @brief Bejáró dereferálása * @return Az érték amire mutat */ Datum& operator*() const; /*! * @brief iterator léptetése (preinkrementer) */ iterator operator++(); /*! * @brief iterator léptetése visszafelé */ iterator operator--(); /*! * @brief iterator léptetése egy megadott számmal előre * @param n Ahánnyal léptetni szeretnénk */ iterator operator+(int n); /*! * @brief iterator léptetése egy megadott számmal hátra * @param n Ahánnyal léptetni szeretnénk */ iterator operator-(int n); /*! * @brief Két iterátort összehasonlít az alapján,hogy melyik van közelebba végéhez */ bool operator<(iterator i); /*! * @brief iterator léptetése (postinkrementer) */ iterator operator++(int i); /*! * @brief iterator léptetése visszafelé */ iterator operator--(int i); /*! * @brief Nyil operátor */ Datum *operator->(); /*! * Két iterátor megegyezését ellenőrzi * @param it Az iterátor amivel össze szeretnénk hasonlítani a jelenlegit * @return Egyezést jelző logikai érték */ bool operator==(const iterator &it); /*! * Az operator==() függvény negáltja * @param it Az iterátor amivel össze szeretnénk hasonlítani a jelenlegit * @return Egyenlőtlenséget jelző logikai érték */ bool operator!=(const iterator &it); /*! * Két iterátor "távolságát" adja meg * @param it Az iterátor amivel össze szeretnénk hasonlítani a jelenlegit * @return Vissza adja, hogy mennyi adat van a két iterátor között */ int operator-(const iterator &it); }; }; std::ostream &operator<<(std::ostream &os, Naptar &np); #endif //HF_NAPTAR_NAPTAR_H