diff --git a/tdutils/td/utils/AtomicRead.h b/tdutils/td/utils/AtomicRead.h index 25fa3b8d8..f64691020 100644 --- a/tdutils/td/utils/AtomicRead.h +++ b/tdutils/td/utils/AtomicRead.h @@ -8,6 +8,7 @@ #include "td/utils/common.h" #include "td/utils/port/thread.h" +#include "td/utils/type_traits.h" #include #include @@ -21,7 +22,7 @@ class AtomicRead { public: void read(T &dest) const { while (true) { - static_assert(std::is_trivially_copyable::value, "T must be trivially copyable"); + static_assert(TD_IS_TRIVIALLY_COPYABLE(T), "T must be trivially copyable"); auto version_before = version.load(); if (version_before % 2 == 0) { std::memcpy(&dest, &value, sizeof(dest)); diff --git a/tdutils/td/utils/as.h b/tdutils/td/utils/as.h index dd86fa348..43a99f626 100644 --- a/tdutils/td/utils/as.h +++ b/tdutils/td/utils/as.h @@ -6,6 +6,8 @@ // #pragma once +#include "td/utils/type_traits.h" + #include #include @@ -64,13 +66,6 @@ class ConstAs { } // namespace detail -// no std::is_trivially_copyable in libstdc++ before 5.0 -#if __GLIBCXX__ -#define TD_IS_TRIVIALLY_COPYABLE(T) __has_trivial_copy(T) -#else -#define TD_IS_TRIVIALLY_COPYABLE(T) ::std::is_trivially_copyable::value -#endif - template = 0> detail::As as(FromT *from) { diff --git a/tdutils/td/utils/type_traits.h b/tdutils/td/utils/type_traits.h index 7f68a9601..284be729b 100644 --- a/tdutils/td/utils/type_traits.h +++ b/tdutils/td/utils/type_traits.h @@ -6,6 +6,10 @@ // #pragma once +#include "td/utils/int_types.h" + +#include + namespace td { template @@ -27,4 +31,11 @@ constexpr size_t member_function_argument_count() { return member_function_class::argument_count(); } +// no std::is_trivially_copyable in libstdc++ before 5.0 +#if __GLIBCXX__ +#define TD_IS_TRIVIALLY_COPYABLE(T) __has_trivial_copy(T) +#else +#define TD_IS_TRIVIALLY_COPYABLE(T) ::std::is_trivially_copyable::value +#endif + } // namespace td