Fix multiple issues

This commit is contained in:
2023-10-28 20:34:51 +02:00
parent b3e94db476
commit a6b31d69be

View File

@@ -24,6 +24,23 @@ namespace OpenVulkano
size_t size;
T* data;
void ClearData()
{
if constexpr (!std::is_trivially_destructible_v<T>)
{
// Call the destructor on all the members in reverse order
for (size_t i = size; i > 0;)
{
data[--i].~T();
}
}
}
static T* MakeBuffer(size_t count)
{
return static_cast<T*>(::operator new(sizeof(T) * count));
}
public:
using iterator = T*;
using const_iterator = const T*;
@@ -33,17 +50,29 @@ namespace OpenVulkano
Array() noexcept: size(0), data(nullptr)
{}
explicit Array(size_t size) : size(size), data(new T[size]())
{}
Array(const std::initializer_list<T>& list) : size(list.size()), data(static_cast<T*>(::operator new(sizeof(T) * list.Size())))
explicit Array(size_t size) : size(size), data(MakeBuffer(size))
{
std::copy(list.begin(), list.end(), Begin());
for(size_t i = 0; i < size; i++)
{
new (&data[i]) T();
}
}
Array(const Array<T>& other) : size(other.Size()), data(static_cast<T*>(::operator new(sizeof(T) * other.Size())))
Array(const std::initializer_list<T>& list) : size(list.size()), data(MakeBuffer(list.size()))
{
std::copy(other.begin(), other.end(), Begin());
int i = 0;
for(const T& e : list)
{
new (&data[i++]) T(e);
}
}
Array(const Array<T>& other) : size(other.Size()), data(MakeBuffer(other.Size()))
{
for(size_t i = 0; i < size; i++)
{
new (&data[i]) T(other[i]);
}
}
Array(Array<T>&& other) noexcept:
@@ -53,33 +82,45 @@ namespace OpenVulkano
other.size = 0;
}
explicit Array(const std::vector<T>& vector) : size(vector.size()), data(static_cast<T*>(::operator new(sizeof(T) * size)))
explicit Array(const std::vector<T>& vector) : size(vector.size()), data(MakeBuffer(size))
{
std::copy(vector.begin(), vector.end(), Begin());
int i = 0;
for (const auto& e : vector)
{
new (&data[i++]) T(e);
}
}
Array(size_t size, const T& defaultValue) : size(size), data(static_cast<T*>(::operator new(sizeof(T) * size)))
Array(size_t size, const T& defaultValue) : size(size), data(MakeBuffer(size))
{
Fill(defaultValue);
}
~Array() noexcept
{
delete[] data;
ClearData();
::operator delete(data);
}
Array& operator=(const Array<T>& rhs)
{
if (this == &rhs) return *this;
Resize(rhs.size());
std::copy(rhs.begin(), rhs.end(), Begin());
for(size_t i = 0; i < size; i++)
{
new (&data[i]) T(rhs[i]);
}
return *this;
}
Array& operator=(const std::initializer_list<T>& list)
{
Resize(list.size());
std::copy(list.begin(), list.end(), Begin());
int i = 0;
for(const T& e : list)
{
new (&data[i++]) T(e);
}
return *this;
}
@@ -257,12 +298,11 @@ namespace OpenVulkano
private:
void Resize(size_t newSize)
{
ClearData();
if (Size() != newSize)
{
size = 0;
delete[] data;
data = nullptr;
data = new T[newSize];
::operator delete(data);
data = MakeBuffer(newSize);
size = newSize;
}
}