diff --git a/EOOP/Various/ringBuffer2/ringbuffer2.cpp b/EOOP/Various/ringBuffer2/ringbuffer2.cpp new file mode 100755 index 00000000..4c5a3455 --- /dev/null +++ b/EOOP/Various/ringBuffer2/ringbuffer2.cpp @@ -0,0 +1,359 @@ +// Krzysztof Rudnicki, 307585, EADS 2 +#include + +void print(const std::string s) +{ + std::cout << s << std::endl; +} + +template +class Ring{ +private: + struct Node{ + Key key; + Info info; + Node* next; + Node* prev; + }; + Node* any; +public: + + class Iterator + { + private: + Node* pNode; + public: + Iterator() { pNode = nullptr; } + ~Iterator() { pNode = nullptr; } + Iterator(Node* ptr) : pNode(ptr) {} + + bool operator!=(const Iterator& other) const + { + return pNode != other.pNode; + } + + Iterator& operator++() + { + pNode = pNode -> next; + return *this; + } + + Iterator operator++(int) + { + Iterator it = *this; + pNode = pNode -> next; + return it; + } + + Iterator& operator--() + { + pNode = pNode -> prev; + return *this; + } + + Iterator operator--(int) + { + Iterator it = *this; + pNode = pNode -> prev; + return it; + } + + Node& operator[](int index) + { + Node* indexedNode = pNode; + for(int i = 0; i < index; i++) + { + indexedNode = indexedNode -> next; + } + return *indexedNode; + } + + Node* operator->() + { + return pNode; + } + + Node& operator*() + { + return *pNode; + } + + bool operator==(const Iterator& other) const + { + return pNode == other.pNode; + } + }; + + Ring(); + ~Ring(); + void clearRing(); + void print() const; + void addAtEnd(Key newKey, Info newInfo); + int size() const; + Iterator begin() const // I will treat "any" Node as a "begining" of a ring + { + return Iterator(any); + } + + Iterator end() const // I will treat a Node just before "any" node as an "end" of a ring + { + if(any == nullptr) return nullptr; + return any -> prev; + } +}; + +template +Ring::Ring() +{ + any = nullptr; +} + +template +void Ring::clearRing() +{ + if(any == nullptr) return; + Node* curr = any; + Node* temp = any; + do{ + temp = curr; + curr = curr->next; + delete temp; + }while(curr != any); + + delete any; +} + +template +Ring::~Ring() +{ + this -> clearRing(); +} + +template +void Ring::print() const +{ + Node* curr = any; + do{ + std::cout << curr -> key << "; " << curr->info << std::endl; + curr = curr->next; + }while (curr != any); +} + +template +void Ring::addAtEnd(Key newKey, Info newInfo) +{ + Node* newNode = new Node(); + newNode -> key = newKey; + newNode -> info = newInfo; + if(any == nullptr) + { + any = newNode; + any -> next = any; + any -> prev = any; + return; + } + + if(any -> next == nullptr) + { + any -> next = newNode; + any -> prev = newNode; + newNode -> next = any; + newNode -> prev = any; + return; + } + + Node* curr = any; + while(curr -> next != any) curr = curr -> next; + any->prev = newNode; + curr->next = newNode; + newNode -> prev = curr; + newNode -> next = any; +} + +template +int Ring::size() const +{ + Node* curr = any; + int size = 0; + do{ + size++; + curr = curr -> next; + }while (curr != any); + return size; +} + +template +void printPair(const Key key, const Info info) +{ + std::cout << "Key: " << key << "; Info: " << info << std::endl; +} + +bool testForEmpty() +{ + Ring marcel; + Ring::Iterator it = marcel.begin(); + if(it != nullptr) + { + print("testForEmpty"); + return false; + } + return true; +} + +bool testOneElement() +{ + Ring marcel; + marcel.addAtEnd(1, 1); + Ring::Iterator it = marcel.begin(); + if(it -> key != 1 || it -> info != 1) + { + print("testForwardIncrementingOneElement"); + return false; + } + return true; +} + +bool testForwardIncrementing() +{ + Ring marcel; + marcel.addAtEnd(1, 1); + marcel.addAtEnd(2, 2); + marcel.addAtEnd(3, 3); + marcel.addAtEnd(4, 4); + marcel.addAtEnd(5, 5); + int i = 0; + for( Ring::Iterator it = marcel.begin(); + it != marcel.end(); it++, i++) + { + if(it -> key != i + 1 || it -> info != i + 1) + { + print("testForwardIncrementingNormal"); + return false; + } + } + if(marcel.end() -> key != 5 || marcel.end() -> info != 5) + { + print("testForwardIncrementingNormal"); + return false; + } + + return true; +} + +bool testBackwardDecrementing() +{ + Ring marcel; + marcel.addAtEnd(1, 1); + marcel.addAtEnd(2, 2); + marcel.addAtEnd(3, 3); + marcel.addAtEnd(4, 4); + marcel.addAtEnd(5, 5); + int i = 0; + for( Ring::Iterator it = marcel.end(); + it != marcel.begin(); it++, i++) + { + if(it -> key != 5 - i || it -> info != 5 - i) + { + print("testBackwardDecrementing"); + return false; + } + } + if(marcel.begin() -> key != 1 || marcel.begin() -> info != 1) + { + print("testBackwardDecrementing"); + return false; + } + + return true; +} + +bool testForwardSquareBracket() +{ + Ring marcel; + marcel.addAtEnd(1, 1); + marcel.addAtEnd(2, 2); + marcel.addAtEnd(3, 3); + marcel.addAtEnd(4, 4); + marcel.addAtEnd(5, 5); + Ring::Iterator it = marcel.begin(); + for(int i = 0; i < marcel.size(); i++) + { + if(it[i].key != i + 1 || it[i].info != i + 1) + { + print("testForwardSquareBracket"); + return false; + } + } + return true; +} + + +bool testBackwardSquareBracket() +{ + Ring marcel; + marcel.addAtEnd(1, 1); + marcel.addAtEnd(2, 2); + marcel.addAtEnd(3, 3); + marcel.addAtEnd(4, 4); + marcel.addAtEnd(5, 5); + Ring::Iterator it = marcel.end(); + for(int i = marcel.size(); i > 0; i--) + { + if(it[i].key != i || it[i].info != i) + { + print("testBackwardSquareBracket"); + return false; + } + } + return true; +} + +bool testSquareBracketRandomOverflow() +{ + Ring marcel; + marcel.addAtEnd(1, 1); + marcel.addAtEnd(2, 2); + marcel.addAtEnd(3, 3); + marcel.addAtEnd(4, 4); + marcel.addAtEnd(5, 5); + Ring::Iterator it = marcel.begin(); + //Checking for some random places in ring: + if(it[2].key != 3) + { + print("testSquareBracketRandomOverflow"); + return false; + } + + if(it[4].key != 5) + { + print("testSquareBracketRandomOverflow"); + return false; + } + + if(it[0].key != 1) + { + print("testSquareBracketRandomOverflow"); + return false; + } + //Checking for overflow: + if(it[10].key != 1) + { + print("testSquareBracketRandomOverflow"); + return false; + } + return true; +} + +bool tests() +{ + return testForEmpty()&&testOneElement()&&testForwardIncrementing() + &&testBackwardDecrementing()&&testForwardSquareBracket()&&testBackwardSquareBracket() + &&testSquareBracketRandomOverflow(); +} + +int main() +{ + std::cout << "Result of tests is: " << tests() << std::endl; + return 1; + +} \ No newline at end of file diff --git a/EOOP/Various/ringBuffer2/ringbuffer3.cpp b/EOOP/Various/ringBuffer2/ringbuffer3.cpp new file mode 100755 index 00000000..2aa74c44 --- /dev/null +++ b/EOOP/Various/ringBuffer2/ringbuffer3.cpp @@ -0,0 +1,406 @@ +#include + +using namespace std; + +template +class Ring +{ +private: + struct Node + { + Key key; + Info info; + Node *prev; + Node *next; + }; + Node *head; + +public: + class Iterator + { + private: + Node *ptr; + Node *headPtr; + Iterator(Node*); + friend class Ring; + public: + Iterator(); + Iterator(Ring); + Info getInfo(); + Key getKey(); + void printData(int); + Info operator*(); + Iterator& operator++();//prefix + Iterator operator++(int);//postfix + Iterator& operator--();//prefix + Iterator operator--(int);//postfix + bool operator==(const Iterator&); + bool operator!=(const Iterator&); + bool isFirst(); + bool isLast(); + }; + + Ring(); + ~Ring(); + void insertAtBeginning(const Key& k, const Info& inf); + void insertAtEnd(const Key& k, const Info& inf); + void removeAtBeginning(); + void removeAtEnd(); + void clear(); + + void printContent(); + void printContentReverse(); + + Iterator begin(); + Iterator end(); +}; + +//main function +int main() +{ + //test 1 - printing + + Ring ring; + + ring.insertAtEnd('a', "letter 1"); + ring.insertAtEnd('b', "letter 2"); + ring.insertAtEnd('c', "letter 3"); + ring.insertAtEnd('d', "letter 4"); + ring.insertAtEnd('e', "letter 5"); + + cout << "Normal print:" << endl; + ring.printContent(); + + Ring::Iterator *ringIt = new Ring::Iterator(ring); + + cout << endl << "Iterator print:" << endl; + int number = 0; + while (ringIt->isLast() == false) + { + ringIt->printData(number); + + number++; + ++ringIt; + } + + + return 0; +} + +//------------------------------Ring functions + +template +Ring::Ring() +{ + head = nullptr; +} + +template +Ring::~Ring() +{ + clear(); +} + +template +void Ring::insertAtBeginning(const Key& k, const Info& inf) +{ + if (head == nullptr) + { + Node *newNode = new Node(); + newNode->key = k; + newNode->info = inf; + newNode->next = newNode; + newNode->prev = newNode; + + head = newNode; + + return; + } + + Node *last = head->prev; + + Node *newNode = new Node(); + newNode->key = k; + newNode->info = inf; + newNode->prev = last; + last->next = newNode; + + newNode->next = head; + head->prev = newNode; + + head = newNode; +} + +template +void Ring::insertAtEnd(const Key& k, const Info& inf) +{ + if (head == nullptr) + { + Node *newNode = new Node(); + newNode->key = k; + newNode->info = inf; + newNode->next = newNode; + newNode->prev = newNode; + + head = newNode; + + return; + } + + Node *last = head->prev; + + Node *newNode = new Node(); + newNode->key = k; + newNode->info = inf; + + newNode->prev = last; + last->next = newNode; + + newNode->next = head; + head->prev = newNode; +} + +template +void Ring::removeAtBeginning() +{ + if (head == nullptr) + return; + + if (head->next == head) + { + delete head; + head = nullptr; + + return; + } + + Node *prev = head->prev; + Node *next = head->next; + + prev->next = next; + next->prev = prev; + + delete head; + head = next; +} + +template +void Ring::removeAtEnd() +{ + if (head == nullptr) + return; + + if (head->next == head) + { + delete head; + head = nullptr; + + return; + } + + Node *prev = head->prev->prev; + //Node *next = head; + + delete head->prev; + + prev->next = head; + head->prev = prev; +} + +template +void Ring::clear() +{ + while (head != nullptr) + removeAtEnd(); +} + +template +void Ring::printContent() +{ + if (head == nullptr) + return; + + Node *current = head; + int number = 0; + + do + { + cout << number << "# - Key: " << current->key << ", Info: " << current->info << endl; + + number++; + current = current->next; + } while (current != head); +} + +template +void Ring::printContentReverse() +{ + if (head == nullptr) + return; + + + if (head->next == head) + { + cout << "0# - Key: " << head->key << ", Info: " << head->info << endl; + } + + Node *current = head->prev; + int number = 0; + + do + { + cout << number << "# - Key: " << current->key << ", Info: " << current->info << endl; + + number++; + current = current->prev; + } while (current != head); +} + +template +typename Ring::Iterator Ring::begin() +{ + Ring::Iterator tempIter = new Ring::Iterator(head); + + return tempIter; +} + +template +typename Ring::Iterator Ring::end() +{ + Ring::Iterator tempIter = new Ring::Iterator(head->prev); + + return tempIter; +} + +//------------------------------Ring Iterator functions + +template +Ring::Iterator::Iterator() +{ + ptr = nullptr; + headPtr = nullptr; +} + +template +Ring::Iterator::Iterator(Node* nodePtr) +{ + ptr = nodePtr; + headPtr = nodePtr; +} + +template +Ring::Iterator::Iterator(Ring ring) +{ + ptr = ring.head; + headPtr = ring.head; +} + +template +Info Ring::Iterator::getInfo() +{ + if (ptr != nullptr) + return ptr->info; + else + throw "Iterator was nullptr"; +} + +template +Key Ring::Iterator::getKey() +{ + if (ptr != nullptr) + return ptr->key; + else + throw "Iterator was nullptr"; +} + +template +void Ring::Iterator::printData(int number) +{ + if (ptr != nullptr) + cout << number << "# - Key: " << ptr->key << ", Info: " << ptr->info << endl; + else + cout << "Tried to print an empty iterator" << endl; +} + +template +Info Ring::Iterator::operator*() +{ + if (ptr != nullptr) + return ptr->info; + else + throw "Iterator was nullptr"; +} + +template +typename Ring::Iterator& Ring::Iterator::operator++() +{ + if (ptr != nullptr && headPtr != nullptr && ptr->next != headPtr) + ptr = ptr->next; + + return *this; +} + +template +typename Ring::Iterator Ring::Iterator::operator++(int) +{ + Ring::Iterator incremented = *this; + + ++(*this); + return incremented; +} + +template +typename Ring::Iterator& Ring::Iterator::operator--() +{ + if (ptr != nullptr && headPtr != nullptr && ptr != headPtr) + ptr = ptr->prev; + + return *this; +} + +template +typename Ring::Iterator Ring::Iterator::operator--(int) +{ + Ring::Iterator decremented = *this; + + --(*this); + return decremented; +} + +template +bool Ring::Iterator::operator==(const Ring::Iterator& iter) +{ + if (ptr == iter->ptr) + return true; + else + return false; +} + +template +bool Ring::Iterator::operator!=(const Ring::Iterator& iter) +{ + if (operator==(this)) + return false; + else + return true; +} + + +template +bool Ring::Iterator::isLast() +{ + cout << (ptr != nullptr) << " " << (headPtr != nullptr) << " " << (ptr->next == headPtr) << endl; + if (ptr != nullptr && headPtr != nullptr && ptr->next == headPtr) + return true; + else + return false; +} + +template +bool Ring::Iterator::isFirst() +{ + if (ptr != nullptr && headPtr != nullptr && ptr == headPtr) + return true; + else + return false; +}