Commit 723d4d3f authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

Refactor is_simple_allocator and callers

Summary:
[Folly] Refactor `is_simple_allocator` and callers.

* Swap order of template parameters.
* Do decaying in the callers instead.
* Do a direct invocability test, rather than an indirect test of whether the allocator has a method `destroy` with the expected signature.

Reviewed By: ericniebler

Differential Revision: D6184062

fbshipit-source-id: aec32e6e323b8c6023b94c258ab2bcddd8c53e09
parent 1bdec475
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#pragma once #pragma once
#include <folly/Traits.h> #include <folly/Traits.h>
#include <folly/functional/Invoke.h>
#include <cstddef> #include <cstddef>
#include <cstdlib> #include <cstdlib>
...@@ -24,6 +25,7 @@ ...@@ -24,6 +25,7 @@
#include <limits> #include <limits>
#include <memory> #include <memory>
#include <stdexcept> #include <stdexcept>
#include <type_traits>
#include <utility> #include <utility>
namespace folly { namespace folly {
...@@ -344,25 +346,23 @@ class allocator_delete ...@@ -344,25 +346,23 @@ class allocator_delete
} }
}; };
template <typename T, typename Allocator> namespace detail {
class is_simple_allocator {
FOLLY_CREATE_HAS_MEMBER_FN_TRAITS(has_destroy, destroy);
typedef typename std::remove_const< FOLLY_CREATE_MEMBER_INVOKE_TRAITS(destroy_invoke_traits, destroy);
typename std::remove_reference<Allocator>::type
>::type allocator;
typedef typename std::remove_reference<T>::type value_type;
typedef value_type* pointer;
public: } // namespace detail
constexpr static bool value = !has_destroy<allocator, void(pointer)>::value
&& !has_destroy<allocator, void(void*)>::value; template <typename Allocator, typename Value>
}; using is_simple_allocator =
Negation<detail::destroy_invoke_traits::is_invocable<Allocator, Value*>>;
template <typename T, typename Allocator> template <typename T, typename Allocator>
struct as_stl_allocator { struct as_stl_allocator {
typedef typename std::conditional< typedef typename std::conditional<
is_simple_allocator<T, Allocator>::value, is_simple_allocator<
typename std::remove_reference<Allocator>::type,
typename std::remove_reference<T>::type
>::value,
folly::StlAllocator< folly::StlAllocator<
typename std::remove_reference<Allocator>::type, typename std::remove_reference<Allocator>::type,
typename std::remove_reference<T>::type typename std::remove_reference<T>::type
...@@ -373,7 +373,10 @@ struct as_stl_allocator { ...@@ -373,7 +373,10 @@ struct as_stl_allocator {
template <typename T, typename Allocator> template <typename T, typename Allocator>
typename std::enable_if< typename std::enable_if<
is_simple_allocator<T, Allocator>::value, is_simple_allocator<
typename std::remove_reference<Allocator>::type,
typename std::remove_reference<T>::type
>::value,
folly::StlAllocator< folly::StlAllocator<
typename std::remove_reference<Allocator>::type, typename std::remove_reference<Allocator>::type,
typename std::remove_reference<T>::type typename std::remove_reference<T>::type
...@@ -387,7 +390,10 @@ typename std::enable_if< ...@@ -387,7 +390,10 @@ typename std::enable_if<
template <typename T, typename Allocator> template <typename T, typename Allocator>
typename std::enable_if< typename std::enable_if<
!is_simple_allocator<T, Allocator>::value, !is_simple_allocator<
typename std::remove_reference<Allocator>::type,
typename std::remove_reference<T>::type
>::value,
typename std::remove_reference<Allocator>::type typename std::remove_reference<Allocator>::type
>::type make_stl_allocator(Allocator&& allocator) { >::type make_stl_allocator(Allocator&& allocator) {
return std::move(allocator); return std::move(allocator);
...@@ -405,7 +411,10 @@ struct AllocatorUniquePtr { ...@@ -405,7 +411,10 @@ struct AllocatorUniquePtr {
typedef std::unique_ptr<T, typedef std::unique_ptr<T,
folly::allocator_delete< folly::allocator_delete<
typename std::conditional< typename std::conditional<
is_simple_allocator<T, Allocator>::value, is_simple_allocator<
typename std::remove_reference<Allocator>::type,
typename std::remove_reference<T>::type
>::value,
folly::StlAllocator<typename std::remove_reference<Allocator>::type, T>, folly::StlAllocator<typename std::remove_reference<Allocator>::type, T>,
typename std::remove_reference<Allocator>::type typename std::remove_reference<Allocator>::type
>::type >::type
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
using namespace folly; using namespace folly;
static_assert( static_assert(
is_simple_allocator<int,SysArena>::value, is_simple_allocator<SysArena, int>::value,
"SysArena should be a simple allocator" "SysArena should be a simple allocator"
); );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment