utility (1647B)
1 // -*- c++ -*- 2 #pragma once 3 4 #pragma push_macro("tuple_size") 5 #define tuple_size tuple_size; \ 6 template <typename _Tuple> struct stupid_microsoft \ 7 _Pragma("pop_macro(\"tuple_size\")") 8 #include_next <utility> 9 10 namespace std 11 { 12 13 template <typename T, T... Vals> 14 struct integer_sequence {}; 15 16 template <size_t... Vals> 17 using index_sequence = integer_sequence<size_t, Vals...>; 18 19 20 // use clang builtin: 21 // http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20151102/142408.html 22 template <typename T, T N> 23 using make_integer_sequence = __make_integer_seq<integer_sequence, T, N>; 24 25 template <size_t N> 26 using make_index_sequence = make_integer_sequence<size_t, N>; 27 28 template <typename... Args> 29 using index_sequence_for = make_index_sequence<sizeof...(Args)>; 30 31 32 // in-place construction 33 struct in_place_t 34 { 35 explicit in_place_t() = default; 36 }; 37 inline constexpr in_place_t in_place{}; 38 39 template<class T> struct in_place_type_t 40 { 41 explicit in_place_type_t() = default; 42 }; 43 template<class T> inline constexpr in_place_type_t<T> in_place_type{}; 44 45 template<size_t I> struct in_place_index_t 46 { 47 explicit in_place_index_t() = default; 48 }; 49 template<size_t I> inline constexpr in_place_index_t<I> in_place_index{}; 50 51 // as_const 52 template <typename T> 53 constexpr std::add_const_t<T>& as_const(T& t) noexcept { return t; } 54 template <typename T> void as_const(T&& t) noexcept = delete; 55 56 // exchange 57 template <typename T, typename U = T> 58 constexpr T exchange(T& obj, U&& new_val) 59 { 60 T old = std::move(obj); 61 obj = std::forward<U>(new_val); 62 return old; 63 } 64 }