summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
1bdec47)
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
#pragma once
#include <folly/Traits.h>
#pragma once
#include <folly/Traits.h>
+#include <folly/functional/Invoke.h>
#include <cstddef>
#include <cstdlib>
#include <cstddef>
#include <cstdlib>
#include <limits>
#include <memory>
#include <stdexcept>
#include <limits>
#include <memory>
#include <stdexcept>
#include <utility>
namespace folly {
#include <utility>
namespace folly {
-template <typename T, typename Allocator>
-class is_simple_allocator {
- FOLLY_CREATE_HAS_MEMBER_FN_TRAITS(has_destroy, destroy);
- typedef typename std::remove_const<
- typename std::remove_reference<Allocator>::type
- >::type allocator;
- typedef typename std::remove_reference<T>::type value_type;
- typedef value_type* pointer;
+FOLLY_CREATE_MEMBER_INVOKE_TRAITS(destroy_invoke_traits, destroy);
- public:
- constexpr static bool value = !has_destroy<allocator, void(pointer)>::value
- && !has_destroy<allocator, void(void*)>::value;
-};
+} // namespace detail
+
+template <typename Allocator, typename Value>
+using is_simple_allocator =
+ Negation<detail::destroy_invoke_traits::is_invocable<Allocator, Value*>>;
template <typename T, typename Allocator>
struct as_stl_allocator {
typedef typename std::conditional<
template <typename T, typename Allocator>
struct as_stl_allocator {
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<
typename std::remove_reference<Allocator>::type,
typename std::remove_reference<T>::type
folly::StlAllocator<
typename std::remove_reference<Allocator>::type,
typename std::remove_reference<T>::type
template <typename T, typename Allocator>
typename std::enable_if<
template <typename T, typename Allocator>
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<
typename std::remove_reference<Allocator>::type,
typename std::remove_reference<T>::type
folly::StlAllocator<
typename std::remove_reference<Allocator>::type,
typename std::remove_reference<T>::type
template <typename T, typename Allocator>
typename std::enable_if<
template <typename T, typename Allocator>
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
>::type make_stl_allocator(Allocator&& allocator) {
return std::move(allocator);
typename std::remove_reference<Allocator>::type
>::type make_stl_allocator(Allocator&& allocator) {
return std::move(allocator);
typedef std::unique_ptr<T,
folly::allocator_delete<
typename std::conditional<
typedef std::unique_ptr<T,
folly::allocator_delete<
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>,
typename std::remove_reference<Allocator>::type
>::type
folly::StlAllocator<typename std::remove_reference<Allocator>::type, T>,
typename std::remove_reference<Allocator>::type
>::type
using namespace folly;
static_assert(
using namespace folly;
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"
);