diff --git a/include/boost/mp11/detail/mp_for_index.hpp b/include/boost/mp11/detail/mp_for_index.hpp index 85f3c45..88a3293 100644 --- a/include/boost/mp11/detail/mp_for_index.hpp +++ b/include/boost/mp11/detail/mp_for_index.hpp @@ -9,10 +9,17 @@ // http://www.boost.org/LICENSE_1_0.txt #include +#include #include #include #include +#if !defined( BOOST_NO_CXX14_CONSTEXPR ) +# define BOOST_MP11_CONSTEXPR14 constexpr +#else +# define BOOST_MP11_CONSTEXPR14 +#endif + namespace boost { namespace mp11 @@ -23,7 +30,7 @@ namespace detail template struct mp_for_index_impl_ { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -55,7 +62,7 @@ template<> struct mp_for_index_impl_<0> template<> struct mp_for_index_impl_<1> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { return std::forward(f)( mp_size_t() ); } @@ -63,7 +70,7 @@ template<> struct mp_for_index_impl_<1> template<> struct mp_for_index_impl_<2> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -75,7 +82,7 @@ template<> struct mp_for_index_impl_<2> template<> struct mp_for_index_impl_<3> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -88,7 +95,7 @@ template<> struct mp_for_index_impl_<3> template<> struct mp_for_index_impl_<4> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -102,7 +109,7 @@ template<> struct mp_for_index_impl_<4> template<> struct mp_for_index_impl_<5> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -117,7 +124,7 @@ template<> struct mp_for_index_impl_<5> template<> struct mp_for_index_impl_<6> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -133,7 +140,7 @@ template<> struct mp_for_index_impl_<6> template<> struct mp_for_index_impl_<7> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -150,7 +157,7 @@ template<> struct mp_for_index_impl_<7> template<> struct mp_for_index_impl_<8> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -168,7 +175,7 @@ template<> struct mp_for_index_impl_<8> template<> struct mp_for_index_impl_<9> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -187,7 +194,7 @@ template<> struct mp_for_index_impl_<9> template<> struct mp_for_index_impl_<10> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -207,7 +214,7 @@ template<> struct mp_for_index_impl_<10> template<> struct mp_for_index_impl_<11> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -228,7 +235,7 @@ template<> struct mp_for_index_impl_<11> template<> struct mp_for_index_impl_<12> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -250,7 +257,7 @@ template<> struct mp_for_index_impl_<12> template<> struct mp_for_index_impl_<13> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -273,7 +280,7 @@ template<> struct mp_for_index_impl_<13> template<> struct mp_for_index_impl_<14> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -297,7 +304,7 @@ template<> struct mp_for_index_impl_<14> template<> struct mp_for_index_impl_<15> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -322,7 +329,7 @@ template<> struct mp_for_index_impl_<15> template<> struct mp_for_index_impl_<16> { - template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { @@ -348,17 +355,19 @@ template<> struct mp_for_index_impl_<16> } // namespace detail -template inline decltype(std::declval()(std::declval>())) mp_for_index( std::size_t i, F && f ) +template inline BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) mp_for_index( std::size_t i, F && f ) { assert( i < N ); return detail::mp_for_index_impl_::template call<0>( i, std::forward(f) ); } -template inline decltype(std::declval()(std::declval>())) mp_for_index( std::size_t i, F && f ) +template inline BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) mp_for_index( std::size_t i, F && f ) { return mp_for_index( i, std::forward(f) ); } +#undef BOOST_MP11_CONSTEXPR14 + } // namespace mp11 } // namespace boost diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index c9b8fc8..f5c3753 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -72,6 +72,7 @@ run mp_for_each.cpp : : : $(REQ) ; run mp_insert.cpp : : : $(REQ) ; run mp_erase.cpp : : : $(REQ) ; run mp_for_index.cpp : : : $(REQ) ; +run mp_for_index_cx.cpp : : : $(REQ) ; # integral run integral.cpp : : : $(REQ) ; diff --git a/test/mp_for_index_cx.cpp b/test/mp_for_index_cx.cpp new file mode 100644 index 0000000..db8d180 --- /dev/null +++ b/test/mp_for_index_cx.cpp @@ -0,0 +1,41 @@ + +// Copyright 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 + +#if defined( BOOST_NO_CXX14_CONSTEXPR ) + +int main() {} + +#else + +#include +#include +#include +#include + +using boost::mp11::mp_size_t; +using boost::mp11::mp_for_index; + +struct F +{ + template constexpr std::size_t operator()( mp_size_t ) const + { + return I; + } +}; + +#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) + +int main() +{ + constexpr std::size_t i = mp_for_index<64>( 57, F{} ); + STATIC_ASSERT( i == 57 ); +} + +#endif