You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.3 KiB
80 lines
2.3 KiB
3 years ago
|
/*=============================================================================
|
||
|
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
|
||
|
|