1 #pragma once 2 3 #include <ciso646> // not 4 #include <cstddef> // size_t 5 #include <type_traits> // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type 6 7 namespace nlohmann 8 { 9 namespace detail 10 { 11 // alias templates to reduce boilerplate 12 template<bool B, typename T = void> 13 using enable_if_t = typename std::enable_if<B, T>::type; 14 15 template<typename T> 16 using uncvref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type; 17 18 // implementation of C++14 index_sequence and affiliates 19 // source: https://stackoverflow.com/a/32223343 20 template<std::size_t... Ints> 21 struct index_sequence 22 { 23 using type = index_sequence; 24 using value_type = std::size_t; sizenlohmann::detail::index_sequence25 static constexpr std::size_t size() noexcept 26 { 27 return sizeof...(Ints); 28 } 29 }; 30 31 template<class Sequence1, class Sequence2> 32 struct merge_and_renumber; 33 34 template<std::size_t... I1, std::size_t... I2> 35 struct merge_and_renumber<index_sequence<I1...>, index_sequence<I2...>> 36 : index_sequence < I1..., (sizeof...(I1) + I2)... > {}; 37 38 template<std::size_t N> 39 struct make_index_sequence 40 : merge_and_renumber < typename make_index_sequence < N / 2 >::type, 41 typename make_index_sequence < N - N / 2 >::type > {}; 42 43 template<> struct make_index_sequence<0> : index_sequence<> {}; 44 template<> struct make_index_sequence<1> : index_sequence<0> {}; 45 46 template<typename... Ts> 47 using index_sequence_for = make_index_sequence<sizeof...(Ts)>; 48 49 // dispatch utility (taken from ranges-v3) 50 template<unsigned N> struct priority_tag : priority_tag < N - 1 > {}; 51 template<> struct priority_tag<0> {}; 52 53 // taken from ranges-v3 54 template<typename T> 55 struct static_const 56 { 57 static constexpr T value{}; 58 }; 59 60 template<typename T> 61 constexpr T static_const<T>::value; 62 } // namespace detail 63 } // namespace nlohmann 64