Compare commits

...

2 Commits

Author SHA1 Message Date
da805eec83
Describe what check() and expect() are
All checks were successful
continuous-integration/drone/push Build is passing
2023-01-14 10:59:30 +01:00
eb35abfa52
Vector: Assigment, copy&move constructors, and destructor 2023-01-14 10:50:28 +01:00
2 changed files with 56 additions and 0 deletions

View File

@ -7,6 +7,7 @@
#define STRINGIZE_VALUE_OF(x) STRINGIZE(x)
#endif
// Like check(), but with a custom error message.
#define expect(expr, message) \
do { \
if (!(expr)) [[unlikely]] \
@ -15,6 +16,7 @@
} \
} while (0)
// Like assert(), but always enabled.
#define check(expr) \
do { \
if (!(expr)) [[unlikely]] \

View File

@ -14,6 +14,60 @@ template <typename T> class Vector
{
}
Vector(const Vector<T>& other)
{
reserve(other.capacity());
memcpy(m_data, other.data(), other.size());
m_size = other.size();
}
Vector(Vector<T>&& other)
{
m_data = other.data();
m_capacity = other.capacity();
m_size = other.size();
other.m_capacity = other.m_size = 0;
other.m_data = nullptr;
}
Vector<T>& operator=(const Vector<T>& other)
{
if (&other == this) return *this;
if (m_data) free_impl(m_data);
m_data = nullptr;
m_capacity = m_size = 0;
reserve(other.capacity());
memcpy(m_data, other.data(), other.size());
m_size = other.size();
return *this;
}
Vector<T>& operator=(Vector<T>&& other)
{
if (&other == this) return *this;
if (m_data) free_impl(m_data);
m_data = other.data();
m_capacity = other.capacity();
m_size = other.size();
other.m_capacity = other.m_size = 0;
other.m_data = nullptr;
return *this;
}
~Vector()
{
if (m_data) free_impl(m_data);
}
Result<void> try_reserve(usize capacity)
{
return resize(capacity);