mp11
mp11 copied to clipboard
Maybe add mp_set_find
In cases a list is a set it is possible to do mp_find quicker. Is it worth to add this?
template <class S>
using mp_enumerate = mp_transform<mp_list, S, mp_iota<mp_size<S>>>;
template <class S, class V>
using mp_set_find = mp_second<mp_map_find<mp_enumerate<S>, V>>;
Probably makes sense for completeness. I wonder what's the actual difference in performance in 2024 compared to mp_find, though.
The speedup isn't huge with modern gcc/clang. With icx 2024.1 I get for
using S = mp_iota_c<100>;
template <class S>
using mp_enumerate = mp_transform<mp_list, S, mp_iota<mp_size<S>>>;
using E = mp_enumerate<S>;
template <class S, class V>
using mp_set_find = mp_second<mp_map_find<E, V>>;
// using mp_set_find = mp_find<S,V>;
template<class A, class B> using F = mp_less<mp_set_find<S, A>, mp_set_find<S, B>>;
static_assert(std::is_same_v<mp_sort<S, F>, S>);
1.6s for mp_set_find and 2.2s for mp_find.
I think this is an improvement that justifies having mp_set_find.
I'd like to add mp_enumerate as well, but most other languages (and std::views::enumerate) put the index first, not second. (Which is actually what mp_at uses.)