#ifndef BOOST_MP11_DETAIL_MP_FOR_INDEX_HPP_INCLUDED #define BOOST_MP11_DETAIL_MP_FOR_INDEX_HPP_INCLUDED // 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 #include #include #include namespace boost { namespace mp11 { namespace detail { template struct mp_for_index_impl_ { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); case 8: return std::forward(f)( mp_size_t() ); case 9: return std::forward(f)( mp_size_t() ); case 10: return std::forward(f)( mp_size_t() ); case 11: return std::forward(f)( mp_size_t() ); case 12: return std::forward(f)( mp_size_t() ); case 13: return std::forward(f)( mp_size_t() ); case 14: return std::forward(f)( mp_size_t() ); case 15: return std::forward(f)( mp_size_t() ); } return mp_for_index_impl_::template call( i-16, std::forward(f) ); } }; 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 ) { return std::forward(f)( mp_size_t() ); } }; template<> struct mp_for_index_impl_<2> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<3> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<4> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<5> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<6> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<7> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<8> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<9> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<10> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); case 8: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<11> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); case 8: return std::forward(f)( mp_size_t() ); case 9: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<12> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); case 8: return std::forward(f)( mp_size_t() ); case 9: return std::forward(f)( mp_size_t() ); case 10: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<13> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); case 8: return std::forward(f)( mp_size_t() ); case 9: return std::forward(f)( mp_size_t() ); case 10: return std::forward(f)( mp_size_t() ); case 11: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<14> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); case 8: return std::forward(f)( mp_size_t() ); case 9: return std::forward(f)( mp_size_t() ); case 10: return std::forward(f)( mp_size_t() ); case 11: return std::forward(f)( mp_size_t() ); case 12: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<15> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); case 8: return std::forward(f)( mp_size_t() ); case 9: return std::forward(f)( mp_size_t() ); case 10: return std::forward(f)( mp_size_t() ); case 11: return std::forward(f)( mp_size_t() ); case 12: return std::forward(f)( mp_size_t() ); case 13: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; template<> struct mp_for_index_impl_<16> { template static decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { switch( i ) { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); case 8: return std::forward(f)( mp_size_t() ); case 9: return std::forward(f)( mp_size_t() ); case 10: return std::forward(f)( mp_size_t() ); case 11: return std::forward(f)( mp_size_t() ); case 12: return std::forward(f)( mp_size_t() ); case 13: return std::forward(f)( mp_size_t() ); case 14: return std::forward(f)( mp_size_t() ); default: return std::forward(f)( mp_size_t() ); } } }; } // namespace detail template inline decltype(std::declval()(std::declval>())) mp_for_index_c( 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 ) { return mp_for_index_c( i, std::forward(f) ); } } // namespace mp11 } // namespace boost #endif // #ifndef BOOST_MP11_DETAIL_MP_FIND_INDEX_HPP_INCLUDED