Advertisement
Fourteen98

Untitled

Apr 27th, 2020
397
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.96 KB | None | 0 0
  1. //
  2. // created by fouteen98
  3. //
  4. #include <stdexcept>
  5. //#include <iostream>
  6. #include "my_string.h"
  7. my_string::my_string()
  8. {
  9.     str_len = 1;
  10.     c_ptr = new char [str_len];
  11.     c_ptr[0] = '\0';
  12.     //ctor
  13. }
  14.  
  15. my_string::my_string(const char *str)
  16. {
  17.     str_len = length(str) + 1;
  18.     c_ptr = new char [str_len];
  19.     for (size_t i = 0; i < str_len; i++)
  20.         c_ptr[i] = str[i];
  21.     c_ptr[str_len -1] = '\0';
  22.  
  23. }
  24.  
  25. my_string::my_string(const my_string &obj)
  26. {
  27.     delete [] c_ptr;
  28.     str_len = obj.str_len;
  29.     c_ptr = new char [str_len];
  30.     for(size_t i = 0; i < str_len; i++){
  31.         c_ptr[i] = obj.c_ptr[i];
  32.     }
  33. }
  34.  
  35. my_string::~my_string()
  36. {
  37.         delete [] c_ptr;
  38.         c_ptr = nullptr;
  39.  
  40. //dtor
  41. }
  42.  
  43. int my_string::length(){
  44.     size_t i = 0;
  45.     for(; c_ptr[i] != '\0'; i++);
  46.     return i;
  47. }
  48. int my_string::length(const char *str){ // private
  49.     size_t i = 0;
  50.     for(; str[i] != '\0'; i++);
  51.     return i;
  52. }
  53.  
  54. char my_string::at(size_t pos) {
  55.     return c_ptr[pos];
  56. }
  57.  
  58. void my_string::swap(my_string &obj) {
  59.     char *temp = c_ptr;
  60.     c_ptr = obj.c_ptr;
  61.     obj.c_ptr = temp;
  62.     size_t len = str_len;
  63.     str_len = obj.str_len;
  64.     obj.str_len = len;
  65. }
  66.  
  67. void my_string::swap(char *str) {
  68.     size_t len = length(str);
  69.     c_ptr = str;
  70.     str_len = len;
  71. }
  72.  
  73.  
  74.  
  75.  
  76. my_string& my_string::append(const my_string& obj) {
  77.     size_t s1 = length(), s2 = length(obj.c_ptr), size = s1 + s2;
  78.     char *temp =  new char [size + 1];
  79.     for(size_t i = 0; i < s1; ++i)
  80.         temp[i] = c_ptr[i];
  81.     for(size_t i = 0; i < s2 + 1; ++i)
  82.         temp[i + s1 - 1] = obj.c_ptr[i];
  83.     temp[size - 1] = '\0';
  84.     delete[]c_ptr;
  85.     str_len = size;
  86.     c_ptr = temp;
  87.     return *this;
  88. }
  89.  
  90. my_string& my_string::append(const char *str) {
  91.     size_t len = length(str);
  92.     size_t size = length() + len;
  93.     char *temp = new char [size + 1];
  94.     for(size_t i = 0; i < str_len - 1; ++i)
  95.         temp[i] = c_ptr[i];
  96.     for(size_t i = 0; i < len; ++i)
  97.         temp[i + str_len - 1] = str[i];
  98.     delete [] c_ptr;
  99.     str_len = size;
  100.     c_ptr = temp;
  101.  
  102.     return *this;
  103. }
  104.  
  105. my_string &my_string::prepend(const my_string &obj) {
  106.     my_string end_result(obj.c_ptr);
  107.     *this = end_result.append(*this);
  108.     return *this;
  109. }
  110.  
  111. my_string &my_string::prepend(const char *str) {
  112.     my_string end_result(str);
  113.     *this = end_result.append(*this);
  114.     return *this;
  115. }
  116.  
  117. my_string my_string::substr(size_t pos, size_t len) {
  118.     size_t length = (len > str_len - pos) ? (str_len - pos) : len;
  119.     char * temp(new char [length + 1]);
  120.     for(size_t i = 0; i < length; i++)
  121.         temp[i] = c_ptr[i + pos];
  122.     temp[length] = '\0';
  123.  
  124.     return my_string(temp);
  125. }
  126.  
  127.  
  128.  
  129.  
  130. my_string& my_string::insert(std::size_t pos, const my_string &obj){
  131.     size_t size = (str_len - 1) + obj.str_len;
  132.     char *temp = new char[size];
  133.    // so the problem was with nested for loop i wrote
  134.     size_t j = 0;
  135.     for (size_t i = 0; i < size; ++i, ++j) {
  136.         if (i == pos)
  137.             for (size_t k = 0; k < (obj.str_len - 1); ++k, ++i)
  138.                 temp[i] = obj.c_ptr[k];
  139.         temp[i] = c_ptr[j];
  140.     }
  141.     delete [] c_ptr;
  142.     c_ptr = temp;
  143.     str_len = size;
  144.     return *this;
  145. }
  146. my_string& my_string::insert(size_t pos, const char *str){
  147.     size_t size = (str_len - 1) + length(str);
  148.     char *temp = new char[size];
  149.     // so the problem was with nested for loop i wrote
  150.     size_t j = 0;
  151.     for (size_t i = 0; i < size; ++i, ++j) {
  152.         if (i == pos)
  153.             for (size_t k = 0; k < length(str); ++k, ++i)
  154.                 temp[i] = str[k];
  155.         temp[i] = c_ptr[j];
  156.     }
  157.     delete [] c_ptr;
  158.     c_ptr = temp;
  159.     str_len = size;
  160.     return *this;
  161.  
  162. }
  163.  
  164. /* this works: but commented them because of performance
  165. my_string &my_string::insert(size_t pos, const char *str) {
  166.     my_string end_results;
  167.     my_string first = substr(0, pos);
  168.     my_string second = substr(pos);
  169.     end_results.append(first);
  170.     end_results.append(str);
  171.     end_results.append(second);
  172.     new(this)my_string(end_results);
  173.     return *this;
  174. }
  175.  
  176.  
  177.  
  178.  
  179. my_string& my_string::insert(std::size_t pos, const my_string &obj){
  180.  
  181.     my_string end_results;
  182.     my_string first = substr(0, pos);
  183.     my_string second = substr(pos);
  184.     end_results.append(first);
  185.     end_results.append(obj.c_ptr);
  186.     end_results.append(second);
  187.     new(this)my_string(end_results);
  188.     return *this;
  189. }
  190. */
  191. // overloaded operators
  192. my_string& my_string ::operator=(const my_string& obj){
  193.     if (this != &obj) {
  194.         delete[] c_ptr;
  195.         str_len = obj.str_len;
  196.         c_ptr = new char[str_len];
  197.         for (std::size_t i = 0; i < str_len; i++)
  198.             c_ptr[i] = obj.c_ptr[i];
  199.     }
  200.     return *this;
  201. }
  202.  
  203. my_string &my_string::operator=(const char *str) {
  204.     *this = my_string(str);
  205.     return *this;
  206. }
  207. my_string &my_string::operator=(my_string &&str) noexcept {
  208.     this->~my_string();
  209.     new(this)my_string(std::move(str));
  210.  
  211.     return *this;
  212. }
  213.  
  214.  
  215.  
  216. size_t my_string::operator[](const size_t pos) {
  217.     if (pos < 0 || pos >= str_len - 1)
  218.         return -1;
  219.     else
  220.         return c_ptr[pos];
  221. }
  222.  
  223. my_string my_string::operator+(const my_string &obj) {
  224.     size_t s1 = length(), s2 = length(obj.c_ptr), size = s1 + s2 + 1;
  225.     char *temp =  new char [size + 1];
  226.     for(size_t i = 0; i < s1; ++i)
  227.         temp[i] = c_ptr[i];
  228.     for(size_t i = 0; i < s2 + 1; ++i)
  229.         temp[i + s1] = obj.c_ptr[i];
  230.     temp[size - 1] = '\0';
  231.     delete[]c_ptr;
  232.     str_len = size;
  233.     c_ptr = temp;
  234.     return *this;
  235. }
  236.  
  237. my_string my_string::operator+(const char *str) {
  238.     size_t len = length(str);
  239.     size_t size = length() + len;
  240.     char *temp = new char [size + 1];
  241.     for(size_t i = 0; i < str_len - 1; ++i)
  242.         temp[i] = c_ptr[i];
  243.     for(size_t i = 0; i < len; ++i)
  244.         temp[i + str_len - 1] = str[i];
  245.     delete [] c_ptr;
  246.     str_len = size;
  247.     c_ptr = temp;
  248.     return *this;
  249. }
  250.  
  251. my_string my_string::operator+=(const my_string &obj) {
  252.     size_t s1 = length(), s2 = length(obj.c_ptr), size = s1 + s2 + 1;
  253.     char *temp =  new char [size + 1];
  254.     for(size_t i = 0; i < s1; ++i)
  255.         temp[i] = c_ptr[i];
  256.     for(size_t i = 0; i < s2 + 1; ++i)
  257.         temp[i + s1] = obj.c_ptr[i];
  258.     temp[size - 1] = '\0';
  259.     delete[]c_ptr;
  260.     str_len = size;
  261.     c_ptr = temp;
  262.     return *this;
  263. }
  264.  
  265. my_string my_string::operator+=(const char *str) {
  266.     size_t len = length(str);
  267.     size_t size = length() + len;
  268.     char *temp = new char [size + 1];
  269.     for(size_t i = 0; i < str_len - 1; ++i)
  270.         temp[i] = c_ptr[i];
  271.     for(size_t i = 0; i < len; ++i)
  272.         temp[i + str_len - 1] = str[i];
  273.     delete [] c_ptr;
  274.     str_len = size;
  275.     c_ptr = temp;
  276.     return *this;
  277. }
  278.  
  279. // friend functions
  280. std::ostream& operator<< (std::ostream &str, const my_string &obj){
  281.     str << obj.c_ptr;
  282.     return str;
  283. }
  284. std::istream& operator>> (std::istream &str, const my_string &obj){
  285.     str >> obj.c_ptr;
  286.     return str;
  287. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement