Edit: /usr/include/boost/hof/is_unpackable.hpp (3341B)
/*=============================================================================
Copyright (c) 2016 Paul Fultz II
is_unpackable.hpp
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#ifndef BOOST_HOF_GUARD_IS_UNPACKABLE_HPP
#define BOOST_HOF_GUARD_IS_UNPACKABLE_HPP
/// is_unpackable
/// =============
///
/// This is a trait that can be used to detect whether the type can be called
/// with `unpack`.
///
/// Synopsis
/// --------
///
/// template
/// struct is_unpackable;
///
/// Example
/// -------
///
/// #include
/// #include
///
/// int main() {
/// static_assert(boost::hof::is_unpackable>::value, "Failed");
/// }
///
#include
#include
#include
#include
#include
namespace boost { namespace hof {
namespace detail {
struct unpack_impl_f
{
template
constexpr auto operator()(F&& f, Sequence&& s) const BOOST_HOF_RETURNS
(
boost::hof::unpack_sequence::type>::type>::
apply(BOOST_HOF_FORWARD(F)(f), BOOST_HOF_FORWARD(Sequence)(s))
);
};
BOOST_HOF_DECLARE_STATIC_VAR(unpack_impl, unpack_impl_f);
#if BOOST_HOF_CHECK_UNPACK_SEQUENCE
struct private_unpack_type {};
template
struct unpack_impl_result
{
static_assert(boost::hof::is_invocable::value,
"Unpack is invalid for this sequence. The function used to unpack this sequence is not callable."
);
typedef decltype(boost::hof::detail::unpack_impl(boost::hof::always(private_unpack_type()), std::declval())) type;
};
template
struct is_proper_sequence
: std::is_same<
private_unpack_type,
typename unpack_impl_result::type
>
{};
#endif
template
struct is_unpackable_impl
: std::true_type
{
#if BOOST_HOF_CHECK_UNPACK_SEQUENCE
static_assert(is_proper_sequence::value,
"Unpack is invalid for this sequence. The function used to unpack this sequence does not invoke the function."
);
#endif
};
template
struct is_unpackable_impl::not_unpackable
>::type>
: std::false_type
{};
}
template
struct is_unpackable
: detail::is_unpackable_impl<
typename std::remove_cv::type>::type
>
{
#if BOOST_HOF_CHECK_UNPACK_SEQUENCE
typedef detail::is_unpackable_impl<
typename std::remove_cv::type>::type
> base;
typedef std::conditional, std::true_type> check;
static_assert(check::type::value,
"Unpack is invalid for this sequence. The function used to unpack this sequence does not invoke the function."
);
#endif
};
}} // namespace boost::hof
#endif