forked from boostorg/mp11
Make mp_for_each constexpr under C++14
This commit is contained in:
@@ -9,10 +9,17 @@
|
|||||||
// http://www.boost.org/LICENSE_1_0.txt
|
// http://www.boost.org/LICENSE_1_0.txt
|
||||||
|
|
||||||
#include <boost/mp11/integral.hpp>
|
#include <boost/mp11/integral.hpp>
|
||||||
|
#include <boost/config.hpp>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#if !defined( BOOST_NO_CXX14_CONSTEXPR )
|
||||||
|
# define BOOST_MP11_CONSTEXPR14 constexpr
|
||||||
|
#else
|
||||||
|
# define BOOST_MP11_CONSTEXPR14
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
namespace mp11
|
namespace mp11
|
||||||
@@ -23,7 +30,7 @@ namespace detail
|
|||||||
|
|
||||||
template<std::size_t N> struct mp_for_index_impl_
|
template<std::size_t N> struct mp_for_index_impl_
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -55,7 +62,7 @@ template<> struct mp_for_index_impl_<0>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<1>
|
template<> struct mp_for_index_impl_<1>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
return std::forward<F>(f)( mp_size_t<K+0>() );
|
return std::forward<F>(f)( mp_size_t<K+0>() );
|
||||||
}
|
}
|
||||||
@@ -63,7 +70,7 @@ template<> struct mp_for_index_impl_<1>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<2>
|
template<> struct mp_for_index_impl_<2>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -75,7 +82,7 @@ template<> struct mp_for_index_impl_<2>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<3>
|
template<> struct mp_for_index_impl_<3>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -88,7 +95,7 @@ template<> struct mp_for_index_impl_<3>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<4>
|
template<> struct mp_for_index_impl_<4>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -102,7 +109,7 @@ template<> struct mp_for_index_impl_<4>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<5>
|
template<> struct mp_for_index_impl_<5>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -117,7 +124,7 @@ template<> struct mp_for_index_impl_<5>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<6>
|
template<> struct mp_for_index_impl_<6>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -133,7 +140,7 @@ template<> struct mp_for_index_impl_<6>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<7>
|
template<> struct mp_for_index_impl_<7>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -150,7 +157,7 @@ template<> struct mp_for_index_impl_<7>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<8>
|
template<> struct mp_for_index_impl_<8>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -168,7 +175,7 @@ template<> struct mp_for_index_impl_<8>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<9>
|
template<> struct mp_for_index_impl_<9>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -187,7 +194,7 @@ template<> struct mp_for_index_impl_<9>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<10>
|
template<> struct mp_for_index_impl_<10>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -207,7 +214,7 @@ template<> struct mp_for_index_impl_<10>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<11>
|
template<> struct mp_for_index_impl_<11>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -228,7 +235,7 @@ template<> struct mp_for_index_impl_<11>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<12>
|
template<> struct mp_for_index_impl_<12>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -250,7 +257,7 @@ template<> struct mp_for_index_impl_<12>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<13>
|
template<> struct mp_for_index_impl_<13>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -273,7 +280,7 @@ template<> struct mp_for_index_impl_<13>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<14>
|
template<> struct mp_for_index_impl_<14>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -297,7 +304,7 @@ template<> struct mp_for_index_impl_<14>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<15>
|
template<> struct mp_for_index_impl_<15>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -322,7 +329,7 @@ template<> struct mp_for_index_impl_<15>
|
|||||||
|
|
||||||
template<> struct mp_for_index_impl_<16>
|
template<> struct mp_for_index_impl_<16>
|
||||||
{
|
{
|
||||||
template<std::size_t K, class F> static decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
switch( i )
|
switch( i )
|
||||||
{
|
{
|
||||||
@@ -348,17 +355,19 @@ template<> struct mp_for_index_impl_<16>
|
|||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
template<std::size_t N, class F> inline decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) mp_for_index( std::size_t i, F && f )
|
template<std::size_t N, class F> inline BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) mp_for_index( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
assert( i < N );
|
assert( i < N );
|
||||||
return detail::mp_for_index_impl_<N>::template call<0>( i, std::forward<F>(f) );
|
return detail::mp_for_index_impl_<N>::template call<0>( i, std::forward<F>(f) );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class N, class F> inline decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) mp_for_index( std::size_t i, F && f )
|
template<class N, class F> inline BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) mp_for_index( std::size_t i, F && f )
|
||||||
{
|
{
|
||||||
return mp_for_index<N::value>( i, std::forward<F>(f) );
|
return mp_for_index<N::value>( i, std::forward<F>(f) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef BOOST_MP11_CONSTEXPR14
|
||||||
|
|
||||||
} // namespace mp11
|
} // namespace mp11
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
|
@@ -72,6 +72,7 @@ run mp_for_each.cpp : : : $(REQ) ;
|
|||||||
run mp_insert.cpp : : : $(REQ) ;
|
run mp_insert.cpp : : : $(REQ) ;
|
||||||
run mp_erase.cpp : : : $(REQ) ;
|
run mp_erase.cpp : : : $(REQ) ;
|
||||||
run mp_for_index.cpp : : : $(REQ) ;
|
run mp_for_index.cpp : : : $(REQ) ;
|
||||||
|
run mp_for_index_cx.cpp : : : $(REQ) ;
|
||||||
|
|
||||||
# integral
|
# integral
|
||||||
run integral.cpp : : : $(REQ) ;
|
run integral.cpp : : : $(REQ) ;
|
||||||
|
41
test/mp_for_index_cx.cpp
Normal file
41
test/mp_for_index_cx.cpp
Normal file
@@ -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 <boost/config.hpp>
|
||||||
|
|
||||||
|
#if defined( BOOST_NO_CXX14_CONSTEXPR )
|
||||||
|
|
||||||
|
int main() {}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <boost/mp11/algorithm.hpp>
|
||||||
|
#include <boost/core/lightweight_test.hpp>
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
#include <boost/detail/workaround.hpp>
|
||||||
|
|
||||||
|
using boost::mp11::mp_size_t;
|
||||||
|
using boost::mp11::mp_for_index;
|
||||||
|
|
||||||
|
struct F
|
||||||
|
{
|
||||||
|
template<std::size_t I> constexpr std::size_t operator()( mp_size_t<I> ) 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
|
Reference in New Issue
Block a user