From f6d92069a9f75f5211fc0b44ded2d2241f9e2d38 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Mon, 29 May 2017 05:56:55 +0300 Subject: [PATCH] Make mp_at SFINAE-friendly --- include/boost/mp11/algorithm.hpp | 4 ++-- test/Jamfile.v2 | 1 + test/mp_at_sf.cpp | 39 ++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 test/mp_at_sf.cpp diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index d33b248..5d27cba 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -325,8 +325,8 @@ template struct mp_at_c_impl } // namespace detail -template using mp_at_c = typename detail::mp_at_c_impl::type; -template using mp_at = typename detail::mp_at_c_impl::type; +template using mp_at_c = typename mp_if_c<(I < mp_size::value), detail::mp_at_c_impl, void>::type; +template using mp_at = mp_at_c; // mp_take(_c) namespace detail diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 2d6df0a..b086740 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -48,6 +48,7 @@ run mp_product.cpp : : : $(REQ) ; run mp_drop.cpp : : : $(REQ) ; run mp_iota.cpp : : : $(REQ) ; run mp_at.cpp : : : $(REQ) ; +run mp_at_sf.cpp : : : $(REQ) ; run mp_take.cpp : : : $(REQ) ; run mp_replace.cpp : : : $(REQ) ; run mp_replace_if.cpp : : : $(REQ) ; diff --git a/test/mp_at_sf.cpp b/test/mp_at_sf.cpp new file mode 100644 index 0000000..00463f9 --- /dev/null +++ b/test/mp_at_sf.cpp @@ -0,0 +1,39 @@ + +// Copyright 2015, 2017 Peter Dimov. +// +// 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 + + +#include +#include +#include +#include + +using boost::mp11::mp_valid; +using boost::mp11::mp_at; +using boost::mp11::mp_size_t; +using boost::mp11::mp_list; + +int main() +{ + BOOST_TEST_TRAIT_FALSE((mp_valid)); + BOOST_TEST_TRAIT_FALSE((mp_valid)); + BOOST_TEST_TRAIT_FALSE((mp_valid)); + BOOST_TEST_TRAIT_FALSE((mp_valid)); + + BOOST_TEST_TRAIT_FALSE((mp_valid>)); + + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_size_t<0>>)); + + BOOST_TEST_TRAIT_TRUE((mp_valid, mp_size_t<0>>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_size_t<1>>)); + + BOOST_TEST_TRAIT_TRUE((mp_valid, mp_size_t<0>>)); + BOOST_TEST_TRAIT_TRUE((mp_valid, mp_size_t<1>>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_size_t<2>>)); + + return boost::report_errors(); +}