|
@@ -35,6 +35,8 @@
|
|
|
#include "core/os/spin_lock.h"
|
|
|
#include "core/typedefs.h"
|
|
|
|
|
|
+#include <type_traits>
|
|
|
+
|
|
|
// PagedArray is used mainly for filling a very large array from multiple threads efficiently and without causing major fragmentation
|
|
|
|
|
|
// PageArrayPool manages central page allocation in a thread safe matter
|
|
@@ -197,7 +199,7 @@ public:
|
|
|
uint32_t page = count >> page_size_shift;
|
|
|
uint32_t offset = count & page_size_mask;
|
|
|
|
|
|
- if (!__has_trivial_constructor(T)) {
|
|
|
+ if (!std::is_trivially_constructible<T>::value) {
|
|
|
memnew_placement(&page_data[page][offset], T(p_value));
|
|
|
} else {
|
|
|
page_data[page][offset] = p_value;
|
|
@@ -209,7 +211,7 @@ public:
|
|
|
_FORCE_INLINE_ void pop_back() {
|
|
|
ERR_FAIL_COND(count == 0);
|
|
|
|
|
|
- if (!__has_trivial_destructor(T)) {
|
|
|
+ if (!std::is_trivially_destructible<T>::value) {
|
|
|
uint32_t page = (count - 1) >> page_size_shift;
|
|
|
uint32_t offset = (count - 1) & page_size_mask;
|
|
|
page_data[page][offset].~T();
|
|
@@ -226,7 +228,7 @@ public:
|
|
|
|
|
|
void clear() {
|
|
|
//destruct if needed
|
|
|
- if (!__has_trivial_destructor(T)) {
|
|
|
+ if (!std::is_trivially_destructible<T>::value) {
|
|
|
for (uint64_t i = 0; i < count; i++) {
|
|
|
uint32_t page = i >> page_size_shift;
|
|
|
uint32_t offset = i & page_size_mask;
|
|
@@ -309,13 +311,13 @@ public:
|
|
|
uint32_t to_copy = MIN(page_size - new_remainder, remainder);
|
|
|
|
|
|
for (uint32_t i = 0; i < to_copy; i++) {
|
|
|
- if (!__has_trivial_constructor(T)) {
|
|
|
+ if (!std::is_trivially_constructible<T>::value) {
|
|
|
memnew_placement(&dst_page[i + new_remainder], T(remainder_page[i + remainder - to_copy]));
|
|
|
} else {
|
|
|
dst_page[i + new_remainder] = remainder_page[i + remainder - to_copy];
|
|
|
}
|
|
|
|
|
|
- if (!__has_trivial_destructor(T)) {
|
|
|
+ if (!std::is_trivially_destructible<T>::value) {
|
|
|
remainder_page[i + remainder - to_copy].~T();
|
|
|
}
|
|
|
}
|