// -*-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
