libshit

Just some random shit
git clone https://git.neptards.moe/neptards/libshit.git
Log | Files | Refs | Submodules | README | LICENSE

tuple (1456B)


      1 // -*- c++ -*-
      2 #pragma once
      3 
      4 #include <type_traits>
      5 #include <xutility>
      6 #include <new>
      7 
      8 // replace "tuple()" with "constexpr tuple()", but leave other tuple ctors...
      9 // http://stackoverflow.com/a/21371401
     10 #define __GET_MACRO(_0, _1, _2, _3, _4, NAME, ...) NAME
     11 #define tuple(...) \
     12   __GET_MACRO(_0, ##__VA_ARGS__, tuple, tuple, tuple, tuple, constexpr tuple) \
     13   (__VA_ARGS__)
     14 
     15 // remove explicit from direct ctor (this is not c++17 compatible, but the
     16 // libc++ builds should catch this problem)
     17 #pragma push_macro("explicit")
     18 #define explicit _Pragma("pop_macro(\"explicit\")")
     19 #pragma push_macro("explicit")
     20 #define explicit explicit _Pragma("pop_macro(\"explicit\")")
     21 #pragma push_macro("explicit")
     22 #define explicit explicit _Pragma("pop_macro(\"explicit\")")
     23 
     24 #include_next <tuple>
     25 
     26 #undef tuple
     27 #undef __GET_MACRO
     28 
     29 namespace std
     30 {
     31 
     32   template <typename T>
     33   inline constexpr size_t tuple_size_v = tuple_size<T>::value;
     34 
     35   template <std::size_t I, typename T>
     36   using tuple_element_t = typename tuple_element<I, T>::type;
     37 
     38 
     39   namespace detail
     40   {
     41     template <typename T, typename Tuple, size_t... I>
     42     constexpr T make_from_tuple_impl(Tuple&& t, index_sequence<I...>)
     43     { return T(get<I>(std::forward<Tuple>(t))...); }
     44   }
     45 
     46   template <typename T, typename Tuple>
     47   constexpr T make_from_tuple(Tuple&& t)
     48   {
     49     return detail::make_from_tuple_impl<T>(
     50       forward<Tuple>(t),
     51       make_index_sequence<tuple_size_v<decay_t<Tuple>>>{});
     52   }
     53 }