diff --git a/src/lib/util/corealloc.h b/src/lib/util/corealloc.h index d5eec557afa..0eab4b5123e 100644 --- a/src/lib/util/corealloc.h +++ b/src/lib/util/corealloc.h @@ -17,6 +17,7 @@ #include #include #include +#include #include "osdcore.h" @@ -35,7 +36,7 @@ template inline _Tp* global_alloc_clear(_Args&&... __args) { - UINT8* ptr = new UINT8[sizeof(_Tp)]; // allocate memory + unsigned char * ptr = new unsigned char[sizeof(_Tp)]; // allocate memory memset(ptr, 0, sizeof(_Tp)); return new(ptr) _Tp(std::forward<_Args>(__args)...); } @@ -44,10 +45,61 @@ template inline _Tp* global_alloc_array_clear(size_t __num) { auto size = sizeof(_Tp) * __num; - UINT8* ptr = new UINT8[size]; // allocate memory + unsigned char* ptr = new unsigned char[size]; // allocate memory memset(ptr, 0, size); return new(ptr) _Tp[__num](); } + +template +struct _MakeUniqClear +{ + typedef std::unique_ptr<_Tp> __single_object; +}; + +template +struct _MakeUniqClear<_Tp[]> +{ + typedef std::unique_ptr<_Tp[]> __array; +}; + +template +struct _MakeUniqClear<_Tp[_Bound]> +{ + struct __invalid_type { }; +}; + +/// make_unique_clear for single objects +template +inline typename _MakeUniqClear<_Tp>::__single_object make_unique_clear(_Args&&... __args) +{ + unsigned char* ptr = new unsigned char[sizeof(_Tp)]; // allocate memory + memset(ptr, 0, sizeof(_Tp)); + return std::unique_ptr<_Tp>(new(ptr) _Tp(std::forward<_Args>(__args)...)); +} + +/// make_unique_clear for arrays of unknown bound +template +inline typename _MakeUniqClear<_Tp>::__array make_unique_clear(size_t __num) +{ + auto size = sizeof(std::remove_extent_t<_Tp>) * __num; + unsigned char* ptr = new unsigned char[size]; // allocate memory + memset(ptr, 0, size); + return std::unique_ptr<_Tp>(new(ptr) std::remove_extent_t<_Tp>[__num]()); +} + +template +inline typename _MakeUniqClear<_Tp>::__array make_unique_clear(size_t __num) +{ + auto size = sizeof(std::remove_extent_t<_Tp>) * __num; + unsigned char* ptr = new unsigned char[size]; // allocate memory + memset(ptr, _F, size); + return std::unique_ptr<_Tp>(new(ptr) std::remove_extent_t<_Tp>[__num]()); +} + +/// Disable make_unique_clear for arrays of known bound +template +inline typename _MakeUniqClear<_Tp>::__invalid_type make_unique_clear(_Args&&...) = delete; + #endif /* __COREALLOC_H__ */ diff --git a/src/lib/util/coretmpl.h b/src/lib/util/coretmpl.h index c97249de9f1..9201041b2d9 100644 --- a/src/lib/util/coretmpl.h +++ b/src/lib/util/coretmpl.h @@ -17,7 +17,6 @@ #include "corealloc.h" #include -#include #if defined(_MSC_VER) && (_MSC_VER < 1900) #include @@ -33,34 +32,6 @@ typedef std::vector dynamic_buffer; -template -inline std::unique_ptr make_unique_clear(std::size_t size) -{ - auto ptr = std::make_unique(size); - static_assert(std::is_array::value, "Type must be array"); - memset(ptr.get(), 0, sizeof(std::remove_extent) * size); - return ptr; -} - -template -inline std::unique_ptr make_unique_clear(std::size_t size) -{ - auto ptr = std::make_unique(size); - static_assert(std::is_array::value, "Type must be array"); - memset(ptr.get(), F, sizeof(std::remove_extent) * size); - return ptr; -} - - -template -inline std::unique_ptr make_unique_clear() -{ - auto ptr = std::make_unique(); - static_assert(std::is_pod::value, "Type must be plain old data type"); - memset(ptr.get(), 0, sizeof(T)); - return ptr; -} - // ======================> simple_list