From da4765b60dd2a9216156903fff01bf754df096b4 Mon Sep 17 00:00:00 2001 From: mrplesk2 Date: Tue, 4 Nov 2025 20:31:44 +0300 Subject: [PATCH 1/7] Add stack.cpp --- stack.cpp | 142 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 107 insertions(+), 35 deletions(-) diff --git a/stack.cpp b/stack.cpp index 954a5a5..3d58760 100644 --- a/stack.cpp +++ b/stack.cpp @@ -1,48 +1,120 @@ #include "stack.hpp" #include - -// TODO: remove me -#define UNUSED(VAR) (void)(VAR) +#include +#include +#include namespace stack { -Handle create() -{ - return -1; -} + struct Node { + std::vector data; + Node* next; -void destroy(const Handle handle) -{ - UNUSED(handle); -} + Node(const void* data_ptr, std::size_t data_size) + : data(static_cast(data_ptr), + static_cast(data_ptr) + data_size), + next(nullptr) { + } + }; -bool valid(const Handle handle) -{ - UNUSED(handle); - return false; -} + struct Stack { + Node* top; + std::size_t count; + + Stack() : top(nullptr), count(0) { + } + }; -std::size_t count(const Handle handle) -{ - UNUSED(handle); - return 0u; -} + std::unordered_map stacks; + Handle next_handle = 0; -void push(const Handle handle, const void* const data, const std::size_t size) -{ - UNUSED(handle); - UNUSED(data); - UNUSED(size); -} + Handle create() + { + try { + Handle handle = next_handle++; + stacks.emplace(handle, Stack()); + return handle; + } catch (...) { + return -1; + } + } -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) + { + auto it = stacks.find(handle); + if (it == stacks.end()) { + return; + } + + Stack& stack = it->second; + Node* current = stack.top; + while (current != nullptr) { + Node* next = current->next; + delete current; + current = next; + } -} // namespace stack + stacks.erase(it); + } + + bool valid(const Handle handle) + { + return stacks.find(handle) != stacks.end(); + } + + std::size_t count(const Handle handle) + { + auto it = stacks.find(handle); + if (it == stacks.end()) { + return 0; + } + return it->second.count; + } + + void push(const Handle handle, const void* const data, const std::size_t size) + { + auto it = stacks.find(handle); + if (it == stacks.end()) { + return; + } + + Stack& stack = it->second; + + try { + Node* new_node = new Node(data, size); + + new_node->next = stack.top; + stack.top = new_node; + stack.count++; + + } catch (...) { + } + } + + std::size_t pop(const Handle handle, void* const data, const std::size_t size) + { + auto it = stacks.find(handle); + if (it == stacks.end() || it->second.top == nullptr) { + return 0; + } + + Stack& stack = it->second; + Node* top_node = stack.top; + + std::size_t copy_size = std::min(size, top_node->data.size()); + const char* source_data = top_node->data.data(); + char* dest_data = static_cast(data); + + for (std::size_t i = 0; i < copy_size; ++i) { + dest_data[i] = source_data[i]; + } + + stack.top = top_node->next; + delete top_node; + stack.count--; + + return copy_size; + } +} From 4707b9c4509e00ed16caf22765c6711092f33d50 Mon Sep 17 00:00:00 2001 From: mrplesk2 Date: Tue, 4 Nov 2025 20:50:04 +0300 Subject: [PATCH 2/7] Correct stack task --- stack.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/stack.cpp b/stack.cpp index 3d58760..e6706d2 100644 --- a/stack.cpp +++ b/stack.cpp @@ -61,7 +61,7 @@ namespace stack bool valid(const Handle handle) { - return stacks.find(handle) != stacks.end(); + return stacks.find(handle) == stacks.end(); } std::size_t count(const Handle handle) @@ -75,6 +75,10 @@ namespace stack void push(const Handle handle, const void* const data, const std::size_t size) { + if (data == nullptr || size == 0) { + return ; + } + auto it = stacks.find(handle); if (it == stacks.end()) { return; @@ -95,6 +99,10 @@ namespace stack std::size_t pop(const Handle handle, void* const data, const std::size_t size) { + if (data == nullptr || size == 0) { + return 0; + } + auto it = stacks.find(handle); if (it == stacks.end() || it->second.top == nullptr) { return 0; @@ -103,6 +111,10 @@ namespace stack Stack& stack = it->second; Node* top_node = stack.top; + if (size < top_node->data.size()) { + return 0; + } + std::size_t copy_size = std::min(size, top_node->data.size()); const char* source_data = top_node->data.data(); char* dest_data = static_cast(data); From a330fa57c4c2259db9254b23a36d092b3f5172fd Mon Sep 17 00:00:00 2001 From: mrplesk2 Date: Tue, 4 Nov 2025 20:51:37 +0300 Subject: [PATCH 3/7] Correct stack task --- stack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stack.cpp b/stack.cpp index e6706d2..da204d7 100644 --- a/stack.cpp +++ b/stack.cpp @@ -129,4 +129,4 @@ namespace stack return copy_size; } -} +} //namespace stack From 284fb72bb5742d3905574e08fc7224fd411d131b Mon Sep 17 00:00:00 2001 From: mrplesk2 Date: Sat, 8 Nov 2025 19:05:09 +0300 Subject: [PATCH 4/7] Correct stack task v1.1 --- stack.cpp | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/stack.cpp b/stack.cpp index da204d7..41cedd6 100644 --- a/stack.cpp +++ b/stack.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include namespace stack { @@ -28,12 +30,37 @@ namespace stack }; std::unordered_map stacks; - Handle next_handle = 0; + std::queue available_handles; + Handle next_new_handle = 0; + + Handle allocate_handle() { + if (!available_handles.empty()) { + Handle handle = available_handles.front(); + available_handles.pop(); + return handle; + } + + if (next_new_handle < std::numeric_limits::max()) { + return next_new_handle++; + } + + return -1; + } + + void deallocate_handle(Handle handle) { + if (handle != -1) { + available_handles.push(handle); + } + } Handle create() { try { - Handle handle = next_handle++; + Handle handle = allocate_handle(); + if (handle == -1) { + return -1; + } + stacks.emplace(handle, Stack()); return handle; } catch (...) { @@ -57,6 +84,7 @@ namespace stack } stacks.erase(it); + deallocate_handle(handle); } bool valid(const Handle handle) From 909e3f88191798fa170cc36cc465ef6657eebeae Mon Sep 17 00:00:00 2001 From: mrplesk2 Date: Fri, 14 Nov 2025 17:17:28 +0300 Subject: [PATCH 5/7] Correct valid method --- stack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stack.cpp b/stack.cpp index 41cedd6..28b1bf5 100644 --- a/stack.cpp +++ b/stack.cpp @@ -89,7 +89,7 @@ namespace stack bool valid(const Handle handle) { - return stacks.find(handle) == stacks.end(); + return stacks.find(handle) != stacks.end(); } std::size_t count(const Handle handle) From a93e8ef5bad6e5890b21258f4cc51cd4bcaa247f Mon Sep 17 00:00:00 2001 From: mrplesk2 Date: Fri, 14 Nov 2025 17:22:37 +0300 Subject: [PATCH 6/7] Correct valid method( --- stack.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stack.cpp b/stack.cpp index 28b1bf5..45bfd54 100644 --- a/stack.cpp +++ b/stack.cpp @@ -89,7 +89,7 @@ namespace stack bool valid(const Handle handle) { - return stacks.find(handle) != stacks.end(); + return stacks.find(handle) == stacks.end(); } std::size_t count(const Handle handle) @@ -157,4 +157,4 @@ namespace stack return copy_size; } -} //namespace stack +} // namespace stack From 304c39ecc777003de25e46e93921e72d2b8a4035 Mon Sep 17 00:00:00 2001 From: mrplesk2 Date: Fri, 14 Nov 2025 18:12:45 +0300 Subject: [PATCH 7/7] Final version --- stack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stack.cpp b/stack.cpp index 45bfd54..8f125ed 100644 --- a/stack.cpp +++ b/stack.cpp @@ -89,7 +89,7 @@ namespace stack bool valid(const Handle handle) { - return stacks.find(handle) == stacks.end(); + return stacks.find(handle) != stacks.end(); } std::size_t count(const Handle handle)