Guest User

Untitled

a guest
Nov 22nd, 2013
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.75 KB | None | 0 0
  1. #pragma once
  2.  
  3. #if _MSC_VER <= 1700
  4.     #pragma warning(disable : 4290)
  5. #endif
  6.  
  7. #include "stdafx.h"
  8.  
  9. #include <exception>
  10. #include <string>
  11.  
  12. #define _DLEXCEPT throw(DoubleListException)
  13. #define _DLTEMP ::SemestralniPrace::DoubleList<T>::
  14. #define _DLTYPE typename _DLTEMP
  15.  
  16. namespace SemestralniPrace {
  17.  
  18. template<typename T>
  19. class DoubleList
  20. {
  21. private:
  22.     struct Prvek
  23.     {
  24.         T data;
  25.         Prvek* predchudce;
  26.         Prvek* naslednik;
  27.     };
  28.  
  29.     class DoubleListException : public exception
  30.     {
  31.     public:
  32.         DoubleListException(const char* msg) : msg(msg) {}
  33.         DoubleListException(const std::string &msg) : msg(msg) {}
  34.         virtual ~DoubleListException(void) {}
  35.         virtual const char* what(void) const throw()
  36.         { return msg.c_str(); }
  37.     private:
  38.         std::string msg;
  39.     };
  40. public:
  41.     typedef void (*UkFunkce)(const T&);
  42.  
  43.     DoubleList(void);
  44.     ~DoubleList(void);
  45.  
  46.     inline bool JePrazdny(void) const { return pocetPrvku > 0; }
  47.     inline size_t PocetPrvku() const { return pocetPrvku; }
  48.  
  49.     void VlozPrvni(const T&);
  50.     void VlozPosledni(const T&);
  51.     void VlozNaslednika(const T&) _DLEXCEPT;
  52.     void VlozPredchudce(const T&) _DLEXCEPT;
  53.  
  54.     T& ZpristupniAktualni(void) _DLEXCEPT;
  55.     T& ZpristupniPrvni(void) _DLEXCEPT;
  56.     T& ZpristupniPosledni(void) _DLEXCEPT;
  57.     T& ZpristupniNaslednika(void) _DLEXCEPT;
  58.     T& ZpristupniPredchudce(void) _DLEXCEPT;
  59.  
  60.     T OdeberPrvni(void);
  61.     T OdeberPosledni(void);
  62.     T OdeberAktualni(void);
  63.     T OdeberNaslednika(void);
  64.     T OdeberPredchudce(void);
  65.  
  66.     void Prohlidka(UkFunkce) const;
  67.     void Zrus(void);
  68.  
  69.     class iterator
  70.     {
  71.     public:
  72.         iterator(_DLTYPE Prvek* x) : p(x) {}
  73.         iterator(const iterator& it) : p(it.p) {};
  74.         iterator& operator++() { p = p->naslednik; return *this; }
  75.         bool operator==(const iterator& it) { return p == it.p; }
  76.         bool operator!=(const iterator& it) { return p != it.p; }
  77.         T& operator*() { return p->data; }
  78.     private:
  79.         _DLTYPE Prvek* p;
  80.     };
  81.     class const_iterator;
  82.     iterator begin();
  83.     iterator end();
  84.     const_iterator cbegin();
  85.     const_iterator cend();
  86. private:
  87.     _DLTYPE Prvek* VytvorPrvek(const T& data, _DLTYPE Prvek* p, _DLTYPE Prvek* n);
  88.     void SmazPrvek(_DLTYPE Prvek* p);
  89.     void KontrolaAktualniho(void) const _DLEXCEPT;
  90.  
  91.     size_t pocetPrvku;
  92.     _DLTYPE Prvek* prvni;
  93.     _DLTYPE Prvek* posledni;
  94.     _DLTYPE Prvek* aktualni;
  95. };
  96.  
  97. template<typename T>
  98. _DLTEMP DoubleList(void)
  99.     : pocetPrvku(0), prvni(NULL), posledni(NULL), aktualni(NULL)
  100. {}
  101.  
  102. template<typename T>
  103. _DLTEMP ~DoubleList(void)
  104. {
  105.     Zrus();
  106. }
  107.  
  108. /************************************************************************/
  109. /* Vkladaci metody                                                      */
  110. /************************************************************************/
  111. template<typename T>
  112. void _DLTEMP VlozPrvni(const T& data)
  113. {
  114.     prvni = VytvorPrvek(data, NULL, prvni);
  115.     if (pocetPrvku == 1)
  116.         posledni = prvni;
  117. }
  118.  
  119. template<typename T>
  120. void _DLTEMP VlozPosledni(const T& data)
  121. {
  122.     if (pocetPrvku == 0)
  123.         VlozPrvni(data);
  124.     else
  125.         VytvorPrvek(data, posledni, NULL);
  126. }
  127.  
  128. template<typename T>
  129. void _DLTEMP VlozNaslednika(const T& data) _DLEXCEPT
  130. {
  131.     KontrolaAktualniho();
  132.  
  133.     VytvorPrvek(data, aktualni, aktualni->naslednik);
  134. }
  135.  
  136. template<typename T>
  137. void _DLTEMP VlozPredchudce(const T& data) _DLEXCEPT
  138. {
  139.     KontrolaAktualniho();
  140.  
  141.     VytvorPrvek(data, aktualni->predchudce, aktualni);
  142. }
  143.  
  144. /************************************************************************/
  145. /* Zpristupnovaci metody                                                */
  146. /************************************************************************/
  147. template<typename T>
  148. T& _DLTEMP ZpristupniAktualni(void) _DLEXCEPT
  149. {
  150.     KontrolaAktualniho();
  151.  
  152.     return aktualni->data;
  153. }
  154.  
  155. template<typename T>
  156. T& _DLTEMP ZpristupniPrvni(void) _DLEXCEPT
  157. {
  158.  
  159. }
  160.  
  161. /************************************************************************/
  162. /* Private methods                                                      */
  163. /************************************************************************/
  164. template<typename T>
  165. _DLTYPE Prvek* _DLTEMP VytvorPrvek(const T& data, _DLTYPE Prvek* p, _DLTYPE Prvek* n)
  166. {
  167.     SemestralniPrace::DoubleList<T>::Prvek* np = new SemestralniPrace::DoubleList<T>::Prvek();
  168.     np->data = data;
  169.     np->predchudce = p;
  170.     np->naslednik = n;
  171.  
  172.     if (p) p->naslednik = np;
  173.     if (n) n->predchudce = np;
  174.     ++pocetPrvku;
  175.  
  176.     return np;
  177. }
  178.  
  179. template<typename T>
  180. void _DLTEMP SmazPrvek(_DLTYPE Prvek* p)
  181. {
  182.     DoubleList<T>::Prvek* predchudce = p->predchudce;
  183.     DoubleList<T>::Prvek* naslednik = p->naslednik;
  184.  
  185.     if (predchudce) predchudce->naslednik = naslednik;
  186.     if (naslednik) naslednik->predchudce = predchudce;
  187.  
  188.     delete p;
  189.     --pocetPrvku;
  190. }
  191.  
  192. template<typename T>
  193. void _DLTEMP KontrolaAktualniho(void) const _DLEXCEPT
  194. {
  195.     if (!aktualni)
  196.         throw DoubleListException("Neni nastaven aktualni prvek.");
  197. }
  198.  
  199. }
Advertisement
Add Comment
Please, Sign In to add comment