summaryrefslogtreecommitdiff
path: root/boost/hof/detail/and.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/hof/detail/and.hpp')
-rw-r--r--boost/hof/detail/and.hpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/boost/hof/detail/and.hpp b/boost/hof/detail/and.hpp
new file mode 100644
index 0000000000..8a7e50a36e
--- /dev/null
+++ b/boost/hof/detail/and.hpp
@@ -0,0 +1,55 @@
+/*=============================================================================
+ Copyright (c) 2015 Paul Fultz II
+ and.h
+ 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_AND_H
+#define BOOST_HOF_GUARD_AND_H
+
+#include <type_traits>
+#include <boost/hof/detail/using.hpp>
+#include <boost/hof/detail/intrinsics.hpp>
+
+namespace boost { namespace hof { namespace detail {
+
+constexpr bool and_c()
+{
+ return true;
+}
+
+template<class... Ts>
+constexpr bool and_c(bool b, Ts... bs)
+{
+ return b && and_c(bs...);
+}
+
+#ifdef _MSC_VER
+
+template<class... Ts>
+struct and_;
+
+template<class T, class... Ts>
+struct and_<T, Ts...>
+: std::integral_constant<bool, (T::value && and_<Ts...>::value)>
+{};
+
+template<>
+struct and_<>
+: std::true_type
+{};
+
+#define BOOST_HOF_AND_UNPACK(Bs) (boost::hof::detail::and_c(Bs...))
+#else
+template<bool...> struct bool_seq {};
+template<class... Ts>
+BOOST_HOF_USING(and_, std::is_same<bool_seq<Ts::value...>, bool_seq<(Ts::value, true)...>>);
+
+#define BOOST_HOF_AND_UNPACK(Bs) BOOST_HOF_IS_BASE_OF(boost::hof::detail::bool_seq<Bs...>, boost::hof::detail::bool_seq<(Bs || true)...>)
+
+#endif
+
+}}} // namespace boost::hof
+
+#endif