| /*============================================================================= |
| 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 |
| |