1#pragma once
2
3#include <memory>
4
5namespace torch {
6
7// Reference:
8// https://github.com/llvm-mirror/libcxx/blob/master/include/memory#L3091
9
10template <typename T>
11struct unique_type_for {
12 using value = std::unique_ptr<T>;
13};
14
15template <typename T>
16// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
17struct unique_type_for<T[]> {
18 // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
19 using unbounded_array = std::unique_ptr<T[]>;
20};
21
22template <typename T, size_t N>
23// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
24struct unique_type_for<T[N]> {
25 using bounded_array = void;
26};
27
28template <typename T, typename... Args>
29typename unique_type_for<T>::value make_unique(Args&&... args) {
30 return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
31}
32
33template <typename T>
34typename unique_type_for<T>::unbounded_array make_unique(size_t size) {
35 using U = typename std::remove_extent<T>::type;
36 return std::unique_ptr<T>(new U[size]());
37}
38
39template <typename T, size_t N, typename... Args>
40typename unique_type_for<T>::bounded_array make_unique(Args&&...) = delete;
41} // namespace torch
42