luna: Vector is here!!
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
28bde216c4
commit
3b4b750cbf
114
luna/include/luna/Vector.h
Normal file
114
luna/include/luna/Vector.h
Normal 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 {};
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user