cigui/include/cigui/utils/List.inl
2025-04-12 21:31:00 +02:00

87 lines
No EOL
2.3 KiB
C++

#include <cigui/utils/List.hpp>
#define LIST_FUNC_DEFINE(rtt) \
template <typename T, size_t growth_scalar, size_t growth_summand> \
rtt List<T, growth_scalar, growth_summand>
namespace cig
{
LIST_FUNC_DEFINE(void)::reserve(const size_t capacity)
{
if (!m_Data)
{
m_Data = std::unique_ptr<T>(static_cast<T*>(calloc(capacity, sizeof(T))));
m_Capacity = capacity;
return;
}
std::unique_ptr<T> newData(static_cast<T*>(calloc(capacity, sizeof(T))));
std::copy(m_Data.get(), m_Data.get() + m_Size, newData.get());
m_Data = std::move(newData);
m_Capacity = capacity;
}
LIST_FUNC_DEFINE()::List(const size_t capacity) : m_Capacity(capacity) { reserve(capacity); }
LIST_FUNC_DEFINE(void)::own(T* data, const size_t size) {
m_Data = data;
m_Size = size;
}
LIST_FUNC_DEFINE(void)::copy(T* data, const size_t size) {
m_Data = std::make_unique<T[]>(size);
std::copy(data, data + size, m_Data.get());
m_Size = size;
}
LIST_FUNC_DEFINE(size_t)::size() const {
return m_Size;
}
LIST_FUNC_DEFINE(T &)::operator[](const size_t index) {
return m_Data.get()[index];
}
LIST_FUNC_DEFINE(const T &)::operator[](const size_t index) const {
return m_Data.get()[index];
}
LIST_FUNC_DEFINE(void)::need(const size_t additional_size) {
if (m_Size + additional_size > m_Capacity)
reserve(m_Capacity + additional_size);
}
LIST_FUNC_DEFINE(bool)::empty() const {
return m_Size == 0;
}
LIST_FUNC_DEFINE(void)::clear() {
m_Size = 0;
}
LIST_FUNC_DEFINE(void)::push_back(const T& value) {
if (m_Size >= m_Capacity)
reserve(m_Capacity * growth_scalar + growth_summand);
m_Data.get()[m_Size++] = value;
}
LIST_FUNC_DEFINE(template <typename... Args> void)::emplace_back(Args&&... args) {
if (m_Size >= m_Capacity)
reserve(m_Capacity * growth_scalar + growth_summand);
m_Data.get()[m_Size++] = T(std::forward<Args>(args)...);
}
LIST_FUNC_DEFINE(void)::expand(const List<T>& other) {
need(other.size());
std::copy(other.m_Data.get(), other.m_Data.get() + other.size(), m_Data.get() + m_Size);
m_Size += other.size();
}
LIST_FUNC_DEFINE(template <typename Lambda> void)::iterate(Lambda&& lambda) const
{
for (size_t i = 0; i < m_Size; i++)
lambda(m_Data.get()[i]);
}
}
#undef LIST_FUNC_DEFINE