Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : #include <memory> 8 : #include <type_traits> 9 : 10 : namespace cpp20 { 11 : namespace detail { 12 : template <typename T> 13 : struct unique_type { 14 : using single_object = std::unique_ptr<T>; 15 : }; 16 : 17 : template <typename T> 18 : struct unique_type<T[]> { 19 : using array = std::unique_ptr<T[]>; 20 : }; 21 : 22 : template<typename T, size_t Bound> 23 : struct unique_type<T[Bound]> { struct invalid_type { }; }; 24 : } // namespace detail 25 : 26 : template <typename T, typename... Args> 27 0 : typename detail::unique_type<T>::single_object make_unique_for_overwrite() { 28 : return std::unique_ptr<T>(new T); 29 : } 30 : 31 : template <typename T> 32 0 : typename detail::unique_type<T>::array make_unique_for_overwrite( 33 : const size_t num) { 34 : return std::unique_ptr<T>(new std::remove_extent_t<T>[num]); 35 : } 36 : 37 : template <typename T, typename... Args> 38 0 : typename detail::unique_type<T>::invalid_type make_unique_for_overwrite( 39 : Args&&...) = delete; 40 : } // namespace cpp20 41 : 42 : /// Install a memory allocation failure handler that calls ERROR() 43 : /// instead of throwing an exception. 44 1 : void setup_memory_allocation_failure_reporting();