Lempek

kontener.cpp

Dec 30th, 2011
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.70 KB | None | 0 0
  1. /*
  2. * File: kontener.cpp
  3. * Author: Marcin
  4. */
  5.  
  6. #include "kontener.h"
  7. //------------------------------------------------------------------------------
  8. // Konstruktory i destruktory
  9. // Konstruktor domyślny - tworzy kontener danego typu o domyślnym rozmiarze
  10.  
  11. template <typename TYP>
  12. Kontener<TYP>::Kontener() {
  13. rozmiar = DOMYSLNY_ROZMIAR;
  14. kontener = new TYP [rozmiar];
  15. }
  16. // Konstruktor z parametrami - tworzy kontener danego typu o podanym rozmiarze
  17.  
  18. template <typename TYP>
  19. Kontener<TYP>::Kontener(unsigned int podany_rozmiar) {
  20. rozmiar = podany_rozmiar;
  21. kontener = new TYP [rozmiar];
  22. }
  23. // Konstruktor kopiujący
  24.  
  25. template <typename TYP>
  26. Kontener<TYP>::Kontener(const Kontener& orig) {
  27. rozmiar = orig.rozmiar;
  28. kontener = new TYP [rozmiar];
  29. memcpy(kontener, orig.kontener, rozmiar * sizeof (TYP));
  30. // Alternatywnie:
  31. //for (unsigned int i = 0; i < rozmiar; i++) kontener[i] = orig.kontener[i];
  32. }
  33. // Wirtualny destruktor
  34.  
  35. template <typename TYP>
  36. Kontener<TYP>::~Kontener() {
  37. delete [] kontener;
  38. }
  39. //------------------------------------------------------------------------------
  40. // Metody
  41.  
  42. template <typename TYP>
  43. unsigned int Kontener<TYP>::pobierz_rozmiar() const {
  44. return rozmiar;
  45. }
  46.  
  47. template <typename TYP>
  48. TYP Kontener<TYP>::pobierz_elem(unsigned int index) {
  49. // Chroni przed przekorczeniem indeksu
  50. if (index < rozmiar) return kontener[index];
  51. // W przypadku przekroenia indeksu zwraca 0
  52. else return 0;
  53. }
  54.  
  55. template <typename TYP>
  56. bool Kontener<TYP>::dodaj_elem(TYP wartosc) {
  57. // Zapisuje index
  58. int index = rozmiar;
  59. // Zmienia rozmiar kontenera
  60. Kontener::zmien_rozm(rozmiar +1);
  61. // Dodaje element
  62. kontener[index] = wartosc;
  63. }
  64. template <typename TYP>
  65. bool Kontener<TYP>::modyfikuj_elem(unsigned int index, TYP wartosc) {
  66. // W przypadku przekroczenia indeksu zwraca false
  67. if (index >= rozmiar) return false;
  68. else if (rozmiar == 0) return false;
  69. else {
  70. kontener[index] = wartosc;
  71. return true;
  72. }
  73. }
  74.  
  75. template <typename TYP>
  76. bool Kontener<TYP>::usun_elem(unsigned int index) {
  77. // Chroni przed przekorczeniem indeksu
  78. if (!(index < rozmiar)) {
  79. // W przypadku przekroenia indeksu zwraca false
  80. return false;
  81. }
  82. if (rozmiar == 0) return false;
  83. // Alokuje nowy kontener, o rozmiarze mniejszym o jeden
  84. TYP* nowy_kontener = new TYP [rozmiar - 1];
  85. // Kopiuje bajty ze starego kontenera do nowego, pomijając wskazany element
  86. for (unsigned int i = 0; i < index; i++) nowy_kontener[i] = kontener[i];
  87. for (unsigned int i = index + 1; i < rozmiar; i++) nowy_kontener[i - 1] = kontener[i];
  88. // memcpy(nowy_kontener, kontener, index * sizeof (int));
  89. // memcpy(nowy_kontener + index, kontener, (rozmiar - index) * sizeof (int));
  90. // Usuwa stary kontener
  91. delete[] kontener;
  92. // Zapisuje nowy kontener i jego rozmiar do klasy
  93. kontener = nowy_kontener;
  94. rozmiar = rozmiar - 1;
  95. // Wszystko sie udalo - zwraca true
  96. return true;
  97. }
  98.  
  99. template <typename TYP>
  100. bool Kontener<TYP>::zamien_elem(TYP& a, TYP& b) {
  101. if (rozmiar < 2) return false;
  102. TYP c(a);
  103. a = b;
  104. b = c;
  105. }
  106.  
  107. template <typename TYP>
  108. bool Kontener<TYP>::zmien_rozm(unsigned int nowy_rozmiar) {
  109. // Sprawdza czy nowy rozmiar jest większy od starego, jeśli nie - zwraca false
  110. if (!(nowy_rozmiar > rozmiar)) return false;
  111. // Alokuje nowy kontener
  112. TYP* nowy_kontener = new TYP [nowy_rozmiar];
  113. // Kopiuje bajty ze starego kontenera do nowego
  114. memcpy(nowy_kontener, kontener, rozmiar * sizeof (TYP));
  115. // Usuwa stary kontener
  116. delete[] kontener;
  117. // Zapisuje nowy kontener i jego rozmiar do klasy
  118. kontener = nowy_kontener;
  119. rozmiar = nowy_rozmiar;
  120. // Wszystko sie udalo - zwraca true
  121. return true;
  122. }
  123.  
  124. // Przeciążone operatory
  125. // Przeciążony operator przypisania
  126.  
  127. template <typename TYP>
  128. Kontener<TYP>& Kontener<TYP>::operator=(const Kontener& nowa) {
  129. // Zabezpiecza przed przypisaniem nowa = nowa;
  130. if (&nowa == this) return *this;
  131. // Usuwa tablice do której przypisujemy
  132. delete[] kontener;
  133. // Alokuje tyle pamięci, aby pomieścić przypisywaną tablicę
  134. rozmiar = nowa.rozmiar;
  135. kontener = new TYP [rozmiar];
  136. // Kopiuje zawartosc przypisywanej tablicy
  137. memcpy(kontener, nowa.kontener, rozmiar * sizeof (TYP));
  138. // Zwraca refencję do *this
  139. return *this;
  140. }
  141. // Przeciążony operator indeksowania
  142.  
  143. template <typename TYP>
  144. TYP& Kontener<TYP>::operator[](unsigned index) {
  145. // Jeśli przekroczymy zakres zwróci odwołanie do ostatniego elementu
  146. return kontener[index < rozmiar ? index : rozmiar - 1];
  147. }
Advertisement
Add Comment
Please, Sign In to add comment