Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 09 / StringPool / MyString
diff options
context:
space:
mode:
Commit086675f2e8b421f811ffc0ea140dc1b4f2b85e0d (patch)
Author
 Angel Dimitriev <achi_d@abv.bg>
2022-04-19 20:25:32 +0300
Committer
 GitHub <noreply@github.com>
2022-04-19 20:25:32 +0300
Files31c9fd0a0a1bfe036e5ba9ae764c8efc04d1b2c9 /Sem. 09/StringPool/MyString
Object-oriented_programming_FMI-086675f2e8b421f811ffc0ea140dc1b4f2b85e0d.tar
Object-oriented_programming_FMI-086675f2e8b421f811ffc0ea140dc1b4f2b85e0d.tar.gz
Object-oriented_programming_FMI-086675f2e8b421f811ffc0ea140dc1b4f2b85e0d.zip
Parent49f63ce5011036baa4fc451907924a472714d923 (diff)
Add files via upload
2 files changed, 178 insertions, 0 deletions
-rw-r--r--Sem. 09/StringPool/MyString/MyString.cpp134
-rw-r--r--Sem. 09/StringPool/MyString/MyString.h44
diff --git a/Sem. 09/StringPool/MyString/MyString.cpp b/Sem. 09/StringPool/MyString/MyString.cpp
new file mode 100644
index 0000000..a2cee29
--- /dev/null
+++ b/Sem. 09/StringPool/MyString/MyString.cpp
@@ -0,0 +1,134 @@
+#include "MyString.h"
+#include <cstring>
+#include <iostream>
+
+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()
+{
+ str = new char[1];
+ str[0] = '\0';
+ size = 0;
+}
+
+MyString::MyString(const char* data)
+{
+ size = strlen(data);
+ str = new char[size + 1];
+ strcpy(str, data);
+}
+
+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::concat(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)
+{
+ concat(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 >> 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;
+ std::cout << "move constr" << std::endl;
+}
+
+MyString& MyString::operator=(MyString&& otherString)
+{
+ if (this != &otherString)
+ {
+ free();
+ str = otherString.str;
+ otherString.str = nullptr;
+ size = otherString.size;
+ }
+ return *this;
+}
diff --git a/Sem. 09/StringPool/MyString/MyString.h b/Sem. 09/StringPool/MyString/MyString.h
new file mode 100644
index 0000000..cabc311
--- /dev/null
+++ b/Sem. 09/StringPool/MyString/MyString.h
@@ -0,0 +1,44 @@
+#pragma once
+
+#include <fstream>
+class MyString
+{
+ char* str;
+ size_t size;
+
+ void copyFrom(const MyString& other);
+ void free();
+
+public:
+ MyString();
+ MyString(const char*);
+
+ MyString(const MyString&);
+
+ MyString(MyString&&); //move constructor that accepts rvalue;
+
+ MyString& operator=(const MyString& other);
+ MyString& operator=(MyString&& other); //move op= that accepts rvalue;
+
+ ~MyString();
+
+ size_t getSize() const;
+ void concat(const MyString& other);
+
+ const char* c_str() const;
+
+ MyString& operator+=(const MyString& other);
+
+ friend std::ostream& operator<<(std::ostream& stream, const MyString& str);
+ friend std::istream& operator>>(std::istream& stream, MyString& str);
+
+};
+
+MyString operator+(const MyString& lhs, const MyString& rhs);
+
+bool operator==(const MyString& lhs, const MyString& rhs);
+bool operator<=(const MyString& lhs, const MyString& rhs);
+bool operator<(const MyString& lhs, const MyString& rhs);
+
+
+//MyString name = "sdfsdf" \ No newline at end of file