Permalink
Browse files

Merge pull request #3450 from STEllAR-GROUP/constexpr-bind

Constexpr-fying bind and other functional facilities
  • Loading branch information...
msimberg committed Sep 14, 2018
2 parents 6df436b + 1ac2880 commit 3c5574de9924900f5906761733107f6225854b31
Showing with 73 additions and 74 deletions.
  1. +21 −21 hpx/util/bind.hpp
  2. +9 −9 hpx/util/bind_back.hpp
  3. +9 −9 hpx/util/bind_front.hpp
  4. +20 −20 hpx/util/invoke.hpp
  5. +8 −9 hpx/util/invoke_fused.hpp
  6. +6 −6 hpx/util/mem_fn.hpp
View
@@ -66,7 +66,7 @@ namespace hpx { namespace util
typedef T& type;
template <typename Us>
static HPX_HOST_DEVICE HPX_FORCEINLINE
static HPX_CONSTEXPR HPX_HOST_DEVICE
type call(T& t, Us&& /*unbound*/)
{
return t;
@@ -79,7 +79,7 @@ namespace hpx { namespace util
typedef T&& type;
template <typename Us>
static HPX_HOST_DEVICE HPX_FORCEINLINE
static HPX_CONSTEXPR HPX_HOST_DEVICE
type call(T& t, Us&& /*unbound*/)
{
return std::forward<T>(t);
@@ -113,7 +113,7 @@ namespace hpx { namespace util
>::type&& type;
template <typename T>
static HPX_HOST_DEVICE HPX_FORCEINLINE
static HPX_CONSTEXPR HPX_HOST_DEVICE
type call(T&& /*t*/, Us&& unbound)
{
return util::get<I>(std::forward<Us>(unbound));
@@ -141,15 +141,15 @@ namespace hpx { namespace util
T&, Us
>::type type;
static HPX_HOST_DEVICE HPX_FORCEINLINE
static HPX_CONSTEXPR HPX_HOST_DEVICE
type call(T& t, Us&& unbound)
{
return util::invoke_fused(t, std::forward<Us>(unbound));
}
};
template <typename F, typename T, typename Us>
HPX_HOST_DEVICE HPX_FORCEINLINE
HPX_CONSTEXPR HPX_HOST_DEVICE
typename bind_eval_impl<F, T, Us>::type
bind_eval(T& t, Us&& unbound)
{
@@ -220,7 +220,7 @@ namespace hpx { namespace util
///////////////////////////////////////////////////////////////////////
template <typename F, typename Ts, typename Us, std::size_t ...Is>
HPX_HOST_DEVICE
HPX_CONSTEXPR HPX_HOST_DEVICE
typename std::enable_if<
!detail::is_simple_bind<Ts>::value,
typename invoke_bound_result<F, Ts, Us>::type
@@ -233,7 +233,7 @@ namespace hpx { namespace util
}
template <typename F, typename Ts, typename Us, std::size_t ...Is>
HPX_HOST_DEVICE
HPX_CONSTEXPR HPX_HOST_DEVICE
typename std::enable_if<
detail::is_simple_bind<Ts>::value,
typename invoke_bound_result<F, Ts, Us>::type
@@ -264,7 +264,7 @@ namespace hpx { namespace util
typename std::enable_if<
!std::is_same<typename std::decay<F_>::type, bound>::value
>::type>
explicit bound(F_&& f, Ts_&&... vs)
HPX_CONSTEXPR explicit bound(F_&& f, Ts_&&... vs)
: _f(std::forward<F_>(f))
, _args(std::forward<Ts_>(vs)...)
{}
@@ -287,7 +287,7 @@ namespace hpx { namespace util
bound& operator=(bound const&) = delete;
template <typename ...Us>
HPX_HOST_DEVICE inline
HPX_CXX14_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_result<
typename std::decay<F>::type,
util::tuple<typename util::decay_unwrap<Ts>::type...>,
@@ -300,7 +300,7 @@ namespace hpx { namespace util
}
template <typename ...Us>
HPX_HOST_DEVICE inline
HPX_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_result<
typename std::decay<F>::type const,
util::tuple<typename util::decay_unwrap<Ts>::type...> const,
@@ -359,7 +359,7 @@ namespace hpx { namespace util
///////////////////////////////////////////////////////////////////////////
template <typename F, typename ...Ts>
typename std::enable_if<
HPX_CONSTEXPR typename std::enable_if<
!traits::is_action<typename util::decay<F>::type>::value
, detail::bound<
typename std::decay<F>::type,
@@ -384,20 +384,20 @@ namespace hpx { namespace util
public:
# if !defined(HPX_DISABLE_ASSERTS)
// default constructor is needed for serialization
one_shot_wrapper()
HPX_CONSTEXPR one_shot_wrapper()
: _called(false)
{}
explicit one_shot_wrapper(F const& f)
HPX_CONSTEXPR explicit one_shot_wrapper(F const& f)
: _f(f)
, _called(false)
{}
explicit one_shot_wrapper(F&& f)
HPX_CONSTEXPR explicit one_shot_wrapper(F&& f)
: _f(std::move(f))
, _called(false)
{}
one_shot_wrapper(one_shot_wrapper&& other)
HPX_CXX14_CONSTEXPR one_shot_wrapper(one_shot_wrapper&& other)
: _f(std::move(other._f))
, _called(other._called)
{
@@ -412,17 +412,17 @@ namespace hpx { namespace util
}
# else
// default constructor is needed for serialization
one_shot_wrapper()
HPX_CONSTEXPR one_shot_wrapper()
{}
explicit one_shot_wrapper(F const& f)
HPX_CONSTEXPR explicit one_shot_wrapper(F const& f)
: _f(f)
{}
explicit one_shot_wrapper(F&& f)
HPX_CONSTEXPR explicit one_shot_wrapper(F&& f)
: _f(std::move(f))
{}
one_shot_wrapper(one_shot_wrapper&& other)
HPX_CONSTEXPR one_shot_wrapper(one_shot_wrapper&& other)
: _f(std::move(other._f))
{}
@@ -431,7 +431,7 @@ namespace hpx { namespace util
# endif
template <typename ...Ts>
HPX_HOST_DEVICE inline
HPX_CXX14_CONSTEXPR HPX_HOST_DEVICE
typename util::invoke_result<F, Ts...>::type
operator()(Ts&&... vs)
{
@@ -480,7 +480,7 @@ namespace hpx { namespace util
}
template <typename F>
inline detail::one_shot_wrapper<typename util::decay<F>::type>
HPX_CONSTEXPR detail::one_shot_wrapper<typename util::decay<F>::type>
one_shot(F&& f)
{
typedef
View
@@ -63,7 +63,7 @@ namespace hpx { namespace util
{};
template <typename F, std::size_t ...Is, typename Ts, typename ...Us>
HPX_HOST_DEVICE
HPX_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_back_result<F&&, Ts&&, Us...>::type
bound_back_impl(F&& f, pack_c<std::size_t, Is...>, Ts&& bound,
Us&&... unbound)
@@ -84,7 +84,7 @@ namespace hpx { namespace util
typename std::enable_if<
!std::is_same<typename std::decay<F_>::type, bound_back>::value
>::type>
explicit bound_back(F_&& f, Ts_&&... vs)
HPX_CONSTEXPR explicit bound_back(F_&& f, Ts_&&... vs)
: _f(std::forward<F_>(f))
, _args(std::forward<Ts_>(vs)...)
{}
@@ -93,12 +93,12 @@ namespace hpx { namespace util
bound_back(bound_back const&) = default;
bound_back(bound_back&&) = default;
#else
HPX_HOST_DEVICE bound_back(bound_back const& other)
HPX_CONSTEXPR HPX_HOST_DEVICE bound_back(bound_back const& other)
: _f(other._f)
, _args(other._args)
{}
HPX_HOST_DEVICE bound_back(bound_back&& other)
HPX_CONSTEXPR HPX_HOST_DEVICE bound_back(bound_back&& other)
: _f(std::move(other._f))
, _args(std::move(other._args))
{}
@@ -107,7 +107,7 @@ namespace hpx { namespace util
bound_back& operator=(bound_back const&) = delete;
template <typename ...Us>
HPX_HOST_DEVICE inline
HPX_CXX14_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_back_result<
typename std::decay<F>::type&,
util::tuple<typename util::decay_unwrap<Ts>::type...>&,
@@ -120,7 +120,7 @@ namespace hpx { namespace util
}
template <typename ...Us>
HPX_HOST_DEVICE inline
HPX_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_back_result<
typename std::decay<F>::type const&,
util::tuple<typename util::decay_unwrap<Ts>::type...> const&,
@@ -133,7 +133,7 @@ namespace hpx { namespace util
}
template <typename ...Us>
HPX_HOST_DEVICE inline
HPX_CXX14_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_back_result<
typename std::decay<F>::type&&,
util::tuple<typename util::decay_unwrap<Ts>::type...>&&,
@@ -146,7 +146,7 @@ namespace hpx { namespace util
}
template <typename ...Us>
HPX_HOST_DEVICE inline
HPX_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_back_result<
typename std::decay<F>::type const&&,
util::tuple<typename util::decay_unwrap<Ts>::type...> const&&,
@@ -204,7 +204,7 @@ namespace hpx { namespace util
}
template <typename F, typename ...Ts>
detail::bound_back<
HPX_CONSTEXPR detail::bound_back<
typename std::decay<F>::type,
typename std::decay<Ts>::type...>
bind_back(F&& f, Ts&&... vs) {
View
@@ -63,7 +63,7 @@ namespace hpx { namespace util
{};
template <typename F, std::size_t ...Is, typename Ts, typename ...Us>
HPX_HOST_DEVICE
HPX_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_front_result<F&&, Ts&&, Us...>::type
bound_front_impl(F&& f, pack_c<std::size_t, Is...>, Ts&& bound,
Us&&... unbound)
@@ -84,7 +84,7 @@ namespace hpx { namespace util
typename std::enable_if<
!std::is_same<typename std::decay<F_>::type, bound_front>::value
>::type>
explicit bound_front(F_&& f, Ts_&&... vs)
HPX_CONSTEXPR explicit bound_front(F_&& f, Ts_&&... vs)
: _f(std::forward<F_>(f))
, _args(std::forward<Ts_>(vs)...)
{}
@@ -93,12 +93,12 @@ namespace hpx { namespace util
bound_front(bound_front const&) = default;
bound_front(bound_front&&) = default;
#else
HPX_HOST_DEVICE bound_front(bound_front const& other)
HPX_CONSTEXPR HPX_HOST_DEVICE bound_front(bound_front const& other)
: _f(other._f)
, _args(other._args)
{}
HPX_HOST_DEVICE bound_front(bound_front&& other)
HPX_CONSTEXPR HPX_HOST_DEVICE bound_front(bound_front&& other)
: _f(std::move(other._f))
, _args(std::move(other._args))
{}
@@ -107,7 +107,7 @@ namespace hpx { namespace util
bound_front& operator=(bound_front const&) = delete;
template <typename ...Us>
HPX_HOST_DEVICE inline
HPX_CXX14_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_front_result<
typename std::decay<F>::type&,
util::tuple<typename util::decay_unwrap<Ts>::type...>&,
@@ -120,7 +120,7 @@ namespace hpx { namespace util
}
template <typename ...Us>
HPX_HOST_DEVICE inline
HPX_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_front_result<
typename std::decay<F>::type const&,
util::tuple<typename util::decay_unwrap<Ts>::type...> const&,
@@ -133,7 +133,7 @@ namespace hpx { namespace util
}
template <typename ...Us>
HPX_HOST_DEVICE inline
HPX_CXX14_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_front_result<
typename std::decay<F>::type&&,
util::tuple<typename util::decay_unwrap<Ts>::type...>&&,
@@ -146,7 +146,7 @@ namespace hpx { namespace util
}
template <typename ...Us>
HPX_HOST_DEVICE inline
HPX_CONSTEXPR HPX_HOST_DEVICE
typename invoke_bound_front_result<
typename std::decay<F>::type const&&,
util::tuple<typename util::decay_unwrap<Ts>::type...> const&&,
@@ -204,7 +204,7 @@ namespace hpx { namespace util
}
template <typename F, typename ...Ts>
detail::bound_front<
HPX_CONSTEXPR detail::bound_front<
typename std::decay<F>::type,
typename std::decay<Ts>::type...>
bind_front(F&& f, Ts&&... vs) {
Oops, something went wrong.

0 comments on commit 3c5574d

Please sign in to comment.