diff --git a/deps/ox/src/ox/std/typetraits.hpp b/deps/ox/src/ox/std/typetraits.hpp index 7e3f0956..96c72f1f 100644 --- a/deps/ox/src/ox/std/typetraits.hpp +++ b/deps/ox/src/ox/std/typetraits.hpp @@ -10,6 +10,21 @@ #include "bitops.hpp" +#if __has_include() + +#include + +#else + +namespace std { + +template +constexpr bool is_union_v = __is_union(T); + +} + +#endif + namespace ox { template @@ -51,6 +66,25 @@ template<> struct is_integral: ox::true_type {}; template<> struct is_integral : ox::true_type {}; template<> struct is_integral: ox::true_type {}; +template struct is_union: ox::integral_constant> {}; + +// indicates the type can have members, but not that it necessarily does +template +constexpr uint8_t memberable(int T::*) { return true; } +template +constexpr uint16_t memberable(...) { return false; } + +template +struct is_class: ox::integral_constant::value && ox::memberable(0)> {}; + +namespace test { +class TestClass {int i;}; +union TestUnion {int i;}; +static_assert(ox::is_class::value == true); +static_assert(ox::is_class::value == false); +static_assert(ox::is_class::value == false); +} + template constexpr bool is_signed = ox::integral_constant::value; diff --git a/deps/ox/src/ox/std/vector.hpp b/deps/ox/src/ox/std/vector.hpp index a63d74ec..f59ed515 100644 --- a/deps/ox/src/ox/std/vector.hpp +++ b/deps/ox/src/ox/std/vector.hpp @@ -85,7 +85,7 @@ template Vector::Vector(std::size_t size) noexcept { m_size = size; m_cap = m_size; - m_items = new T[m_cap]; + m_items = reinterpret_cast(new char[m_cap * sizeof(T)]); for (std::size_t i = 0; i < size; i++) { m_items[i] = {}; } @@ -95,7 +95,7 @@ template Vector::Vector(Vector &other) noexcept { m_size = other.m_size; m_cap = other.m_cap; - m_items = new T[m_cap]; + m_items = reinterpret_cast(new char[m_cap * sizeof(T)]); for (std::size_t i = 0; i < m_size; i++) { m_items[i] = ox::move(other.m_items[i]); } @@ -113,7 +113,12 @@ Vector::Vector(Vector &&other) noexcept { template Vector::~Vector() noexcept { - delete[] m_items; + if constexpr(ox::is_class()) { + for (std::size_t i = 0; i < m_size; i++) { + m_items[i].~T(); + } + } + delete[] reinterpret_cast(m_items); m_items = nullptr; } @@ -244,7 +249,7 @@ template void Vector::expandCap(std::size_t cap) noexcept { auto oldItems = m_items; m_cap = cap; - m_items = new T[m_cap]; + m_items = reinterpret_cast(new char[m_cap * sizeof(T)]); if (oldItems) { // move over old items const auto itRange = cap > m_size ? m_size : cap; for (std::size_t i = 0; i < itRange; i++) { @@ -253,7 +258,7 @@ void Vector::expandCap(std::size_t cap) noexcept { for (std::size_t i = itRange; i < m_cap; i++) { new (&m_items[i]) T; } - delete[] oldItems; + delete[] reinterpret_cast(m_items); } }