diff options
Diffstat (limited to 'tensorflow/stream_executor/lib/ptr_util.h')
-rw-r--r-- | tensorflow/stream_executor/lib/ptr_util.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/tensorflow/stream_executor/lib/ptr_util.h b/tensorflow/stream_executor/lib/ptr_util.h new file mode 100644 index 0000000000..d10d0bcb8c --- /dev/null +++ b/tensorflow/stream_executor/lib/ptr_util.h @@ -0,0 +1,48 @@ +#ifndef TENSORFLOW_STREAM_EXECUTOR_LIB_PTR_UTIL_H_ +#define TENSORFLOW_STREAM_EXECUTOR_LIB_PTR_UTIL_H_ + +namespace perftools { +namespace gputools { +namespace port { + +// 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 MakeUnique(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 MakeUnique(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 MakeUnique(Args&&... /* args */) = + delete; // NOLINT + +} // namespace port +} // namespace gputools +} // namespace perftools + +#endif // TENSORFLOW_STREAM_EXECUTOR_LIB_PTR_UTIL_H_ |