| // -*-c++-*- | |
| // vim: set ft=cpp: | |
| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file LICENSE.rst or https://cmake.org/licensing for details. */ | |
| #pragma once | |
| #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 |