diff --git a/core/cowdata.h b/core/cowdata.h index cdb187e322a..57b38392c99 100644 --- a/core/cowdata.h +++ b/core/cowdata.h @@ -32,6 +32,7 @@ #define COWDATA_H_ #include +#include #include "core/error_macros.h" #include "core/os/memory.h" @@ -203,7 +204,7 @@ void CowData::_unref(void *p_data) { return; // still in use // clean up - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible::value) { uint32_t *count = _get_size(); T *data = (T *)(count + 1); @@ -238,7 +239,7 @@ uint32_t CowData::_copy_on_write() { T *_data = (T *)(mem_new); // initialize new elements - if (__has_trivial_copy(T)) { + if (std::is_trivially_copyable::value) { memcpy(mem_new, _ptr, current_size * sizeof(T)); } else { @@ -302,7 +303,7 @@ Error CowData::resize(int p_size) { // construct the newly created elements - if (!__has_trivial_constructor(T)) { + if (!std::is_trivially_constructible::value) { T *elems = _get_data(); for (int i = *_get_size(); i < p_size; i++) { @@ -313,8 +314,7 @@ Error CowData::resize(int p_size) { *_get_size() = p_size; } else if (p_size < current_size) { - - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible::value) { // deinitialize no longer needed elements for (uint32_t i = p_size; i < *_get_size(); i++) { T *t = &_get_data()[i]; diff --git a/core/local_vector.h b/core/local_vector.h index ee09b4722ef..df124446517 100644 --- a/core/local_vector.h +++ b/core/local_vector.h @@ -37,6 +37,8 @@ #include "core/sort_array.h" #include "core/vector.h" +#include + template class LocalVector { private: @@ -64,7 +66,7 @@ public: CRASH_COND_MSG(!data, "Out of memory"); } - if (!__has_trivial_constructor(T) && !force_trivial) { + if (!std::is_trivially_constructible::value && !force_trivial) { memnew_placement(&data[count++], T(p_elem)); } else { data[count++] = p_elem; @@ -77,7 +79,7 @@ public: for (U i = p_index; i < count; i++) { data[i] = data[i + 1]; } - if (!__has_trivial_destructor(T) && !force_trivial) { + if (!std::is_trivially_destructible::value && !force_trivial) { data[count].~T(); } } @@ -90,7 +92,7 @@ public: if (count > p_index) { data[p_index] = data[count]; } - if (!__has_trivial_destructor(T) && !force_trivial) { + if (!std::is_trivially_destructible::value && !force_trivial) { data[count].~T(); } } @@ -130,7 +132,7 @@ public: _FORCE_INLINE_ U size() const { return count; } void resize(U p_size) { if (p_size < count) { - if (!__has_trivial_destructor(T) && !force_trivial) { + if (!std::is_trivially_destructible::value && !force_trivial) { for (U i = p_size; i < count; i++) { data[i].~T(); } @@ -147,7 +149,7 @@ public: data = (T *)memrealloc(data, capacity * sizeof(T)); CRASH_COND_MSG(!data, "Out of memory"); } - if (!__has_trivial_constructor(T) && !force_trivial) { + if (!std::is_trivially_constructible::value && !force_trivial) { for (U i = count; i < p_size; i++) { memnew_placement(&data[i], T); } diff --git a/core/os/memory.h b/core/os/memory.h index 84ff44c3a21..5b44b46d586 100644 --- a/core/os/memory.h +++ b/core/os/memory.h @@ -35,6 +35,7 @@ #include "core/safe_refcount.h" #include +#include #ifndef PAD_ALIGN #define PAD_ALIGN 16 //must always be greater than this at much @@ -113,8 +114,9 @@ void memdelete(T *p_class) { if (!predelete_handler(p_class)) return; // doesn't want to be deleted - if (!__has_trivial_destructor(T)) + if (!std::is_trivially_destructible::value) { p_class->~T(); + } Memory::free_static(p_class, false); } @@ -124,8 +126,9 @@ void memdelete_allocator(T *p_class) { if (!predelete_handler(p_class)) return; // doesn't want to be deleted - if (!__has_trivial_destructor(T)) + if (!std::is_trivially_destructible::value) { p_class->~T(); + } A::free(p_class); } @@ -151,7 +154,7 @@ T *memnew_arr_template(size_t p_elements, const char *p_descr = "") { ERR_FAIL_COND_V(!mem, failptr); *(mem - 1) = p_elements; - if (!__has_trivial_constructor(T)) { + if (!std::is_trivially_constructible::value) { T *elems = (T *)mem; /* call operator new */ @@ -180,7 +183,7 @@ void memdelete_arr(T *p_class) { uint64_t *ptr = (uint64_t *)p_class; - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible::value) { uint64_t elem_count = *(ptr - 1); for (uint64_t i = 0; i < elem_count; i++) {