8#ifndef ADOBE_FUNCTIONAL_HPP
9#define ADOBE_FUNCTIONAL_HPP
18#include <boost/compressed_pair.hpp>
139 template <
typename U>
141 return data_m.first()(data_m.second()(x));
144 template <
typename U>
146 return data_m.first()(data_m.second()(x));
150 boost::compressed_pair<F, G> data_m;
170 template <
typename T,
typename U>
172 return f(
g(x),
h(y));
175 template <
typename T,
typename U>
177 return f(
g(x),
h(y));
188template <std::
size_t I,
class T>
193template <std::
size_t I,
class T =
void>
196 return std::get<I>(x);
199 auto operator()(
const T& x)
const ->
const std::tuple_element_t<I, T>& {
200 return std::get<I>(x);
204template <std::
size_t I>
208 return std::get<I>(x);
212 auto operator()(
const T& x)
const ->
const std::tuple_element_t<I, T>& {
213 return std::get<I>(x);
226template <
class Result>
236#if !defined(ADOBE_NO_DOCUMENTATION)
249template <
class T,
typename R,
class Compare>
253 bool operator()(
const T& x,
const T& y)
const {
return compare_m(x.*member_m, y.*member_m); }
255 bool operator()(
const T& x,
const R& y)
const {
return compare_m(x.*member_m, y); }
257 bool operator()(
const R& x,
const T& y)
const {
return compare_m(x, y.*member_m); }
268template <
class T,
typename R>
273template <
class T,
typename R,
class Compare>
280template <
class T,
typename R>
288 const R&
operator()(
const T& x)
const {
return x.*member_m; }
294template <
class T,
typename R>
298 const R&
operator()(
const T& x)
const {
return x.*member_m; }
304template <
class T,
typename R>
317 const typename O::second_argument_type& y)
const {
318 return !o_m(x, y) && !o_m(y, x);
343 template <
class T1,
class T2>
344 auto operator()(T1&& x, T2&& y)
const&
noexcept(std::is_nothrow_invocable_v<const F&, T2, T1>) {
345 return function(std::forward<T2>(y), std::forward<T1>(x));
348 template <
class T1,
class T2>
349 auto operator()(T1&& x, T2&& y) &
noexcept(std::is_nothrow_invocable_v<F&, T2, T1>) {
350 return function(std::forward<T2>(y), std::forward<T1>(x));
353 template <
class T1,
class T2>
354 auto operator()(T1&& x, T2&& y) &&
noexcept(std::is_nothrow_invocable_v<F&&, T2, T1>) {
355 return std::move(
function)(std::forward<T2>(y), std::forward<T1>(x));
360using transposer [[deprecated(
"Use `adobe::transpose` instead.")]] = transpose<F>;
unary_compose< F, G > compose(F f, G g)
auto f_transpose(F f) -> transpose< F >
mem_data_t< T, R > mem_data(R T::*member)
std::tuple_element< I, T > element
Deprecated, use std::tuple_element instead.
compare_members_t< T, R, std::less< R > > compare_members(R T::*member)
bool operator()(const T &) const
result_type operator()(T &x, U &y) const
F::result_type result_type
result_type operator()(const T &x, const U &y) const
Utility class for adobe::compare_members.
bool operator()(const R &x, const T &y) const
bool operator()(const T &x, const T &y) const
compare_members_t(R T::*member, Compare compare)
bool operator()(const T &x, const R &y) const
bool operator()(const typename O::first_argument_type &x, const typename O::second_argument_type &y) const
A function object for value generation within a domain.
auto operator()(T &x) const -> std::tuple_element_t< I, T > &
auto operator()(const T &x) const -> const std::tuple_element_t< I, T > &
auto operator()(const T &x) const -> const std::tuple_element_t< I, T > &
auto operator()(T &x) const -> std::tuple_element_t< I, T > &
const R & operator()(const T &x) const
Adaptor similar to boost::mem_fn() used by std::bind.
const R & operator()(const T &x) const
R & operator()(T &x) const
auto operator()(T1 &&x, T2 &&y) &noexcept(std::is_nothrow_invocable_v< F &, T2, T1 >)
transpose & operator=(transpose &&x) noexcept=default
transpose(F &&f) noexcept
transpose & operator=(const transpose &x)=default
auto operator()(T1 &&x, T2 &&y) const &noexcept(std::is_nothrow_invocable_v< const F &, T2, T1 >)
transpose(const transpose &x)=default
transpose(transpose &&x) noexcept=default
auto operator()(T1 &&x, T2 &&y) &&noexcept(std::is_nothrow_invocable_v< F &&, T2, T1 >)
auto operator()(const U &x) const
auto operator()(U &x) const