luna: Vector is here!!
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
apio 2023-01-13 22:28:03 +01:00
parent 28bde216c4
commit 3b4b750cbf
Signed by: apio
GPG Key ID: B8A7D06E42258954

114
luna/include/luna/Vector.h Normal file
View File

@ -0,0 +1,114 @@
#pragma once
#include <luna/Alloc.h>
#include <luna/CString.h>
#include <luna/Result.h>
#include <luna/Types.h>
template <typename T> class Vector
{
public:
typedef T* Iterator;
typedef const T* ConstIterator;
Vector()
{
}
Result<void> try_reserve(usize capacity)
{
return resize(capacity);
}
void reserve(usize capacity)
{
resize(capacity).release_value();
}
Result<void> try_append(T item)
{
if (m_capacity == m_size) TRY(resize(m_capacity + 8));
new (&m_data[m_size]) T(move(item));
m_size++;
return {};
}
Option<T> try_pop()
{
if (m_size == 0) return {};
m_size--;
return move(m_data[m_size]);
}
const T& operator[](usize index) const
{
check(index < m_size);
return m_data[m_size];
}
T& operator[](usize index)
{
check(index < m_size);
return m_data[m_size];
}
Iterator begin()
{
return m_data;
}
ConstIterator begin() const
{
return m_data;
}
Iterator end()
{
return m_data + m_size;
}
ConstIterator end() const
{
return m_data + m_size;
}
const T* data() const
{
return m_data;
}
T* data()
{
return m_data;
}
usize capacity() const
{
return m_capacity;
}
usize size() const
{
return m_size;
}
private:
T* m_data { nullptr };
usize m_capacity { 0 };
usize m_size { 0 };
Result<void> resize(usize new_capacity)
{
void* ptr = TRY(realloc_impl(m_data, new_capacity));
if (new_capacity < m_capacity) memcpy(ptr, m_data, new_capacity);
else
memcpy(ptr, m_data, m_capacity);
m_capacity = new_capacity;
m_data = (T*)ptr;
return {};
}
};