00001
00002
00003 #ifndef DUNE_COMMON_STD_MEMORY_HH
00004 #define DUNE_COMMON_STD_MEMORY_HH
00005
00006 #include <memory>
00007 #include <utility>
00008
00009 namespace Dune
00010 {
00011
00012 namespace Std
00013 {
00014
00015
00016
00017
00018
00019 template<class T>
00020 struct MakeUniqueHelper
00021 {
00022 typedef std::unique_ptr<T> NonArrayUniquePtr;
00023 };
00024
00025 template<class T>
00026 struct MakeUniqueHelper<T[]>
00027 {
00028 typedef std::unique_ptr<T[]> UnknownBoundArrayUniquePtr;
00029 typedef T RawType;
00030 };
00031
00032 template<class T, size_t N>
00033 struct MakeUniqueHelper<T[N]>
00034 {
00035 typedef void KnownBoundArrayUniquePtr;
00036 };
00037
00038
00049 template<typename T, typename... Args>
00050 typename MakeUniqueHelper<T>::NonArrayUniquePtr
00051 make_unique(Args&&... args)
00052 {
00053 return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
00054 }
00055
00062 template<typename T>
00063 typename MakeUniqueHelper<T>::UnknownBoundArrayUniquePtr
00064 make_unique(size_t n)
00065 {
00066 return std::unique_ptr<T>(new typename MakeUniqueHelper<T>::RawType[n]());
00067 }
00068
00079 template<typename T, typename ...Args>
00080 typename MakeUniqueHelper<T>::KnownBoundArrayUniquePtr
00081 make_unique(Args&&... args) = delete;
00082
00083
00084 }
00085
00086 }
00087
00088 #endif // #ifndef DUNE_COMMON_STD_MEMORY_HH