X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FMemory.h;h=ce0ff05d3290605f6dd08ba28ad2caae4aca47b4;hb=2d3c33462242cada87a857143101cd99cd94b8f8;hp=c17662774b1aac670f6c4ece4ae216f6f28e1896;hpb=7ebe7c2a249de44209e8bcc453e1a70bafd4ed19;p=folly.git diff --git a/folly/Memory.h b/folly/Memory.h index c1766277..ce0ff05d 100644 --- a/folly/Memory.h +++ b/folly/Memory.h @@ -17,6 +17,7 @@ #pragma once #include +#include #include #include @@ -24,6 +25,7 @@ #include #include #include +#include #include namespace folly { @@ -137,18 +139,12 @@ std::weak_ptr to_weak_ptr(const std::shared_ptr& ptr) { return std::weak_ptr(ptr); } -namespace detail { -/** - * Not all STL implementations define ::free in a way that its address can be - * determined at compile time. So we must wrap ::free in a function whose - * address can be determined. - */ -inline void SysFree(void* p) { - ::free(p); -} -} +struct SysBufferDeleter { + void operator()(void* p) const { + ::free(p); + } +}; -using SysBufferDeleter = static_function_deleter; using SysBufferUniquePtr = std::unique_ptr; inline SysBufferUniquePtr allocate_sys_buffer(size_t size) { return SysBufferUniquePtr(::malloc(size)); @@ -350,25 +346,23 @@ class allocator_delete } }; -template -class is_simple_allocator { - FOLLY_CREATE_HAS_MEMBER_FN_TRAITS(has_destroy, destroy); +namespace detail { - typedef typename std::remove_const< - typename std::remove_reference::type - >::type allocator; - typedef typename std::remove_reference::type value_type; - typedef value_type* pointer; +FOLLY_CREATE_MEMBER_INVOKE_TRAITS(destroy_invoke_traits, destroy); - public: - constexpr static bool value = !has_destroy::value - && !has_destroy::value; -}; +} // namespace detail + +template +using is_simple_allocator = + Negation>; template struct as_stl_allocator { typedef typename std::conditional< - is_simple_allocator::value, + is_simple_allocator< + typename std::remove_reference::type, + typename std::remove_reference::type + >::value, folly::StlAllocator< typename std::remove_reference::type, typename std::remove_reference::type @@ -379,7 +373,10 @@ struct as_stl_allocator { template typename std::enable_if< - is_simple_allocator::value, + is_simple_allocator< + typename std::remove_reference::type, + typename std::remove_reference::type + >::value, folly::StlAllocator< typename std::remove_reference::type, typename std::remove_reference::type @@ -393,7 +390,10 @@ typename std::enable_if< template typename std::enable_if< - !is_simple_allocator::value, + !is_simple_allocator< + typename std::remove_reference::type, + typename std::remove_reference::type + >::value, typename std::remove_reference::type >::type make_stl_allocator(Allocator&& allocator) { return std::move(allocator); @@ -411,7 +411,10 @@ struct AllocatorUniquePtr { typedef std::unique_ptr::value, + is_simple_allocator< + typename std::remove_reference::type, + typename std::remove_reference::type + >::value, folly::StlAllocator::type, T>, typename std::remove_reference::type >::type