#ifndef MAKE_UNIQUE_H_ #define MAKE_UNIQUE_H_ #include <cstdlib> #include <memory> #include <type_traits> namespace osrm { namespace util { // Implement make_unique according to N3656. Taken from libcxx's implementation /// \brief Constructs a `new T()` with the given args and returns a /// `unique_ptr<T>` which owns the object. /// /// Example: /// /// auto p = make_unique<int>(); /// auto p = make_unique<std::tuple<int, int>>(0, 1); template <class T, class... Args> typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type make_unique(Args &&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } /// \brief Constructs a `new T[n]` with the given args and returns a /// `unique_ptr<T[]>` which owns the object. /// /// \param n size of the new array. /// /// Example: /// /// auto p = make_unique<int[]>(2); // value-initializes the array with 0's. template <class T> typename std::enable_if<std::is_array<T>::value && std::extent<T>::value == 0, std::unique_ptr<T>>::type make_unique(size_t n) { return std::unique_ptr<T>(new typename std::remove_extent<T>::type[n]()); } /// This function isn't used and is only here to provide better compile errors. template <class T, class... Args> typename std::enable_if<std::extent<T>::value != 0>::type make_unique(Args &&...) = delete; } } #endif // MAKE_UNIQUE_H_