87 lines
No EOL
2.3 KiB
C++
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 |