Commit 32543b61 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

Extract FunctionTraitsSharedProxy

Summary: [Folly] Extract `FunctionTraitsSharedProxy`, deduplicating four nearly identical implementations.

Differential Revision: D13461506

fbshipit-source-id: 2927dbe1629024cf778301c509b82711940a8099
parent a9b13cab
...@@ -292,6 +292,18 @@ template < ...@@ -292,6 +292,18 @@ template <
!std::is_reference<To>::value || std::is_reference<From>::value>::type> !std::is_reference<To>::value || std::is_reference<From>::value>::type>
using SafeResultOf = decltype(static_cast<To>(std::declval<From>())); using SafeResultOf = decltype(static_cast<To>(std::declval<From>()));
template <typename F, typename R, typename... A>
class FunctionTraitsSharedProxy {
std::shared_ptr<Function<F>> sp_;
public:
explicit FunctionTraitsSharedProxy(Function<F>&& func)
: sp_(std::make_shared<Function<F>>(std::move(func))) {}
R operator()(A&&... args) const {
return (*sp_)(static_cast<A&&>(args)...);
}
};
template <typename FunctionType> template <typename FunctionType>
struct FunctionTraits; struct FunctionTraits;
...@@ -328,16 +340,8 @@ struct FunctionTraits<ReturnType(Args...)> { ...@@ -328,16 +340,8 @@ struct FunctionTraits<ReturnType(Args...)> {
return fn.call_(fn.data_, static_cast<Args&&>(args)...); return fn.call_(fn.data_, static_cast<Args&&>(args)...);
} }
class SharedProxy { using SharedProxy =
std::shared_ptr<Function<NonConstSignature>> sp_; FunctionTraitsSharedProxy<NonConstSignature, ReturnType, Args...>;
public:
explicit SharedProxy(Function<NonConstSignature>&& func)
: sp_(std::make_shared<Function<NonConstSignature>>(std::move(func))) {}
ReturnType operator()(Args&&... args) const {
return (*sp_)(static_cast<Args&&>(args)...);
}
};
}; };
template <typename ReturnType, typename... Args> template <typename ReturnType, typename... Args>
...@@ -374,16 +378,8 @@ struct FunctionTraits<ReturnType(Args...) const> { ...@@ -374,16 +378,8 @@ struct FunctionTraits<ReturnType(Args...) const> {
return fn.call_(fn.data_, static_cast<Args&&>(args)...); return fn.call_(fn.data_, static_cast<Args&&>(args)...);
} }
class SharedProxy { using SharedProxy =
std::shared_ptr<Function<ConstSignature>> sp_; FunctionTraitsSharedProxy<ConstSignature, ReturnType, Args...>;
public:
explicit SharedProxy(Function<ConstSignature>&& func)
: sp_(std::make_shared<Function<ConstSignature>>(std::move(func))) {}
ReturnType operator()(Args&&... args) const {
return (*sp_)(static_cast<Args&&>(args)...);
}
};
}; };
#if FOLLY_HAVE_NOEXCEPT_FUNCTION_TYPE #if FOLLY_HAVE_NOEXCEPT_FUNCTION_TYPE
...@@ -420,16 +416,8 @@ struct FunctionTraits<ReturnType(Args...) noexcept> { ...@@ -420,16 +416,8 @@ struct FunctionTraits<ReturnType(Args...) noexcept> {
return fn.call_(fn.data_, static_cast<Args&&>(args)...); return fn.call_(fn.data_, static_cast<Args&&>(args)...);
} }
class SharedProxy { using SharedProxy =
std::shared_ptr<Function<NonConstSignature>> sp_; FunctionTraitsSharedProxy<NonConstSignature, ReturnType, Args...>;
public:
explicit SharedProxy(Function<NonConstSignature>&& func)
: sp_(std::make_shared<Function<NonConstSignature>>(std::move(func))) {}
ReturnType operator()(Args&&... args) const {
return (*sp_)(static_cast<Args&&>(args)...);
}
};
}; };
template <typename ReturnType, typename... Args> template <typename ReturnType, typename... Args>
...@@ -466,16 +454,8 @@ struct FunctionTraits<ReturnType(Args...) const noexcept> { ...@@ -466,16 +454,8 @@ struct FunctionTraits<ReturnType(Args...) const noexcept> {
return fn.call_(fn.data_, static_cast<Args&&>(args)...); return fn.call_(fn.data_, static_cast<Args&&>(args)...);
} }
class SharedProxy { using SharedProxy =
std::shared_ptr<Function<ConstSignature>> sp_; FunctionTraitsSharedProxy<ConstSignature, ReturnType, Args...>;
public:
explicit SharedProxy(Function<ConstSignature>&& func)
: sp_(std::make_shared<Function<ConstSignature>>(std::move(func))) {}
ReturnType operator()(Args&&... args) const {
return (*sp_)(static_cast<Args&&>(args)...);
}
};
}; };
#endif #endif
......
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