From a6b31d69be8c88d63afe67c22c7cb5a752b464c9 Mon Sep 17 00:00:00 2001 From: GeorgH93 Date: Sat, 28 Oct 2023 20:34:51 +0200 Subject: [PATCH] Fix multiple issues --- openVulkanoCpp/Data/Containers/Array.hpp | 74 ++++++++++++++++++------ 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/openVulkanoCpp/Data/Containers/Array.hpp b/openVulkanoCpp/Data/Containers/Array.hpp index 936e5a3..b7e215f 100644 --- a/openVulkanoCpp/Data/Containers/Array.hpp +++ b/openVulkanoCpp/Data/Containers/Array.hpp @@ -24,6 +24,23 @@ namespace OpenVulkano size_t size; T* data; + void ClearData() + { + if constexpr (!std::is_trivially_destructible_v) + { + // 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(::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& list) : size(list.size()), data(static_cast(::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& other) : size(other.Size()), data(static_cast(::operator new(sizeof(T) * other.Size()))) + Array(const std::initializer_list& 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& other) : size(other.Size()), data(MakeBuffer(other.Size())) + { + for(size_t i = 0; i < size; i++) + { + new (&data[i]) T(other[i]); + } } Array(Array&& other) noexcept: @@ -53,33 +82,45 @@ namespace OpenVulkano other.size = 0; } - explicit Array(const std::vector& vector) : size(vector.size()), data(static_cast(::operator new(sizeof(T) * size))) + explicit Array(const std::vector& 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(::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& 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& 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; } }