Fix multiple issues
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user