Warning, file /include/QtCore/q20memory.h was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006 #ifndef Q20MEMORY_H
0007 #define Q20MEMORY_H
0008
0009 #include <QtCore/qtconfigmacros.h>
0010
0011 #include <QtCore/q17memory.h>
0012
0013 #include <QtCore/q20type_traits.h>
0014 #include <utility>
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 QT_BEGIN_NAMESPACE
0033
0034
0035 namespace q20 {
0036 #ifdef __cpp_lib_constexpr_dynamic_alloc
0037 using std::construct_at;
0038 #else
0039 template <typename T,
0040 typename... Args,
0041 typename Enable = std::void_t<decltype(::new (std::declval<void *>()) T(std::declval<Args>()...))> >
0042 T *construct_at(T *ptr, Args && ... args)
0043 {
0044 return ::new (const_cast<void *>(static_cast<const volatile void *>(ptr)))
0045 T(std::forward<Args>(args)...);
0046 }
0047 #endif
0048 }
0049
0050
0051 namespace q20 {
0052 #ifdef __cpp_lib_smart_ptr_for_overwrite
0053 using std::make_unique_for_overwrite;
0054 #else
0055
0056 template <typename T>
0057 std::enable_if_t<!std::is_array_v<T>, std::unique_ptr<T>>
0058 make_unique_for_overwrite()
0059
0060 { return std::unique_ptr<T>(new T); }
0061
0062
0063 template <typename T>
0064 std::enable_if_t<q20::is_unbounded_array_v<T>, std::unique_ptr<T>>
0065 make_unique_for_overwrite(std::size_t n)
0066
0067 { return std::unique_ptr<T>(new std::remove_extent_t<T>[n]); }
0068
0069
0070 template <typename T, typename...Args>
0071 std::enable_if_t<q20::is_bounded_array_v<T>>
0072 make_unique_for_overwrite(Args&&...) = delete;
0073
0074 #endif
0075 }
0076
0077 namespace q20 {
0078
0079 #ifdef __cpp_lib_to_address
0080 using std::to_address;
0081 #else
0082
0083 template <typename T>
0084 constexpr T *to_address(T *p) noexcept {
0085
0086
0087 static_assert(!std::is_function_v<T>, "to_address must not be used on function types");
0088 return p;
0089 }
0090
0091 template <typename Ptr, typename std::enable_if_t<!std::is_pointer_v<Ptr>, bool> = true>
0092 constexpr auto to_address(const Ptr &ptr) noexcept;
0093
0094 namespace detail {
0095
0096 template <typename Ptr, typename = void>
0097 struct to_address_helper {
0098 static auto get(const Ptr &ptr) noexcept
0099 { return q20::to_address(ptr.operator->()); }
0100 };
0101 template <typename Ptr>
0102 struct to_address_helper<Ptr, std::void_t<
0103 decltype(std::pointer_traits<Ptr>::to_address(std::declval<const Ptr&>()))
0104 >>
0105 {
0106 static auto get(const Ptr &ptr) noexcept
0107 { return std::pointer_traits<Ptr>::to_address(ptr); }
0108 };
0109 }
0110
0111 template <typename Ptr, typename std::enable_if_t<!std::is_pointer_v<Ptr>, bool>>
0112 constexpr auto to_address(const Ptr &ptr) noexcept
0113 { return detail::to_address_helper<Ptr>::get(ptr); }
0114
0115 #endif
0116 }
0117
0118 QT_END_NAMESPACE
0119
0120 #endif