From 0da7a86a8c60d9772d2ebda150843779a5e17fd6 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 8 Jan 2016 13:38:18 +0100 Subject: make make make_unique_clear accept all kind of parameters (nw) --- src/lib/util/corealloc.h | 56 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) (limited to 'src/lib/util/corealloc.h') 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__ */ -- cgit v1.2.3-70-g09d2