libshit

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

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 }