BD.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include <string>
  2. #include "BD.h"
  3. BD::BD(const BD& other)
  4. :m_cap(other.m_n), m_n(other.m_n), m_employee(new Pair* [other.m_n])
  5. {
  6. for (size_t i = 0; i < m_n; i++)
  7. {
  8. m_employee[i] = new Pair(*other.m_employee[i]);
  9. }
  10. }
  11. BD::BD(BD&& other)
  12. :m_cap(other.m_n), m_n(other.m_n)
  13. {
  14. m_employee = other.m_employee; //ïðîñòî çàáèðàåì äàííûå (ñèàìñêèå)
  15. other.m_n = other.m_cap = 0;//
  16. other.m_employee = nullptr;//ãîâîðèì, ÷òî ó äðóãîãî íåò (òåïåðü âñå îòëè÷íî)
  17. }
  18. //destructor
  19. BD::~BD()
  20. {
  21. for (size_t i = 0; i < m_n; i++)
  22. {
  23. delete m_employee[i];
  24. m_employee[i] = nullptr;
  25. }
  26. delete[]m_employee;
  27. m_employee = nullptr;
  28. }
  29. // äîáàâëåíèå ñîòðóäíèêîâ â áàçó
  30. void BD::Add_employee(const char* name, const Data& data)
  31. {
  32. for (size_t i = 0; i < m_n; i++)
  33. {
  34. if (m_employee[i]->m_name == name)
  35. {(*m_employee[i]).m_data = data;}
  36. }
  37. if (m_n == m_cap) //BD full
  38. {
  39. m_cap++;//add capacity
  40. Pair** tmp = new Pair * [m_cap];//âûäåëÿåì ïàìÿòü ïîä íîâûé ìàññèâ
  41. if (m_cap > 1)
  42. {
  43. for (size_t i = 0; i < m_n; i++)
  44. {tmp[i] = m_employee[i];} //ïåðåïèñûâàåì èç ñòàðîãî â íîâûé
  45. delete[] m_employee; //óäàëÿåì ñòàðûé
  46. }
  47. m_employee = tmp;//«ïåðåêèäûâàåì» óêàçàòåëè
  48. }
  49. m_employee[m_n] = new Pair(name, data);//ñîçäàåì êíèãó è äîáàâëÿåì åå êàðòîòåêó
  50. m_n++;
  51. }
  52. void BD::Add_employee(const char* name)
  53. {
  54. for (size_t i = 0; i < m_n; i++)
  55. {
  56. if (m_employee[i]->m_name == name){return;}
  57. }
  58. if (m_n == m_cap) //BD full
  59. {
  60. m_cap++;//add capacity
  61. Pair** tmp = new Pair * [m_cap];//âûäåëÿåì ïàìÿòü ïîä íîâûé ìàññèâ
  62. if (m_cap > 1)
  63. {
  64. for (size_t i = 0; i < m_n; i++)
  65. {
  66. tmp[i] = std::move(m_employee[i]); //ïåðåïèñûâàåì èç ñòàðîãî â íîâûé
  67. }
  68. delete[] m_employee; //óäàëÿåì ñòàðûé
  69. }
  70. m_employee = std::move(tmp); // «ïåðåêèäûâàåì» óêàçàòåëè
  71. }
  72. m_employee[m_n] = new Pair(name);//ñîçäàåì êíèãó è äîáàâëÿåì åå êàðòîòåêó
  73. m_n++;
  74. }
  75. //èñêëþ÷åíèå ñîòðóäíèêà èç áàçû
  76. void BD::Dell_employee(const char* name)
  77. {
  78. for (size_t i = 0; i < m_n; i++)
  79. {
  80. if (m_employee[i]->m_name == name)
  81. {
  82. //dell data
  83. delete/*[] */m_employee[i];//Pair
  84. m_employee[i] = nullptr;
  85. //sort BD
  86. for (size_t j = i+1; j < m_n; i++,j++)
  87. {
  88. m_employee[i] = m_employee[j];//ïåðåêèíóëè óêàçàòåëè
  89. }
  90. //ñèàìû ïîñëåäíèé è ïðåäïîñëåäíèé
  91. m_n--;
  92. //îáíóëèëè ïîñëåäíèé - íåò ñèàìîâ
  93. m_employee[m_n] = nullptr;
  94. }
  95. }
  96. }
  97. BD& BD::operator=(const BD& other)
  98. {
  99. if (this != &other)
  100. {
  101. //clear data
  102. for (size_t i = 0; i < m_n; i++)
  103. {
  104. delete m_employee[i];
  105. m_employee[i] = nullptr;
  106. }
  107. if (m_cap < other.m_n)
  108. { //íàäî áîëëüøå ïàìÿòè ïîä ìàññèâ óêàçàòåëåé
  109. m_cap = other.m_n;//set capacity
  110. delete[]m_employee;
  111. m_employee = new Pair * [m_cap];
  112. }
  113. //copy data
  114. m_n = other.m_n;
  115. for (size_t i = 0; i < m_n; i++)
  116. {
  117. m_employee[i] = new Pair(*other.m_employee[i]);//3d var more effection
  118. }
  119. }
  120. return *this;
  121. }
  122. BD& BD::operator=(BD&& other)
  123. {
  124. if (this != &other)
  125. {
  126. ///clear data
  127. for (size_t i = 0; i < m_n; i++)
  128. {
  129. delete m_employee[i];
  130. m_employee[i] = nullptr;
  131. }
  132. delete[]m_employee;
  133. //copy data
  134. m_cap = m_n = other.m_n;
  135. m_employee = other.m_employee; //ïðîñòî çàáèðàåì äàííûå (ñèàìñêèå)
  136. other.m_n = other.m_cap = 0;
  137. other.m_employee = nullptr;//ãîâîðèì, ÷òî ó äðóãîãî íåò (òåïåðü âñå îòëè÷íî)
  138. }
  139. return *this;
  140. }
  141. //operator[]
  142. Data& BD::operator[](const char* Str)
  143. {// TODO: insert return statement here
  144. for (size_t i = 0; i < m_n; i++)
  145. {
  146. if (m_employee[i]->m_name == Str)
  147. {
  148. return (*m_employee[i]).m_data;
  149. }
  150. }
  151. //check m_cap:
  152. //if full then add capacity & add new pair
  153. //else add new pair in BD
  154. this->Add_employee(Str);
  155. return (*m_employee[m_n - 1]).m_data;
  156. }
  157. //Data& BD::operator[](const char* Str) const
  158. //{
  159. // return (*m_employee[m_n - 1]).m_data;
  160. //}
  161. std::ostream& operator<<(std::ostream& os, const BD& m_bd)
  162. {
  163. for (size_t i = 0; i < m_bd.m_n; i++)
  164. {
  165. os << *m_bd.m_employee[i] << std::endl;
  166. }
  167. return os;
  168. }