1 // Licensed to the Apache Software Foundation (ASF) under one
2 // or more contributor license agreements.  See the NOTICE file
3 // distributed with this work for additional information
4 // regarding copyright ownership.  The ASF licenses this file
5 // to you under the Apache License, Version 2.0 (the
6 // "License"); you may not use this file except in compliance
7 // with the License.  You may obtain a copy of the License at
8 //
9 //   http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing,
12 // software distributed under the License is distributed on an
13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 // KIND, either express or implied.  See the License for the
15 // specific language governing permissions and limitations
16 // under the License.
17 
18 #pragma once
19 
20 #include <memory>
21 #include <type_traits>
22 #include <utility>
23 
24 namespace arrow {
25 namespace internal {
26 
27 template <typename T, typename... A>
make_unique(A &&...args)28 typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type make_unique(
29     A&&... args) {
30   return std::unique_ptr<T>(new T(std::forward<A>(args)...));
31 }
32 
33 template <typename T>
34 typename std::enable_if<std::is_array<T>::value && std::extent<T>::value == 0,
35                         std::unique_ptr<T>>::type
make_unique(std::size_t n)36 make_unique(std::size_t n) {
37   using value_type = typename std::remove_extent<T>::type;
38   return std::unique_ptr<value_type[]>(new value_type[n]);
39 }
40 
41 }  // namespace internal
42 }  // namespace arrow
43