tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TupleUtils.h (1926B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #ifndef DOM_CANVAS_TUPLE_UTILS_H
      6 #define DOM_CANVAS_TUPLE_UTILS_H
      7 
      8 #include <tuple>
      9 
     10 namespace mozilla {
     11 
     12 // -
     13 // ToTupleOfConstRefs
     14 
     15 template <class T>
     16 constexpr const auto& ToConstRef1(T& ret) {
     17  return ret;
     18 }
     19 
     20 template <class Tup, size_t... Ids>
     21 constexpr auto ToTupleOfConstRefsN(const Tup& tup,
     22                                   const std::index_sequence<Ids...>&) {
     23  return std::tie(ToConstRef1(std::get<Ids>(tup))...);
     24 }
     25 
     26 template <class... Args, size_t... Ids, class Tup = std::tuple<Args...>>
     27 constexpr auto ToTupleOfConstRefs(const Tup& tup) {
     28  return ToTupleOfConstRefsN(
     29      tup, std::make_index_sequence<std::tuple_size_v<Tup>>());
     30 }
     31 
     32 // -
     33 // MapTuple
     34 
     35 template <class Tup, class Callable, size_t... Ids>
     36 constexpr auto MapTupleN(Tup&& tup, Callable&& fn,
     37                         const std::index_sequence<Ids...>&) {
     38  return std::make_tuple(fn(std::get<Ids>(tup))...);
     39 }
     40 
     41 /// Callable::operator()(T) cannot return void or you will get weird errors.
     42 template <class... Args, class Callable, class Tup = std::tuple<Args...>>
     43 constexpr auto MapTuple(Tup&& t, Callable&& fn) {
     44  using Tup2 = typename std::remove_reference<Tup>::type;
     45  return MapTupleN(t, fn, std::make_index_sequence<std::tuple_size_v<Tup2>>());
     46 }
     47 
     48 // -
     49 
     50 template <class Tup>
     51 struct SizeofTupleArgs;
     52 
     53 // c++17 fold expressions make this easy, once we pull out the Args parameter
     54 // pack by constraining the default template:
     55 template <class... Args>
     56 struct SizeofTupleArgs<std::tuple<Args...>>
     57    : std::integral_constant<size_t, (... + sizeof(Args))> {};
     58 
     59 static_assert(SizeofTupleArgs<std::tuple<size_t, char, char, char>>::value ==
     60              sizeof(size_t) + 3);
     61 
     62 }  // namespace mozilla
     63 
     64 #endif  // DOM_CANVAS_TUPLE_UTILS_H