| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- /* Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License. */
- #pragma once
- #include <memory>
- namespace ultra_infer {
- namespace utils {
- // Trait to select overloads and return types for MakeUnique.
- template <typename T> struct MakeUniqueResult {
- using scalar = std::unique_ptr<T>;
- };
- template <typename T> struct MakeUniqueResult<T[]> {
- using array = std::unique_ptr<T[]>;
- };
- template <typename T, size_t N> struct MakeUniqueResult<T[N]> {
- using invalid = void;
- };
- // MakeUnique<T>(...) is an early implementation of C++14 std::make_unique.
- // It is designed to be 100% compatible with std::make_unique so that the
- // eventual switchover will be a simple renaming operation.
- template <typename T, typename... Args>
- typename MakeUniqueResult<T>::scalar make_unique(Args &&...args) { // NOLINT
- return std::unique_ptr<T>(
- new T(std::forward<Args>(args)...)); // NOLINT(build/c++11)
- }
- // Overload for array of unknown bound.
- // The allocation of arrays needs to use the array form of new,
- // and cannot take element constructor arguments.
- template <typename T>
- typename MakeUniqueResult<T>::array make_unique(size_t n) {
- return std::unique_ptr<T>(new typename std::remove_extent<T>::type[n]());
- }
- // Reject arrays of known bound.
- template <typename T, typename... Args>
- typename MakeUniqueResult<T>::invalid
- make_unique(Args &&.../* args */) = delete; // NOLINT
- } // namespace utils
- } // namespace ultra_infer
|