Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 94 additions & 36 deletions stack.cpp
Original file line number Diff line number Diff line change
@@ -1,48 +1,106 @@
#include "stack.hpp"

#include <map>
#include <cstddef>

// TODO: remove me
#define UNUSED(VAR) (void)(VAR)
#include <cstdlib>
#include <cstring>

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<Handle, Stack*> 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;
}
}
Loading