diff --git a/src/CommandListOWN.h b/src/CommandListOWN.h new file mode 100644 index 0000000000000000000000000000000000000000..750cbdfd0c23792615a86e41e96617b114593dbd --- /dev/null +++ b/src/CommandListOWN.h @@ -0,0 +1,184 @@ +#pragma once +#include <memory> +#include <iostream> + +#include "Command.h" +#include "Element.h" + + + +class CommandList +{ +private: + std::shared_ptr<Element> root = std::make_shared<Element>(Command("root")); + std::shared_ptr<Element> getElement(uint _pos); + +public: + int getSize(); + void clear(); + + int getPos(std::shared_ptr<Command> _cmd); + std::shared_ptr<Command> getCommand(uint _pos); + + Command add(Command _cmd); + std::shared_ptr<Command> remove(uint _pos); + + std::shared_ptr<Command> moveUp(uint _pos); + std::shared_ptr<Command> moveDown(uint _pos); + + void printCommands(); +}; + +int CommandList::getSize() +{ + std::shared_ptr<Element> ptr = root; + int i = 0; + for (; ptr->getNext(); ++i) + { + ptr = ptr->getNext(); + } + return i; +} + +void CommandList::clear() +{ + std::shared_ptr<Element> current = root; + std::shared_ptr<Element> next = current->getNext(); + + while (next) + { + current->setPrev(NULL); + current->setNext(NULL); + current = next; + next = next->getNext(); + } +} + +Command CommandList::add(Command _cmd) +{ + std::shared_ptr<Element> newElement = std::make_shared<Element>(_cmd); + std::shared_ptr<Element> end = getElement(getSize()); + newElement->setPrev(end); + end->setNext(newElement); + return _cmd; +} + +void CommandList::printCommands() +{ + std::shared_ptr<Element> current = root; + while (current->getNext()) + { + //In this order to not print out the root element. + current = current->getNext(); + std::cout << current->getCommand()->getName() << '\n'; + } +} + +std::shared_ptr<Command> CommandList::remove(uint _pos) +{ + std::shared_ptr<Element> toRemove = getElement(_pos); + if (toRemove == NULL | toRemove == root) + { + return NULL; + } + std::cout << "removing: " << toRemove->getCommand()->getName() << '\n'; + std::shared_ptr<Element> prev = toRemove->getPrev(); + std::shared_ptr<Element> next = toRemove->getNext(); + prev->setNext(next); + if (next) + next->setPrev(prev); + + return toRemove->getCommand(); +} + +std::shared_ptr<Element> CommandList::getElement(uint _pos) +{ + if (_pos > getSize()) + { + return NULL; + } + std::shared_ptr<Element> elem = root; + for (int i = 0; elem->getNext() && i < _pos; ++i) + { + elem = elem->getNext(); + } + return elem; +} + +std::shared_ptr<Command> CommandList::getCommand(uint _pos) +{ + std::shared_ptr<Element> elem = getElement(_pos); + if (elem == NULL) + { + return NULL; + } + else + { + return elem->getCommand(); + } +} + +int CommandList::getPos(std::shared_ptr<Command> _cmd) +{ + std::shared_ptr<Element> elem = root; + int i = 0; + int size = getSize(); + while (elem->getNext() && elem->getCommand() != _cmd) + { + elem = elem->getNext(); + ++i; + if (i > size) + { + return -1; + } + } + return i; +} + +std::shared_ptr<Command> CommandList::moveUp(uint _pos) +{ + if (_pos <= 1) + { + return NULL; + } + std::shared_ptr<Element> ptr = getElement(_pos); + std::shared_ptr<Element> prevPtr = getElement(_pos -1); + if (ptr == NULL | prevPtr == NULL) + { + return NULL; + } + std::shared_ptr<Command> toReturn = ptr->getCommand(); + + prevPtr->getPrev()->setNext(ptr); + ptr->setPrev(prevPtr->getPrev()); + + ptr->getNext()->setPrev(prevPtr); + prevPtr->setNext(ptr->getNext()); + + prevPtr->setPrev(ptr); + ptr->setNext(prevPtr); + + return toReturn; +} + +std::shared_ptr<Command> CommandList::moveDown(uint _pos) +{ + std::shared_ptr<Element> ptr = getElement(_pos); + std::shared_ptr<Element> nextPtr = getElement(_pos +1); + if (ptr == NULL | nextPtr == NULL | ptr == root) + { + return NULL; + } + std::shared_ptr<Command> toReturn = ptr->getCommand(); + + ptr->getPrev()->setNext(nextPtr); + nextPtr->setPrev(ptr->getPrev()); + + nextPtr->getNext()->setPrev(ptr); + ptr->setNext(nextPtr->getNext()); + + ptr->setPrev(nextPtr); + nextPtr->setNext(ptr); + + return toReturn; +} \ No newline at end of file