IntelBohdan

Untitled

Apr 20th, 2015
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.16 KB | None | 0 0
  1. #ifndef __PROGTEST__
  2. #include <cassert>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <iostream>
  7. #include <iomanip>
  8. using namespace std;
  9. #endif /* __PROGTEST__ */
  10.  
  11.  
  12.  
  13. class CRegister
  14. {
  15. public:
  16. // copy cons, op=, dtor ...
  17. CRegister (void);
  18. CRegister(const CRegister & x);
  19.  
  20. CRegister & operator = ( CRegister x );
  21. ~CRegister (void);
  22. bool AddCar ( const char * rz,
  23. const char * name,
  24. const char * surname );
  25. bool DelCar ( const char * rz );
  26. bool Transfer ( const char * rz,
  27. const char * nName,
  28. const char * nSurname );
  29. CCarList ListCars ( const char * name,
  30. const char * surname ) const;
  31. int CountCars ( const char * name,
  32. const char * surname ) const;
  33. COwnerList ListOwners ( const char * RZ ) const;
  34. int CountOwners ( const char * RZ ) const;
  35. void SetCharAt ( int idx, char X );
  36.  
  37. void Print(void) const;
  38.  
  39.  
  40. private:
  41.  
  42.  
  43. struct TData
  44. {
  45. TData ( int reserve );
  46. TData ( const TData & src,
  47. int reserve );
  48. ~TData ( void );
  49. void Append ( const char * src,
  50. int srcLen );
  51.  
  52. int m_RefCnt;
  53. int m_Len;
  54. int m_Max;
  55. //char * m_Str;
  56. char * m_name;
  57. char * m_surname;
  58. char * m_RZ;
  59. int majitel;
  60. };
  61. void append ( const char * src, int srclen );
  62. void detach ( int newMaxSize );
  63.  
  64.  
  65. TData *m_Cars;
  66. int m_CarsNr;
  67. };
  68.  
  69.  
  70.  
  71.  
  72.  
  73. CRegister::TData::TData ( int reserve )
  74. {
  75. m_RefCnt = 1;
  76. // m_Len1 = strlen (rz);
  77. // m_Len2 = strlen (name);
  78. // m_Len3 = strlen (surname);
  79. m_Len=100;
  80.  
  81.  
  82. m_Max = 100;
  83. m_name = new char[m_Max];
  84. m_surname = new char[m_Max];
  85. m_RZ = new char[m_Max];
  86. // memcpy ( m_name, name, m_Len + 1 );
  87. // memcpy ( m_RZ, rz, m_Len + 1 );
  88. // memcpy ( m_surname, surname, m_Len + 1 );
  89. }
  90. // memcpy ( m_name, str, m_Len + 1 );// + 1 = zero terminating character
  91.  
  92. CRegister::TData::TData ( const TData & src,
  93. int reserve )
  94. {
  95. m_RefCnt = 1;
  96. m_Len = src . m_Len;
  97. // m_Len2 = src . m_Len2;
  98. // m_Len3 = src . m_Len3;
  99. m_Max = reserve;
  100. m_name = new char[m_Max];
  101. m_surname = new char[m_Max];
  102. m_RZ = new char[11];
  103. memcpy ( m_name, src . m_name, m_Len + 1 );
  104. memcpy ( m_RZ, src . m_RZ, m_Len + 1 );
  105. memcpy ( m_surname, src . m_surname, m_Len + 1 );
  106. }
  107.  
  108. CRegister::TData::~TData ( void )
  109. {
  110. delete [] m_name;
  111. delete [] m_surname;
  112. delete [] m_RZ;
  113. }
  114.  
  115. void CRegister::TData::Append ( const char * src,
  116. int srcLen )
  117. {
  118. if ( m_Len + srcLen + 1 > m_Max )
  119. {
  120. // increase the size. If m_Max is small, just increase by 10 chars
  121. // if m_Max is big enough, increase the size by a factor of 1.5
  122. while ( m_Len + srcLen + 1 > m_Max )
  123. m_Max += m_Max < 100 ? 10 : m_Max / 2;
  124.  
  125. char * tmp1 = new char [m_Max];
  126. char * tmp2 = new char [m_Max];
  127. char * tmp3 = new char [m_Max];
  128. memcpy ( tmp1, m_name, m_Len );
  129. memcpy ( tmp2, m_surname, m_Len );
  130. memcpy ( tmp3, m_RZ, m_Len );
  131. memcpy ( tmp1 + m_Len, src, srcLen );
  132. memcpy ( tmp2 + m_Len, src, srcLen );
  133. memcpy ( tmp3 + m_Len, src, srcLen );
  134. delete [] m_name;
  135. delete [] m_surname;
  136. delete [] m_RZ;// safe even if m_Str == src (can be the case of a += a)
  137. m_name = tmp1;
  138. m_surname = tmp2;
  139. m_RZ = tmp3;
  140. }
  141. else
  142. memcpy ( m_name + m_Len, src, srcLen );
  143. memcpy ( m_surname + m_Len, src, srcLen );
  144. memcpy ( m_RZ + m_Len, src, srcLen );
  145. //m_Len += srcLen;
  146. m_name[m_Len] = 0;
  147. m_surname[m_Len] = 0;
  148. m_RZ[m_Len] = 0;
  149. }
  150.  
  151.  
  152. CRegister::CRegister ( void )
  153. {
  154. m_Cars = new TData ( 1000 );
  155. }
  156. CRegister::CRegister ( const CRegister & x )
  157. {
  158. m_Cars = x . m_Cars;
  159. m_Cars -> m_RefCnt ++;
  160. }
  161. CRegister::~CRegister ( void )
  162. {
  163. if ( -- m_Cars -> m_RefCnt == 0 ) delete m_Cars;
  164. }
  165.  
  166. CRegister & CRegister::operator = ( CRegister x )
  167. {
  168. swap ( m_Cars, x . m_Cars );
  169. return *this;
  170. }
  171.  
  172.  
  173. //-------------------------------------------------------------------------------------------------
  174. void CRegister::SetCharAt ( int idx, char X )
  175. {
  176. if ( idx < 0 || idx >= m_Cars -> m_Len )
  177. throw "index out of range";
  178.  
  179. detach ( m_Cars -> m_Max );
  180. m_Cars -> m_name[idx] = X;
  181. m_Cars -> m_surname[idx] = X;
  182. m_Cars -> m_RZ[idx] = X;
  183. }
  184. //-------------------------------------------------------------------------------------------------
  185. void CRegister::append ( const char * src,
  186. int srcLen )
  187. {
  188. detach ( m_Cars -> m_Len + srcLen + 1 );
  189. m_Cars -> Append ( src, srcLen );
  190. }
  191. //-------------------------------------------------------------------------------------------------
  192. void CRegister::detach ( int newMaxSize )
  193. {
  194. if ( m_Cars -> m_RefCnt > 1 )
  195. {
  196. TData * tmp = new TData ( *m_Cars, newMaxSize );
  197. m_Cars -> m_RefCnt --;
  198. m_Cars = tmp;
  199. }
  200. }
  201.  
  202. //-----------------------------------------------------------------------------
  203. bool CRegister::AddCar ( const char * rz,
  204. const char * name,
  205. const char * surname )
  206. {
  207. for ( int i=0; i<m_CarsNr; i++ )
  208. if ( m_Cars[i] . m_RZ == rz )
  209. return ( false );
  210.  
  211.  
  212.  
  213. memcpy ( m_Cars [m_CarsNr] . m_RZ, rz, strlen(rz)+1 );
  214. memcpy ( m_Cars [m_CarsNr] . m_name, name, strlen(name)+1 );
  215. memcpy ( m_Cars [m_CarsNr] . m_surname, surname, strlen(surname)+1 );
  216.  
  217. // m_Cars [m_CarsNr] . m_RZ = rz;
  218. // m_Cars [m_CarsNr] . m_name = name;
  219. // m_Cars [m_CarsNr] . m_surname = surname;
  220. m_Cars[m_CarsNr].majitel = 1;
  221. m_CarsNr++;
  222.  
  223. return true;
  224.  
  225.  
  226. }
Advertisement
Add Comment
Please, Sign In to add comment