diff --git a/stack.cpp b/stack.cpp index 954a5a5..1268423 100644 --- a/stack.cpp +++ b/stack.cpp @@ -1,48 +1,106 @@ #include "stack.hpp" - +#include #include - -// TODO: remove me -#define UNUSED(VAR) (void)(VAR) +#include +#include namespace stack { + struct Element + { + void* data; + Element* next; -Handle create() -{ - return -1; -} + Element(const void* const data, const std::size_t size, Element* next) + { + this->data = malloc(size); + memcpy(this->data, data, size); + this->next = next; + } -void destroy(const Handle handle) -{ - UNUSED(handle); -} + ~Element() + { + free(data); + } + }; -bool valid(const Handle handle) -{ - UNUSED(handle); - return false; -} + struct Stack + { + Element* top; + std::size_t size; -std::size_t count(const Handle handle) -{ - UNUSED(handle); - return 0u; -} + Stack() + { + this->top = nullptr; + this->size = 0; + } -void push(const Handle handle, const void* const data, const std::size_t size) -{ - UNUSED(handle); - UNUSED(data); - UNUSED(size); -} + ~Stack() + { + while (this->size > 0) + { + Element* toDelete = this->top; + this->top = toDelete->next; + delete toDelete; + this->size--; + } + } + }; -std::size_t pop(const Handle handle, void* const data, const std::size_t size) -{ - UNUSED(handle); - UNUSED(data); - UNUSED(size); - return 0u; -} + int stackCount = 0; + std::map handleMap; + + Handle create() + { + Stack* stack = new Stack(); + handleMap[stackCount] = stack; + return stackCount++; + } -} // namespace stack + void destroy(const Handle handle) + { + if (valid(handle)) + { + handleMap.erase(handle); + delete handleMap[handle]; + } + } + + bool valid(const Handle handle) + { + return handleMap.find(handle) != handleMap.end(); + } + + std::size_t count(const Handle handle) + { + if (valid(handle)) + { + return handleMap[handle]->size; + } + return 0u; + } + + void push(const Handle handle, const void* const data, const std::size_t size) + { + if (valid(handle)) + { + Stack* stack = handleMap[handle]; + Element* element = new Element(data, size, stack->top); + stack->top = element; + stack->size++; + } + } + + std::size_t pop(const Handle handle, void* const data, const std::size_t size) + { + if (valid(handle)) + { + Stack* stack = handleMap[handle]; + memcpy(data, stack->top->data, size); + stack->top = stack->top->next; + stack->size--; + return size; + } + return 0; + } +}