From 95dea4020f4446d70be31ede34686d87b500e4c9 Mon Sep 17 00:00:00 2001 From: Antonio SJ Musumeci <trapexit@spawn.link> Date: Sun, 4 Feb 2024 00:29:55 -0600 Subject: [PATCH] func_create_ff.cpp --- src/make_unique.hpp | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/make_unique.hpp diff --git a/src/make_unique.hpp b/src/make_unique.hpp new file mode 100644 index 00000000..98260bca --- /dev/null +++ b/src/make_unique.hpp @@ -0,0 +1,41 @@ +#include <cstddef> +#include <memory> +#include <type_traits> +#include <utility> + +namespace std +{ + template<class T> struct _Unique_if + { + typedef unique_ptr<T> _Single_object; + }; + + template<class T> struct _Unique_if<T[]> + { + typedef unique_ptr<T[]> _Unknown_bound; + }; + + template<class T, size_t N> struct _Unique_if<T[N]> + { + typedef void _Known_bound; + }; + + template<class T, class... Args> + typename _Unique_if<T>::_Single_object + make_unique(Args&&... args) + { + return unique_ptr<T>(new T(std::forward<Args>(args)...)); + } + + template<class T> + typename _Unique_if<T>::_Unknown_bound + make_unique(size_t n) + { + typedef typename remove_extent<T>::type U; + return unique_ptr<T>(new U[n]()); + } + + template<class T, class... Args> + typename _Unique_if<T>::_Known_bound + make_unique(Args&&...) = delete; +}