Skip to content

Commit

Permalink
pick_var, pick_seq
Browse files Browse the repository at this point in the history
Summary: Variations on existing pick, using type_pack_element for acceleration and minimizing class template instantiations. In particular, `pick_var` is equivalent to existing `pick`, but for now we avoid modifying the existing implementations.

Reviewed By: Alfus

Differential Revision: D37254884

fbshipit-source-id: 5a94df9dba4605a655becb79fdc5b49b403b345e
  • Loading branch information
yfeldblum authored and facebook-github-bot committed Jun 23, 2022
1 parent 9a3ad7f commit 5da126e
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 0 deletions.
31 changes: 31 additions & 0 deletions fatal/type/impl/slice.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,37 @@ using type_pack_element = type_pack_element_fallback<I, Ts...>;

#endif

template <typename List>
struct pick_var_;
template <
template <typename...> class Variadic,
typename... Args
>
struct pick_var_<Variadic<Args...>> {
template <std::size_t i>
using t = type_pack_element<i, Args...>;
template <std::size_t... i>
using apply = Variadic<t<i>...>;
};
template <
template <typename V, V...> class Variadic,
typename T, T... Args
>
struct pick_var_<Variadic<T, Args...>> {
template <std::size_t i>
using t = type_pack_element<i, std::integral_constant<T, Args>...>;
template <std::size_t... i>
using apply = Variadic<T, t<i>::value...>;
};

template <typename Seq>
struct pick_seq_;
template <std::size_t... Indexes>
struct pick_seq_<index_sequence<Indexes...>> {
template <typename List>
using apply = typename pick_var_<List>::template apply<Indexes...>;
};

template <std::size_t, typename> struct a;

template <template <typename> class Single, typename T>
Expand Down
6 changes: 6 additions & 0 deletions fatal/type/slice.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ namespace fatal {

using i_at::type_pack_element;

template <typename List, std::size_t... Indexes>
using pick_var = typename i_at::pick_var_<List>::template apply<Indexes...>;

template <typename List, typename Seq>
using pick_seq = typename i_at::pick_seq_<Seq>::template apply<List>;

template <typename T, std::size_t Index>
using at = typename i_at::a<Index, T>::type;

Expand Down
40 changes: 40 additions & 0 deletions fatal/type/test/slice_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,46 @@ FATAL_TEST(type_pack_element, list) {
FATAL_EXPECT_FALSE((detect_v<test::native_ic, zero>));
}

FATAL_TEST(pick_var, list) {
FATAL_EXPECT_SAME<
pick_var<
list<int, float, char, double, long>,
3, 1
>,
list<double, float>
>();
}

FATAL_TEST(pick_var, seq) {
FATAL_EXPECT_SAME<
pick_var<
char_sequence<'a', 'b', 'c', 'd', 'e'>,
3, 1
>,
char_sequence<'d', 'b'>
>();
}

FATAL_TEST(pick_seq, list) {
FATAL_EXPECT_SAME<
pick_seq<
list<int, float, char, double, long>,
index_sequence<3, 1>
>,
list<double, float>
>();
}

FATAL_TEST(pick_seq, seq) {
FATAL_EXPECT_SAME<
pick_seq<
char_sequence<'a', 'b', 'c', 'd', 'e'>,
index_sequence<3, 1>
>,
char_sequence<'d', 'b'>
>();
}

FATAL_TEST(index_of, list) {
using ls = list<int, double, bool, void, float, char, unsigned>;
FATAL_EXPECT_EQ(0, index_of<ls, int>::value);
Expand Down

0 comments on commit 5da126e

Please sign in to comment.