80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*=============================================================================
 | |
|     Copyright (c) 2015 Agustin K-ballo Berge
 | |
|     Copyright (c) 2015 Kohei Takahashi
 | |
| 
 | |
|     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)
 | |
| ==============================================================================*/
 | |
| 
 | |
| #ifndef BOOST_FUSION_SUPPORT_DETAIL_INDEX_SEQUENCE_06232015_1038
 | |
| #define BOOST_FUSION_SUPPORT_DETAIL_INDEX_SEQUENCE_06232015_1038
 | |
| 
 | |
| #include <boost/fusion/support/config.hpp>
 | |
| #include <cstddef>
 | |
| 
 | |
| // GCC5 has O(logN) implementation, see https://gcc.gnu.org/PR66059 .
 | |
| #if (defined(__cpp_lib_integer_sequence) && __cpp_lib_integer_sequence >= 201304) \
 | |
|  || (defined(BOOST_LIBSTDCXX_VERSION) \
 | |
|      && BOOST_LIBSTDCXX_VERSION >= 500000 && __cplusplus >= 201402)
 | |
| #include <utility>
 | |
| #define BOOST_FUSION_STDLIB_HAS_INTEGER_SEQUENCE
 | |
| #endif
 | |
| 
 | |
| namespace boost { namespace fusion { namespace detail
 | |
| {
 | |
| #ifdef BOOST_FUSION_STDLIB_HAS_INTEGER_SEQUENCE
 | |
|     // Use aliasing templates without checking availability, the compiler should work.
 | |
|     template <std::size_t ...Ints>
 | |
|     using index_sequence = std::index_sequence<Ints...>;
 | |
| 
 | |
|     template <std::size_t N>
 | |
|     struct make_index_sequence
 | |
|     {
 | |
|         using type = std::make_index_sequence<N>;
 | |
|     };
 | |
| #else
 | |
|     template <std::size_t ...Ints>
 | |
|     struct index_sequence
 | |
|     {
 | |
|         typedef std::size_t value_type;
 | |
| 
 | |
|         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
 | |
|         static std::size_t size() BOOST_NOEXCEPT
 | |
|         { return sizeof...(Ints); }
 | |
| 
 | |
|         // non standard extension
 | |
|         typedef index_sequence type;
 | |
|     };
 | |
| 
 | |
|     template <typename Left, typename Right>
 | |
|     struct _make_index_sequence_join;
 | |
| 
 | |
|     template <std::size_t... Left, std::size_t... Right>
 | |
|     struct _make_index_sequence_join<
 | |
|         index_sequence<Left...>, index_sequence<Right...>
 | |
|     > : index_sequence<Left..., (sizeof...(Left) + Right)...>
 | |
|     {};
 | |
| 
 | |
|     template <std::size_t N>
 | |
|     struct make_index_sequence
 | |
|       : _make_index_sequence_join<
 | |
|             typename make_index_sequence<N / 2>::type
 | |
|           , typename make_index_sequence<N - N / 2>::type
 | |
|         >
 | |
|     {};
 | |
| 
 | |
|     template <>
 | |
|     struct make_index_sequence<1>
 | |
|       : index_sequence<0>
 | |
|     {};
 | |
| 
 | |
|     template <>
 | |
|     struct make_index_sequence<0>
 | |
|       : index_sequence<>
 | |
|     {};
 | |
| #endif
 | |
| }}}
 | |
| 
 | |
| #endif
 | |
| 
 | 
