From f1e6772e0b264388cf96500b75c6ae47272f2238 Mon Sep 17 00:00:00 2001 From: angeld55 Date: Tue, 7 Jun 2022 21:18:29 +0300 Subject: sem 15 --- Sem. 15/MyString/MyString.cpp | 200 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 Sem. 15/MyString/MyString.cpp (limited to 'Sem. 15/MyString/MyString.cpp') diff --git a/Sem. 15/MyString/MyString.cpp b/Sem. 15/MyString/MyString.cpp new file mode 100644 index 0000000..c9d025e --- /dev/null +++ b/Sem. 15/MyString/MyString.cpp @@ -0,0 +1,200 @@ +#include "MyString.h" +#include +#include +#include + +void MyString::copyFrom(const MyString& other) +{ + str = new char[strlen(other.str) + 1]; + strcpy(str, other.str); + size = other.size; +} +void MyString::free() +{ + delete[] str; +} + +MyString::MyString(const char* data) +{ + if(data == nullptr) + { + str = new char[1]; + str[0] = '\0'; + size = 0; + } + else + { + size = strlen(data); + str = new char[size + 1]; + strcpy(str, data); + } +} + +size_t getNumSize(size_t num) +{ + size_t res = 0; + while (num) + { + res++; + num /= 10; + } + return res; +} +MyString::MyString(size_t n) +{ + int numSize = getNumSize(n); + str = new char[numSize + 1]; + + str[numSize] = '\0'; + + for (size_t i = 0; i < numSize; i++, n /= 10) + str[numSize - 1 - i] = (n % 10) + '0'; + size = numSize; +} + +MyString::MyString() +{ + str = new char[1]; + str[0] = '\0'; + size = 0; +} + +MyString::MyString(const MyString& other) +{ + copyFrom(other); +} +MyString& MyString::operator=(const MyString& other) +{ + if (this != &other) + { + free(); + copyFrom(other); + } + return *this; +} +MyString::~MyString() +{ + free(); +} + + +size_t MyString::getSize() const +{ + return size; +} +void MyString::concatFrom(const MyString& other) +{ + char* temp = new char[getSize() + other.getSize() + 1]; + strcpy(temp, str); + strcat(temp, other.str); + + delete[] str; + str = temp; + size = size + other.getSize(); +} + +const char* MyString::c_str() const +{ + return str; +} + +MyString& MyString::operator+=(const MyString& other) +{ + concatFrom(other); + return *this; +} + +MyString operator+(const MyString& lhs, const MyString& rhs) +{ + MyString copyOfLeft(lhs); + copyOfLeft += rhs; + return copyOfLeft; +} + +std::ostream& operator<<(std::ostream& stream, const MyString& str) +{ + stream << str.str; + return stream; +} + +std::istream& operator>>(std::istream& stream, MyString& str) +{ + delete[] str.str; + char buff[1024]; + stream >> std::setw(1024) >> buff; + + str.size = strlen(buff); + str.str = new char[str.size + 1]; + strcpy(str.str, buff); + + return stream; +} + +bool operator==(const MyString& lhs, const MyString& rhs) +{ + return strcmp(lhs.c_str(), rhs.c_str()) == 0; +} +bool operator<=(const MyString& lhs, const MyString& rhs) +{ + return strcmp(lhs.c_str(), rhs.c_str()) <= 0; + +} +bool operator<(const MyString& lhs, const MyString& rhs) +{ + return strcmp(lhs.c_str(), rhs.c_str()) < 0; + +} + +MyString::MyString(MyString&& otherString) +{ + str = otherString.str; + size = otherString.size; + otherString.str = nullptr; +} + +MyString& MyString::operator=(MyString&& otherString) +{ + + if (this != &otherString) + { + free(); + str = otherString.str; + otherString.str = nullptr; + size = otherString.size; + } + return *this; +} + +MyString MyString::subString(size_t start, size_t end) const +{ + if (end < start || end >= size) + throw std::logic_error("Invalid params"); + + MyString result; + delete[] result.str; + + result.str = new char[end - start + 2]; + for (int i = start; i <= end; i++) + result.str[i - start] = str[i]; + + + result.str[(end - start) + 1] = '\0'; + result.size = end - start + 1; + + return result; +} + +const char& MyString::operator[](size_t index) const +{ + if (index > size) + throw std::out_of_range("Out of range!"); + return str[index]; +} + + +char& MyString::operator[](size_t index) +{ + if (index > size) + throw std::out_of_range("Out of range!"); + return str[index]; +} \ No newline at end of file -- cgit v1.3.1-23-gd82d