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
 | 
						|
 |