From 9924f6ec1134e7d48b13c5e3826214422f3f1564 Mon Sep 17 00:00:00 2001 From: LegendaV <115637903+LegendaV@users.noreply.github.com> Date: Tue, 25 Nov 2025 22:43:23 +0500 Subject: [PATCH 1/6] stack --- stack.cpp | 127 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 92 insertions(+), 35 deletions(-) diff --git a/stack.cpp b/stack.cpp index 954a5a5..7cf4869 100644 --- a/stack.cpp +++ b/stack.cpp @@ -1,48 +1,105 @@ #include "stack.hpp" #include - -// TODO: remove me -#define UNUSED(VAR) (void)(VAR) +#include +#include namespace stack { -Handle create() -{ - return -1; -} + struct Node + { + std::size_t count; + Node* last; + std::size_t dataSize; + unsigned char* data; -void destroy(const Handle handle) -{ - UNUSED(handle); -} + Node() + { + count = 0; + last = nullptr; + dataSize = 0; + data = nullptr; + } -bool valid(const Handle handle) -{ - UNUSED(handle); - return false; -} + Node(Node* last, unsigned char* data, const std::size_t dataSize) + { + this->count = last->count + 1; + this->dataSize = dataSize; + this->last = last; + this->data = data; + } + }; -std::size_t count(const Handle handle) -{ - UNUSED(handle); - return 0u; -} + static Handle stackCount = 0; + static std::unordered_map stackDict; -void push(const Handle handle, const void* const data, const std::size_t size) -{ - UNUSED(handle); - UNUSED(data); - UNUSED(size); -} + Handle create() + { + const Node head; + stackDict[stackCount] = head; + return stackCount++; + } -std::size_t pop(const Handle handle, void* const data, const std::size_t size) -{ - UNUSED(handle); - UNUSED(data); - UNUSED(size); - return 0u; -} + void destroy(const Handle handle) + { + if (valid(handle)) + { + stackDict.erase(handle); + } + } + + bool valid(const Handle handle) + { + return stackDict.find(handle) != stackDict.end(); + } + + std::size_t count(const Handle handle) + { + if (!valid(handle)) + { + return 0u; + } + + return stackDict.find(handle)->second.count; + } + + void push(const Handle handle, const void* const data, const std::size_t size) + { + const auto stack = stackDict.find(handle); + if (stack == stackDict.end()) + { + return; + } + + Node lastHead = stack->second; + + unsigned char* buf = new unsigned char[size]; + std::memcpy(buf, data, size); + + const Node newNode = Node(&lastHead, buf, size); + stackDict[handle] = newNode; + } + + std::size_t pop(const Handle handle, void* const data, const std::size_t size) + { + if (!valid(handle)) + { + return 0u; + } + + const Node head = stackDict.find(handle)->second; + if (head.last == nullptr) + { + return 0u; + } + + stackDict[handle] = *head.last; + + const std::size_t copySize = std::min(size, head.dataSize); + std::memcpy(data, head.data, copySize); + + return copySize; + } -} // namespace stack +} // namespace stack \ No newline at end of file From 684e331ab7c03be1cc29fb2835bf283cbc3f1714 Mon Sep 17 00:00:00 2001 From: LegendaV <115637903+LegendaV@users.noreply.github.com> Date: Wed, 26 Nov 2025 20:42:42 +0500 Subject: [PATCH 2/6] Update stack.cpp --- stack.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/stack.cpp b/stack.cpp index 7cf4869..bf62057 100644 --- a/stack.cpp +++ b/stack.cpp @@ -3,6 +3,7 @@ #include #include #include +#include namespace stack { From 581062df073cf7dd5e80d164606e12a2c8115b55 Mon Sep 17 00:00:00 2001 From: LegendaV <115637903+LegendaV@users.noreply.github.com> Date: Wed, 26 Nov 2025 21:19:58 +0500 Subject: [PATCH 3/6] Update stack.cpp --- stack.cpp | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/stack.cpp b/stack.cpp index bf62057..c33cdb6 100644 --- a/stack.cpp +++ b/stack.cpp @@ -7,7 +7,6 @@ namespace stack { - struct Node { std::size_t count; @@ -30,18 +29,28 @@ namespace stack this->last = last; this->data = data; } + + ~Node() + { + delete data; + } }; static Handle stackCount = 0; - static std::unordered_map stackDict; + static std::unordered_map stackDict; Handle create() { - const Node head; + Node* head = new Node(); stackDict[stackCount] = head; return stackCount++; } + bool valid(const Handle handle) + { + return stackDict.find(handle) != stackDict.end(); + } + void destroy(const Handle handle) { if (valid(handle)) @@ -50,11 +59,6 @@ namespace stack } } - bool valid(const Handle handle) - { - return stackDict.find(handle) != stackDict.end(); - } - std::size_t count(const Handle handle) { if (!valid(handle)) @@ -62,45 +66,45 @@ namespace stack return 0u; } - return stackDict.find(handle)->second.count; + return stackDict.find(handle)->second->count; } void push(const Handle handle, const void* const data, const std::size_t size) { const auto stack = stackDict.find(handle); - if (stack == stackDict.end()) + if (stack == stackDict.end() || data == nullptr || size <= 0u) { return; } - Node lastHead = stack->second; + Node* lastHead = stack->second; unsigned char* buf = new unsigned char[size]; std::memcpy(buf, data, size); - const Node newNode = Node(&lastHead, buf, size); + Node* newNode = new Node(lastHead, buf, size); stackDict[handle] = newNode; } std::size_t pop(const Handle handle, void* const data, const std::size_t size) { - if (!valid(handle)) + if (!valid(handle) || data == nullptr || size <= 0u) { return 0u; } - const Node head = stackDict.find(handle)->second; - if (head.last == nullptr) + const Node* head = stackDict.find(handle)->second; + if (head->last == nullptr) { return 0u; } - stackDict[handle] = *head.last; + stackDict[handle] = head->last; - const std::size_t copySize = std::min(size, head.dataSize); - std::memcpy(data, head.data, copySize); + const std::size_t copySize = std::min(size, head->dataSize); + std::memcpy(data, head->data, copySize); + delete head; return copySize; } - } // namespace stack \ No newline at end of file From d1a61fc0fcea58fb942f4925fd9d76c2ad9d4ed0 Mon Sep 17 00:00:00 2001 From: LegendaV <115637903+LegendaV@users.noreply.github.com> Date: Wed, 26 Nov 2025 22:18:35 +0500 Subject: [PATCH 4/6] fix memory --- stack.cpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/stack.cpp b/stack.cpp index c33cdb6..db6df9c 100644 --- a/stack.cpp +++ b/stack.cpp @@ -14,17 +14,13 @@ namespace stack std::size_t dataSize; unsigned char* data; - Node() - { - count = 0; - last = nullptr; - dataSize = 0; - data = nullptr; - } - Node(Node* last, unsigned char* data, const std::size_t dataSize) { - this->count = last->count + 1; + this->count = 1; + if (last != nullptr) + { + this->count = last->count + 1; + } this->dataSize = dataSize; this->last = last; this->data = data; @@ -41,8 +37,7 @@ namespace stack Handle create() { - Node* head = new Node(); - stackDict[stackCount] = head; + stackDict[stackCount] = nullptr; return stackCount++; } @@ -55,6 +50,13 @@ namespace stack { if (valid(handle)) { + Node* current = stackDict.find(handle)->second; + while (current != nullptr) + { + Node* nodeToDelete = current; + current = current->last; + delete current; + } stackDict.erase(handle); } } @@ -66,7 +68,13 @@ namespace stack return 0u; } - return stackDict.find(handle)->second->count; + Node* head = stackDict.find(handle)->second; + if (head == nullptr) + { + return 0u; + } + + return head->count; } void push(const Handle handle, const void* const data, const std::size_t size) @@ -94,7 +102,7 @@ namespace stack } const Node* head = stackDict.find(handle)->second; - if (head->last == nullptr) + if (head == nullptr) { return 0u; } From ee777255810e339fe3fbe12f98099f335a08ec4b Mon Sep 17 00:00:00 2001 From: LegendaV <115637903+LegendaV@users.noreply.github.com> Date: Wed, 26 Nov 2025 22:23:14 +0500 Subject: [PATCH 5/6] Update stack.cpp --- stack.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stack.cpp b/stack.cpp index db6df9c..1690e1a 100644 --- a/stack.cpp +++ b/stack.cpp @@ -53,9 +53,9 @@ namespace stack Node* current = stackDict.find(handle)->second; while (current != nullptr) { - Node* nodeToDelete = current; - current = current->last; + Node* prev = current->last; delete current; + current = prev; } stackDict.erase(handle); } From bbb5e45b0ca1ecc93b94c3512c4fa66240597013 Mon Sep 17 00:00:00 2001 From: LegendaV <115637903+LegendaV@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:04:11 +0500 Subject: [PATCH 6/6] Update stack.cpp --- stack.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stack.cpp b/stack.cpp index 1690e1a..8e69614 100644 --- a/stack.cpp +++ b/stack.cpp @@ -28,7 +28,7 @@ namespace stack ~Node() { - delete data; + delete[] data; } }; @@ -102,14 +102,14 @@ namespace stack } const Node* head = stackDict.find(handle)->second; - if (head == nullptr) + if (head == nullptr || head->dataSize > size) { return 0u; } stackDict[handle] = head->last; - const std::size_t copySize = std::min(size, head->dataSize); + const std::size_t copySize = head->dataSize; std::memcpy(data, head->data, copySize); delete head;