Advertisement
Guest User

Untitled

a guest
May 23rd, 2015
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <limits>
  3. #include "MyString.h"
  4. #include "stringOperation.h"
  5.  
  6. size_t maxSize_t = std::numeric_limits<size_t >::max();
  7.  
  8. size_t MyString::length() const
  9. {
  10. size_t len = 0;
  11. if (ptr != nullptr)
  12. {
  13. const char *cur = ptr;
  14. while (* (cur++));
  15. len = cur - ptr - 1 ;
  16. }
  17. return len;
  18. }
  19.  
  20. void MyString::delAndNewCount()
  21. {
  22. if (count != nullptr)
  23. {
  24. if (*count < 2)
  25. {
  26. delete []ptr;
  27. }
  28. else
  29. {
  30. (*count)--;
  31. count = new size_t;
  32. *count = 1;
  33. }
  34. }
  35. else
  36. {
  37. count = new size_t;
  38. *count = 1;
  39. }
  40. }
  41.  
  42. MyString::MyString()
  43. {
  44. ptr = nullptr;
  45. count = nullptr;
  46. }
  47.  
  48. MyString::MyString (const char *const s)
  49. {
  50. size_t len = strlength (s);
  51. if (len>0)
  52. {
  53. ptr = new char[len + 1];
  54. for (size_t i = 0; i < len ; i++)
  55. {
  56. ptr[i] = s[i];
  57. }
  58. ptr[len] = '\0';
  59. count = new size_t;
  60. *count = 1;
  61. }else
  62. {
  63. ptr=nullptr;
  64. count=nullptr;
  65. }
  66. }
  67.  
  68. MyString::MyString (const MyString &s)
  69. {
  70. size_t len = s.length();
  71. ptr = new char[len + 1];
  72. for (size_t i = 0; i < len; i++)
  73. {
  74. ptr[i] = s.ptr[i];
  75. }
  76. ptr[len] = '\0';
  77. count = new size_t;
  78. *count = 1;
  79. }
  80.  
  81. void MyString::copy (MyString &s)
  82. {
  83. if (ptr != nullptr)
  84. {
  85. size_t len = length();
  86. s.delAndNewCount();
  87. s.ptr = new char[len + 1];
  88. for (size_t i = 0; i < len; i++)
  89. {
  90. s.ptr[i] = ptr[i];
  91. }
  92. s.ptr[len] = '\0';
  93. }
  94. else
  95. {
  96. if (s.count != nullptr)
  97. {
  98. if (*s.count == 1)
  99. {
  100. delete[] s.ptr;
  101. delete s.count;
  102. }
  103. else
  104. {
  105. (*s.count)--;
  106. }
  107. }
  108. // s.~MyString();
  109. s.ptr = ptr;
  110. s.count = count;
  111. }
  112. }
  113.  
  114. size_t MyString::findChr (char ch) const
  115. {
  116. size_t pos = 0;
  117. for (size_t i = 0; i < length(); i++)
  118. {
  119. if (ptr[i] == ch)
  120. {
  121. pos = i + 1;
  122. break;
  123. }
  124. }
  125. if (pos == 0)
  126. {
  127. pos = maxSize_t;
  128. }
  129. return pos;
  130. }
  131.  
  132. size_t MyString::findStr (const MyString &s) const
  133. {
  134. size_t pos = 0;
  135. size_t flag = 0;
  136. size_t len = length();
  137. size_t sublen = s.length();
  138. if (sublen <= len)
  139. {
  140. for (size_t i = 0; i < len - sublen + 1 ; i++)
  141. {
  142. for (size_t j = 0; j < sublen; j++)
  143. {
  144. if (ptr[i + j] == s.ptr[j])
  145. {
  146. pos = i;
  147. if (j == sublen - 1)
  148. {
  149. flag = 1;
  150. }
  151. }
  152. else
  153. {
  154. pos = 0;
  155. break;
  156. }
  157. }
  158. if (flag == 1)
  159. {
  160. break;
  161. }
  162. }
  163. }
  164. if (pos == 0)
  165. {
  166. pos = maxSize_t;
  167. }
  168. return pos;
  169. }
  170.  
  171. size_t MyString::findStr (const char *s) const
  172. {
  173. size_t pos = 0;
  174. size_t flag = 0;
  175. size_t len = length();
  176. size_t sublen = strlength (s);
  177. if (sublen <= len)
  178. {
  179. for (size_t i = 0; i < len - sublen + 1; i++)
  180. {
  181. for (size_t j = 0; j < sublen; j++)
  182. {
  183. if (ptr[i + j] == s[j])
  184. {
  185. pos = i;
  186. if (j == sublen - 1)
  187. {
  188. flag = 1;
  189. }
  190. }
  191. else
  192. {
  193. pos = 0;
  194. break;
  195. }
  196. }
  197. if (flag == 1)
  198. {
  199. break;
  200. }
  201. }
  202. }
  203. if (pos == 0)
  204. {
  205. pos = maxSize_t;
  206. }
  207. return pos;
  208. }
  209.  
  210. void MyString::swap (MyString &s)
  211. {
  212. // if (*count >= 1 && *s.count >= 1)
  213. // {
  214. char *temp = s.ptr;
  215. s.ptr = ptr;
  216. ptr = temp;
  217. size_t *tempcount = s.count;
  218. s.count = count;
  219. count = tempcount;
  220. // }
  221. }
  222.  
  223. bool MyString::insert (const char ch, size_t pos)
  224. {
  225. MyString temp (ptr);
  226. size_t lengthDest = length();
  227. if (pos - 1 <= lengthDest && ch!='\0')
  228. {
  229. delAndNewCount();
  230. ptr = new char[lengthDest + 2];
  231. for (size_t i = 0; i < pos - 1; i++)
  232. {
  233. ptr[i] = temp.ptr[i];
  234. }
  235. ptr[pos - 1] = ch;
  236. for (size_t i = pos; i < lengthDest + 2; i++)
  237. {
  238. ptr[i] = temp.ptr[i - 1];
  239. }
  240. }
  241. return (ptr[pos - 1] == ch);
  242. }
  243.  
  244. bool MyString::insert (const char *s, size_t pos)
  245. {
  246. size_t lengthDest = length();
  247. size_t lengthSource = strlength (s);
  248. bool compare = false;
  249. if (pos - 1 <= lengthDest && lengthSource > 0)
  250. {
  251. MyString temp (ptr);
  252. delAndNewCount();
  253. ptr = new char[lengthSource + lengthDest + 1];
  254. for (size_t i = 0; i < pos - 1; i++)
  255. {
  256. ptr[i] = temp.ptr[i];
  257. }
  258. for (size_t i = 0; i < lengthSource; i++)
  259. {
  260. ptr[pos - 1 + i] = s[i];
  261. }
  262. for (size_t i = pos - 1; i < lengthDest; i++)
  263. {
  264. ptr[lengthSource + i] = temp.ptr[i];
  265. }
  266. ptr[lengthSource+lengthDest]='\0';
  267. }
  268. for (size_t i = 0; i < lengthSource; i++)
  269. {
  270. if (! (compare = (ptr[pos - 1 + i] == s[i])))
  271. {
  272. break;
  273. }
  274. }
  275. return compare;
  276. }
  277.  
  278. bool MyString::insert (const MyString &s, size_t pos)
  279. {
  280. size_t lengthDest = length();
  281. size_t lengthSource = s.length();
  282. bool compare = false;
  283. if (pos - 1 <= lengthDest && lengthSource > 0)
  284. {
  285. MyString temp (ptr);
  286. delAndNewCount();
  287. ptr = new char[lengthSource + lengthDest + 1];
  288. for (size_t i = 0; i < pos - 1; i++)
  289. {
  290. ptr[i] = temp.ptr[i];
  291. }
  292. for (size_t i = 0; i < lengthSource; i++)
  293. {
  294. ptr[pos - 1 + i] = s.ptr[i];
  295. }
  296. for (size_t i = pos - 1; i < lengthDest ; i++)
  297. {
  298. ptr[lengthSource + i] = temp.ptr[i];
  299. }
  300. ptr[lengthSource+lengthDest]='\0';
  301. }
  302. for (size_t i = 0; i < lengthSource; i++)
  303. {
  304. if (! (compare = (ptr[pos - 1 + i] == s.ptr[i])))
  305. {
  306. break;
  307. }
  308. }
  309. return compare;
  310. }
  311.  
  312. bool MyString::erase (const size_t pos, const size_t amount)
  313. {
  314. size_t lenstr = length();
  315. bool compare = false;
  316.  
  317. if (pos + amount-1 <= lenstr && pos > 0)
  318. {
  319. if(pos==1 && amount==lenstr)
  320. {
  321. if (*count < 2)
  322. {
  323. delete []ptr;
  324. delete count;
  325. count=nullptr;
  326. }
  327. else
  328. {
  329. (*count)--;
  330. // count=new size_t ;
  331. // delete count;
  332. count=nullptr;
  333. }
  334. ptr=nullptr;
  335.  
  336. }else
  337. {
  338. MyString temp (ptr);
  339. delAndNewCount(); //
  340. ptr = new char[lenstr - amount]; //Надо ли?
  341. for (size_t i = 0; i < pos - 1; i++)
  342. {
  343. ptr[i] = temp.ptr[i];
  344. }
  345. for (size_t i = pos - 1; i < lenstr - amount + 1; i++)
  346. {
  347. ptr[i] = temp.ptr[i + amount];
  348. }
  349. compare = (ptr[pos - 2] == temp.ptr[pos - 2] && ptr[pos - 1] == temp.ptr[pos - 1 + amount]);
  350. }
  351. }
  352. return compare;
  353. }
  354.  
  355. MyString MyString::operator = (const MyString &s)
  356. {
  357. if (count != nullptr)
  358. {
  359. if (*count == 1)
  360. {
  361. delete[] ptr;
  362. delete count;
  363. }
  364. else
  365. {
  366. (*count)--;
  367. }
  368. }
  369. ptr = s.ptr;
  370. // count= new size_t ; //i don't know
  371. count = s.count;
  372. if (count != nullptr)
  373. {
  374. *count = *count + 1;
  375. }
  376. return (*this);
  377. }
  378.  
  379. MyString MyString::operator = (const char *const s)
  380. {
  381. size_t len = strlength (s);
  382. if (count != nullptr)
  383. {
  384. if (*count < 2)
  385. {
  386. delete []ptr;
  387. }
  388. else
  389. {
  390. (*count)--;
  391. }
  392. }
  393. ptr=nullptr;
  394. count=nullptr;
  395. if (len != 0)
  396. {
  397. ptr = new char[len];
  398. count=new size_t ;
  399. (*count)=1;
  400. }
  401. for (size_t i = 0; i < len + 1; i++)
  402. {
  403. ptr[i] = s[i];
  404. }
  405. return (*this);
  406. }
  407.  
  408. MyString MyString::operator+ (const MyString &s)
  409. {
  410. size_t lenstr = length();
  411. size_t lengthSource = s.length();
  412. char *str = nullptr;
  413. if (lengthSource != 0 || lenstr != 0)
  414. {
  415. str = new char[lenstr + lengthSource + 1];
  416. for (size_t i = 0; i < lenstr; i++)
  417. {
  418. str[i] = ptr[i];
  419. }
  420. for (size_t i = 0; i < lengthSource; i++)
  421. {
  422. str[i + lenstr] = s.ptr[i];
  423. }
  424. str[lenstr + lengthSource] = '\0';
  425. }
  426. return MyString (str);
  427. }
  428.  
  429. MyString MyString::operator+ (const char *const s)
  430. {
  431. MyString temp (ptr);
  432. size_t lenstr = length();
  433. size_t lengthSource = strlength (s);
  434. char *str;
  435. if (lengthSource != 0 || lenstr != 0)
  436. {
  437. str = new char[lenstr + lengthSource + 1];
  438. for (size_t i = 0; i < lenstr; i++)
  439. {
  440. str[i] = temp.ptr[i];
  441. }
  442. for (size_t i = 0; i < lengthSource + 1; i++)
  443. {
  444. str[i + lenstr] = s[i];
  445. }
  446. }
  447. return MyString (str);
  448. }
  449.  
  450. char MyString::operator[] (size_t pos)
  451. {
  452. char ch = '\0';
  453. if (pos > 0 && pos <= length())
  454. {
  455. ch = ptr[pos - 1];
  456. }
  457. return ch;
  458. }
  459.  
  460. bool MyString::operator == (const MyString &s)
  461. {
  462. bool compare;
  463. size_t lenstr = length();
  464. if (lenstr == s.length())
  465. {
  466. if (s.ptr == ptr)
  467. {
  468. compare = true;
  469. }
  470. else
  471. {
  472. for (size_t i = 0; i < lenstr; i++)
  473. {
  474. compare = (ptr[i] == s.ptr[i]);
  475. if (!compare)
  476. {
  477. break;
  478. }
  479. }
  480. }
  481. }
  482. else
  483. {
  484. compare = false;
  485. }
  486. return compare;
  487. }
  488.  
  489. bool MyString::operator == (const char *s)
  490. {
  491. bool compare;
  492. size_t lenstr = length();
  493. if (lenstr == strlength (s))
  494. {
  495. if (s == ptr)
  496. {
  497. compare = true;
  498. }
  499. else
  500. {
  501. for (size_t i = 0; i < lenstr; i++)
  502. {
  503. compare = (ptr[i] == s[i]);
  504. if (!compare)
  505. {
  506. break;
  507. }
  508. }
  509. }
  510. }
  511. else
  512. {
  513. compare = false;
  514. }
  515. return compare;
  516. }
  517.  
  518. bool MyString::operator != (const MyString &s)
  519. {
  520. bool compare;
  521. size_t lenstr = length();
  522. if (lenstr == s.length())
  523. {
  524. if (s.ptr == ptr)
  525. {
  526. compare = false;
  527. }
  528. else
  529. {
  530. for (size_t i = 0; i < lenstr; i++)
  531. {
  532. compare = (ptr[i] != s.ptr[i]);
  533. if (compare)
  534. {
  535. break;
  536. }
  537. }
  538. }
  539. }
  540. else
  541. {
  542. compare = true;
  543. }
  544. return compare;
  545. }
  546.  
  547. bool MyString::operator != (const char *s)
  548. {
  549. bool compare;
  550. size_t lenstr = length();
  551. if (lenstr == strlength (s))
  552. {
  553. if (s == ptr)
  554. {
  555. compare = false;
  556. }
  557. else
  558. {
  559. for (size_t i = 0; i < lenstr; i++)
  560. {
  561. compare = (ptr[i] != s[i]);
  562. if (compare)
  563. {
  564. break;
  565. }
  566. }
  567. }
  568. }
  569. else
  570. {
  571. compare = true;
  572. }
  573. return compare;
  574. }
  575.  
  576. std::ostream &operator<< (std::ostream &out, const MyString &s)
  577. {
  578. for (size_t i = 0; i < s.length(); i++)
  579. {
  580. out << s.ptr[i];
  581. }
  582. return out;
  583. }
  584.  
  585. std::istream &operator>> (std::istream &in, MyString &s)
  586. {
  587. char tempstr[256];
  588. in.getline (tempstr, 256);
  589. size_t templen = strlength (tempstr);
  590. s.delAndNewCount();
  591. s.ptr = new char[templen + 1];
  592. for (int i = 0; i < templen + 1 ; i++)
  593. {
  594. s.ptr[i] = tempstr[i];
  595. }
  596. return in;
  597. }
  598.  
  599. MyString::~MyString()
  600. {
  601. if (count != nullptr)
  602. {
  603. if (*count == 1)
  604. {
  605. delete[] ptr;
  606. delete count;
  607. }
  608. else
  609. {
  610. (*count)--;
  611. }
  612. }
  613. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement