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