Advertisement
3axap_010

String.cpp

Sep 20th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.57 KB | None | 0 0
  1. #include "String.h"
  2.  
  3. void String::alloc(const size_t size_)
  4. {
  5.     data = new char[size_];
  6. }
  7.  
  8. void String::dealloc()
  9. {
  10.     delete[] data;
  11.     data = nullptr;
  12.     size = 0;
  13. }
  14.  
  15. void String::copy(const char* str)
  16. {
  17.     for (int i = 0; str[i] != '\0'; i++)
  18.     {
  19.         data[i] = str[i];
  20.     }
  21. }
  22.  
  23. void String::copy(const String& s)
  24. {
  25.     for (unsigned int i = 0; i < s.size; i++)
  26.     {
  27.         data[i] = s[i];
  28.     }
  29. }
  30.  
  31. size_t String::get_size(const char* str) const
  32. {
  33.     int i = 0;
  34.     for (i = 0; str[i] != '\0'; i++)
  35.         ;
  36.     return i;
  37. }
  38.  
  39. String::String(size_t size_ ) : size(size_), data(nullptr)
  40. {
  41.     alloc(size_);
  42. }
  43.  
  44. String::String(unsigned int size_, unsigned int aski) : String(size_)
  45. {
  46.     for (unsigned int i = 0; i < size_; i++)
  47.     {
  48.         data[i] = aski;
  49.     }
  50. }
  51.  
  52. String::String(const char* str) : String(get_size(str))
  53. {
  54.     copy(str);
  55. }
  56.  
  57. String::String(const String& rhs) : String(rhs.size)
  58. {
  59.     copy(rhs);
  60. }
  61.  
  62. String::String(String&& rv) noexcept
  63. {
  64.     size = rv.size;
  65.     data = rv.data;
  66. }
  67.  
  68. String& String::operator=(const String& rhs)
  69. {
  70.     if (this != &rhs)
  71.     {
  72.         dealloc();
  73.         size = rhs.size;
  74.         alloc(size);
  75.         copy(rhs);
  76.     }
  77.  
  78.     return *this;
  79. }
  80.  
  81. String& String::operator=(String&& rv) noexcept
  82. {
  83.     dealloc();
  84.     size = rv.size;
  85.     data = rv.data;
  86.     return *this;
  87. }
  88.  
  89. String& String::operator=(const char* str)
  90. {
  91.     dealloc();
  92.     *this = String(get_size(str));
  93.     copy(str);
  94.     return *this;
  95. }
  96.  
  97. const String operator+(const String& s, const String& s1)
  98. {
  99.     String ret = s;
  100.     ret += s1;
  101.     return ret;
  102. }
  103.  
  104. String& String::operator+=(const String& rhs)
  105. {
  106.     String s = *this;
  107.     dealloc();
  108.     size = s.size + rhs.size;
  109.     alloc(size);
  110.     copy(s);
  111.  
  112.     for (unsigned int i = s.size, j = 0; i < s.size + rhs.size, j != rhs.size; i++, j++)
  113.     {
  114.         data[i] = rhs[j];
  115.     }
  116.  
  117.     return *this;
  118. }
  119.  
  120. String& String::operator+=(const char* str)
  121. {
  122.     String s = *this;
  123.     dealloc();
  124.     size = s.size + get_size(str);
  125.     alloc(size);
  126.     copy(s);
  127.  
  128.     for (unsigned int i = s.size, j = 0; i < size, str[j] != '\0'; i++, j++)
  129.     {
  130.         data[i] = str[j];
  131.     }
  132.  
  133.     return *this;
  134. }
  135.  
  136. const String operator+(const String& s, const char* str)
  137. {
  138.     String ret = s;
  139.     ret += str;
  140.     return ret;
  141. }
  142.  
  143. char& String::operator[](size_t indx) const
  144. {
  145.     if (indx < size)
  146.     {
  147.         return data[indx];
  148.     }
  149.     else
  150.     {
  151.         throw std::out_of_range("out of range");
  152.     }
  153. }
  154.  
  155. bool String::operator<(const String& s) const
  156. {
  157.     int i = 0;
  158.  
  159.     for (unsigned i = 0; i < size && i < s.size; i++)
  160.     {
  161.         if (data[i] < s.data[i]) return true;
  162.         else if (data[i] > s.data[i]) return true;
  163.     }
  164.  
  165.     if (size < s.size) return true;
  166.     return false;
  167. }
  168.  
  169. bool String::operator>(const String& s) const
  170. {
  171.     return !(*this < s);
  172. }
  173.  
  174. bool String::operator==(const String& s) const
  175. {
  176.     return !(*this < s || *this > s);
  177. }
  178.  
  179. bool String::operator<(const char* str) const
  180. {
  181.     int i = 0;
  182.     for (unsigned i = 0; i < size && i < get_size(str); i++)
  183.     {
  184.         if (data[i] < str[i]) return true;
  185.         else if (data[i] > str[i]) return false;
  186.     }
  187.  
  188.     if (size < get_size(str)) return true;
  189.     return false;
  190. }
  191.  
  192. bool String::operator>(const char* str) const
  193. {
  194.     return !(*this < str);
  195. }
  196.  
  197. bool String::operator==(const char* str) const
  198. {
  199.     return !(*this < str || *this > str);
  200. }
  201.  
  202. String& String::operator++()
  203. {
  204.     for (unsigned int i = 0; i < size; i++)
  205.     {
  206.         data[i]++;
  207.     }
  208.  
  209.     return *this;
  210. }
  211.  
  212. String& String::operator--()
  213. {
  214.     for (unsigned int i = 0; i < size; i++)
  215.     {
  216.         if (data[i])
  217.         {
  218.             --data[i];
  219.         }
  220.     }
  221.  
  222.     return *this;
  223. }
  224.  
  225. std::ostream& operator<<(std::ostream& os, const String& s)
  226. {
  227.     for (unsigned int i = 0; i < s.size; i++)
  228.     {
  229.         os << s.data[i];
  230.     }
  231.  
  232.     return os;
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement