1 /*============================================================================= 2 Copyright (c) 2016 Lee Clagett 3 4 Distributed under the Boost Software License, Version 1.0. (See accompanying 5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 ==============================================================================*/ 7 #ifndef FUSION_AND_07152016_1625 8 #define FUSION_AND_07152016_1625 9 10 #include <boost/config.hpp> 11 #include <boost/type_traits/integral_constant.hpp> 12 13 #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) 14 #error fusion::detail::and_ requires variadic templates 15 #endif 16 17 namespace boost { namespace fusion { namespace detail { 18 template<typename ...Cond> 19 struct and_impl : false_type {}; 20 21 template<typename ...T> 22 struct and_impl<integral_constant<T, true>...> : true_type {}; 23 24 // This specialization is necessary to avoid MSVC-12 variadics bug. 25 template<bool ...Cond> 26 struct and_impl1 : and_impl<integral_constant<bool, Cond>...> {}; 27 28 /* fusion::detail::and_ differs from mpl::and_ in the following ways: 29 - The empty set is valid and returns true 30 - A single element set is valid and returns the identity 31 - There is no upper bound on the set size 32 - The conditions are evaluated at once, and are not short-circuited. This 33 reduces instantations when returning true; the implementation is not 34 recursive. */ 35 template<typename ...Cond> 36 struct and_ : and_impl1<Cond::value...> {}; 37 }}} 38 39 #endif // FUSION_AND_07152016_1625 40