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