| // -*-c++-*- |
| // vim: set ft=cpp: |
| |
| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #ifndef cm_memory |
| #define cm_memory |
| |
| #include "cmSTL.hxx" // IWYU pragma: keep |
| |
| #include <memory> // IWYU pragma: export |
| |
| #if !defined(CMake_HAVE_CXX_MAKE_UNIQUE) |
| # include <cstddef> |
| # include <type_traits> |
| # include <utility> |
| #endif |
| |
| namespace cm { |
| |
| #if defined(CMake_HAVE_CXX_MAKE_UNIQUE) |
| |
| using std::make_unique; |
| |
| #else |
| |
| namespace internals { |
| |
| template <typename T> |
| struct make_unique_if |
| { |
| using single = std::unique_ptr<T>; |
| }; |
| |
| template <typename T> |
| struct make_unique_if<T[]> |
| { |
| using unbound_array = std::unique_ptr<T[]>; |
| }; |
| |
| template <typename T, std::size_t N> |
| struct make_unique_if<T[N]> |
| { |
| using bound_array = void; |
| }; |
| } |
| |
| template <typename T, typename... Args> |
| typename internals::make_unique_if<T>::single make_unique(Args&&... args) |
| { |
| return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); |
| } |
| |
| template <typename T> |
| typename internals::make_unique_if<T>::unbound_array make_unique(std::size_t n) |
| { |
| using E = typename std::remove_extent<T>::type; |
| |
| return std::unique_ptr<T>(new E[n]()); |
| } |
| |
| template <typename T, typename... Args> |
| typename internals::make_unique_if<T>::bound_array make_unique(Args&&...) = |
| delete; |
| |
| #endif |
| |
| } // namespace cm |
| |
| #endif |