22template<std::size_t ...Idx>
25template<std::size_t num, std::size_t ...Idx>
30template<std::size_t ...Idx>
32 using type = std::index_sequence<Idx...>;
43template<std::
size_t Num>
49template <
typename F,
typename Tuple, std::size_t... I>
51 return std::make_tuple(f(std::get<I>(std::forward<Tuple>(t)))...);
59template <
typename F,
typename Tuple>
62 std::make_index_sequence<std::tuple_size<std::remove_reference_t<Tuple>>
::value>{});
73 return std::apply(f, std::forward<
decltype(x)>(x));
79template <
typename First,
typename... Rest>
90template <
typename... T>
100template <
typename... T>
104template <
typename Fun,
typename T>
106 std::optional<T>
fold(
const std::optional<T> &first) {
110 std::optional<T>
fold(
const std::optional<T> &first,
const std::optional<T> &second) {
111 if (first && second) {
112 return m_fun(*first, *second);
120 template <
typename... Rest>
121 std::optional<T>
fold(
const std::optional<T> &first, std::optional<T>
const &second,
const std::optional<Rest> &...rest) {
122 return fold(
fold(first, second), rest...);
135template <
typename Fun,
typename... Args,
144template<
class... Ts>
struct overloaded : Ts... {
using Ts::operator()...; };
149template<
typename Op,
typename Class,
typename MemType,
typename PtrType>
152 template <
typename Object>
155 return op(std::invoke(
ptr, std::forward<Object>(obj)),
value);
162template<
typename Op,
typename Class,
typename MemType,
typename PtrType>
165 template <
typename Object>
168 return op(std::invoke(
ptr, std::forward<Object>(lhs)),
169 std::invoke(
ptr, std::forward<Object>(rhs)));
172 template <
typename Object>
175 return op(std::invoke(
ptr, std::forward<Object>(lhs)),
179 template <
typename Object>
183 std::invoke(
ptr, std::forward<Object>(rhs)));
232template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
238template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
244template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
246 return detail::mem_checker<std::equal_to<>, Class, MemTypeNoRef,
decltype(ptr)>{ptr, std::forward<MemType>(
value)};
250template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
256template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
257inline auto mem_equal_to(MemTypeNoRef (Class::*ptr)() const noexcept, MemType &&
value) {
258 return detail::mem_checker<std::equal_to<>, Class, MemTypeNoRef,
decltype(ptr)>{ptr, std::forward<MemType>(
value)};
268template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
274template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
280template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
281inline auto mem_less(MemTypeNoRef (Class::*ptr)() const, MemType &&
value) {
282 return detail::mem_checker<std::less<>, Class, MemTypeNoRef,
decltype(ptr)>{ptr, std::forward<MemType>(
value)};
286template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
287inline auto mem_less(MemTypeNoRef (Class::*ptr)() noexcept, MemType &&
value) {
292template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
293inline auto mem_less(MemTypeNoRef (Class::*ptr)() const noexcept, MemType &&
value) {
294 return detail::mem_checker<std::less<>, Class, MemTypeNoRef,
decltype(ptr)>{ptr, std::forward<MemType>(
value)};
304template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
310template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
316template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
318 return detail::mem_checker<std::less_equal<>, Class, MemTypeNoRef,
decltype(ptr)>{ptr, std::forward<MemType>(
value)};
322template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
328template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
330 return detail::mem_checker<std::less_equal<>, Class, MemTypeNoRef,
decltype(ptr)>{ptr, std::forward<MemType>(
value)};
340template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
346template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
352template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
353inline auto mem_greater(MemTypeNoRef (Class::*ptr)() const, MemType &&
value) {
354 return detail::mem_checker<std::greater<>, Class, MemTypeNoRef,
decltype(ptr)>{ptr, std::forward<MemType>(
value)};
358template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
364template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
365inline auto mem_greater(MemTypeNoRef (Class::*ptr)() const noexcept, MemType &&
value) {
366 return detail::mem_checker<std::greater<>, Class, MemTypeNoRef,
decltype(ptr)>{ptr, std::forward<MemType>(
value)};
377template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
383template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
389template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
391 return detail::mem_checker<std::greater_equal<>, Class, MemTypeNoRef,
decltype(ptr)>{ptr, std::forward<MemType>(
value)};
395template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
401template<
typename Class,
typename MemType,
typename MemTypeNoRef = std::remove_reference_t<MemType>>
403 return detail::mem_checker<std::greater_equal<>, Class, MemTypeNoRef,
decltype(ptr)>{ptr, std::forward<MemType>(
value)};
447template<
typename Class,
typename MemType>
453template<
typename Class,
typename MemType>
459template<
typename Class,
typename MemType>
460inline auto mem_less(MemType (Class::*ptr)() const) {
461 return detail::mem_compare<std::less<>, Class, MemType,
decltype(ptr)>{ptr};
465template<
typename Class,
typename MemType>
466inline auto mem_less(MemType (Class::*ptr)() noexcept) {
471template<
typename Class,
typename MemType>
472inline auto mem_less(MemType (Class::*ptr)() const noexcept) {
473 return detail::mem_compare<std::less<>, Class, MemType,
decltype(ptr)>{ptr};
482template<
typename Class,
typename MemType>
488template<
typename Class,
typename MemType>
494template<
typename Class,
typename MemType>
496 return detail::mem_compare<std::less_equal<>, Class, MemType,
decltype(ptr)>{ptr};
500template<
typename Class,
typename MemType>
506template<
typename Class,
typename MemType>
507inline auto mem_less_equal(MemType (Class::*ptr)() const noexcept) {
508 return detail::mem_compare<std::less_equal<>, Class, MemType,
decltype(ptr)>{ptr};
518template<
typename Class,
typename MemType>
524template<
typename Class,
typename MemType>
530template<
typename Class,
typename MemType>
531inline auto mem_greater(MemType (Class::*ptr)() const) {
532 return detail::mem_compare<std::greater<>, Class, MemType,
decltype(ptr)>{ptr};
536template<
typename Class,
typename MemType>
542template<
typename Class,
typename MemType>
543inline auto mem_greater(MemType (Class::*ptr)() const noexcept) {
544 return detail::mem_compare<std::greater<>, Class, MemType,
decltype(ptr)>{ptr};
554template<
typename Class,
typename MemType>
560template<
typename Class,
typename MemType>
566template<
typename Class,
typename MemType>
568 return detail::mem_compare<std::greater_equal<>, Class, MemType,
decltype(ptr)>{ptr};
572template<
typename Class,
typename MemType>
578template<
typename Class,
typename MemType>
580 return detail::mem_compare<std::greater_equal<>, Class, MemType,
decltype(ptr)>{ptr};
591 :
m_f(std::forward<F>(f))
595 finally(
const finally &) =
delete;
596 finally(
finally &&) =
delete;
float value(const T *src, size_t ch)
auto apply_to_tuple_impl(F f, Tuple &&t, std::index_sequence< I... >)
std::optional< T > fold_optional(Fun &&fun, Args &&...args)
auto mem_equal_to(MemTypeNoRef Class::*ptr, MemType &&value)
mem_equal_to is an unary functor that compares a member of the object to a given value
auto mem_greater(MemTypeNoRef Class::*ptr, MemType &&value)
mem_greater is an unary functor that compares a member of the object to a given value
auto apply_to_tuple(F f, Tuple &&t)
auto mem_greater_equal(MemTypeNoRef Class::*ptr, MemType &&value)
mem_greater_equal is an unary functor that compares a member of the object to a given value
overloaded(Ts...) -> overloaded< Ts... >
auto mem_less_equal(MemTypeNoRef Class::*ptr, MemType &&value)
mem_less_equal is an unary functor that compares a member of the object to a given value
auto mem_less(MemTypeNoRef Class::*ptr, MemType &&value)
mem_less is an unary functor that compares a member of the object to a given value
constexpr auto unzip_wrapper
typename detail::make_index_sequence_from_1_impl< Num >::type make_index_sequence_from_1
typename first_type< T... >::type first_type_t
std::optional< T > fold(const std::optional< T > &first)
std::optional< T > fold(const std::optional< T > &first, const std::optional< T > &second)
std::optional< T > fold(const std::optional< T > &first, std::optional< T > const &second, const std::optional< Rest > &...rest)
std::index_sequence< Idx... > type
typename make_index_sequence_from_1_impl< num - 1, num, Idx... >::type type
bool operator()(Object &&obj) const
bool operator()(Object &&lhs, Object &&rhs) const
typename detail::first_type_impl< T... >::type type