Summary Files Commits Branches @commit @diff @stats
path: root / Year 1 / Object-oriented Programming / Solutions Sem. 08 / ex3 / WordCollection.cpp
diff options
context:
space:
mode:
Commit9829b368ce529df277397e3b465fc536fa65ebfd (patch)
Author
 Syndamia <kamen.d.mladenov@protonmail.com>
2022-04-14 23:53:14 +0300
Committer
 Syndamia <kamen.d.mladenov@protonmail.com>
2022-04-14 23:53:14 +0300
Files502a0f1a061a4177e7117118ba2f3164f993ef63 /Year 1/Object-oriented Programming/Solutions Sem. 08/ex3/WordCollection.cpp
uni-projects-9829b368ce529df277397e3b465fc536fa65ebfd.tar
uni-projects-9829b368ce529df277397e3b465fc536fa65ebfd.tar.gz
uni-projects-9829b368ce529df277397e3b465fc536fa65ebfd.zip
Parent27cf6165d0592f842ed667a8da3013489213c2a1 (diff)
Implemented (broken) overall functionality of ex3 of sem 08
1 files changed, 162 insertions, 0 deletions
-rw-r--r--Year 1/Object-oriented Programming/Solutions Sem. 08/ex3/WordCollection.cpp162
diff --git a/Year 1/Object-oriented Programming/Solutions Sem. 08/ex3/WordCollection.cpp b/Year 1/Object-oriented Programming/Solutions Sem. 08/ex3/WordCollection.cpp
new file mode 100644
index 0000000..ae5792f
--- /dev/null
+++ b/Year 1/Object-oriented Programming/Solutions Sem. 08/ex3/WordCollection.cpp
@@ -0,0 +1,162 @@
+#include "WordCollection.h"
+#include "cstring"
+#include <iostream>
+
+/* Private */
+
+void WordCollection::free() {
+ if(words != nullptr) delete[] words;
+ if(sortMap != nullptr) delete[] sortMap;
+}
+
+void WordCollection::copyFrom(const WordCollection& other) {
+ count = other.count;
+ length = other.length;
+
+ words = new DynStr[length];
+ sortMap = new int[length];
+ for (int i = 0; i < count; i++) {
+ words[i] = other.words[i];
+ sortMap[i] = other.sortMap[i];
+ }
+}
+
+void WordCollection::resize() {
+ if (length == 0) length = 8;
+ else length <<= 1;
+
+ DynStr* newWords = new DynStr[length];
+ int* newSortMap = new int[length];
+ for (int i = 0; i < count; i++) {
+ newWords[i] = words[i];
+ newSortMap[i] = sortMap[i];
+ }
+
+ if (words != nullptr) delete[] words;
+ if (sortMap != nullptr) delete[] sortMap;
+
+ words = newWords;
+ sortMap = newSortMap;
+}
+
+void WordCollection::insertSortMapIndex(int position, int value) {
+ if (position == -1)
+ position = count;
+
+ for (int i = count; i > position; i--)
+ sortMap[i] = sortMap[i - 1];
+ sortMap[position] = value;
+}
+
+void WordCollection::removeSortMapIndex(int position) {
+ for (int i = position; i < count - 1; i++)
+ sortMap[i] = sortMap[i + 1];
+ sortMap[count--] = 0;
+}
+
+int WordCollection::findSortMapIndexWhen(int condition, const char* str) {
+ if (condition < -1) condition = -1;
+ else if (condition > 1) condition = 1;
+
+ // TODO: replace with binary search
+ for (int i = 0; i < count; i++) {
+ int cmp = strcmp(words[sortMap[i]].get_str(), str);
+ if (cmp > 1) cmp = 1;
+ else if (cmp < -1) cmp = -1;
+
+ if (cmp == condition)
+ return i;
+ }
+ return -1;
+}
+
+/* Public */
+
+WordCollection::WordCollection() {
+ words = nullptr;
+ sortMap = nullptr;
+ count = length = 0;
+}
+
+WordCollection::WordCollection(const WordCollection& other) {
+ copyFrom(other);
+}
+
+WordCollection& WordCollection::operator=(const WordCollection& other) {
+ if (this != &other) {
+ free();
+ copyFrom(other);
+ }
+ return *this;
+}
+
+WordCollection::~WordCollection() {
+ free();
+}
+
+WordCollection& WordCollection::operator+=(const WordCollection& other) {
+ for (int i = 0; i < other.count; i++) {
+ if ((*this)[other.words[i].get_str()])
+ (*this) *= other.words[i].get_str();
+ }
+ return *this;
+}
+
+WordCollection& WordCollection::operator-=(const WordCollection& other) {
+ for (int i = 0; i < other.count; i++) {
+ if (!(*this)[other.words[i].get_str()])
+ (*this) /= other.words[i].get_str();
+ }
+ return *this;
+}
+
+WordCollection& WordCollection::operator*=(const char* str) {
+ if (count == length) resize();
+
+ words[count] = DynStr(str);
+ insertSortMapIndex(findSortMapIndexWhen(1, str), count);
+ count++;
+
+ return *this;
+}
+
+WordCollection& WordCollection::operator/=(const char* str) {
+ int ind = findSortMapIndexWhen(0, str);
+ words[sortMap[ind]] = DynStr();
+ removeSortMapIndex(ind);
+ return *this;
+}
+
+std::ostream& operator<<(std::ostream& ostrm, const WordCollection& collection) {
+ ostrm << "{";
+ for (int i = 0; i <= collection.count - 2; i++)
+ ostrm << collection.words[collection.sortMap[i]].get_str() << ", ";
+ ostrm << collection.words[collection.sortMap[collection.count - 1]].get_str() << "}";
+ return ostrm;
+}
+
+std::istream& operator>>(std::istream& istrm, WordCollection& collection) {
+ char buffer[1024];
+ istrm.getline(buffer, 1024);
+ istrm.ignore();
+ collection *= buffer;
+ return istrm;
+}
+
+bool WordCollection::operator[](const char* str) {
+ return findSortMapIndexWhen(0, str) > -1;
+}
+
+const WordCollection operator+(const WordCollection& lhs, const WordCollection& rhs) {
+ WordCollection res(lhs);
+ res += rhs;
+
+ return res;
+}
+
+const WordCollection operator-(const WordCollection& lhs, const WordCollection& rhs) {
+ WordCollection res(lhs);
+ res += rhs;
+
+ return res;
+}