#ifndef ENTT_CORE_UTILITY_HPP
|
|
#define ENTT_CORE_UTILITY_HPP
|
|
|
|
#include <utility>
|
|
#include "../config/config.h"
|
|
|
|
namespace entt {
|
|
|
|
/*! @brief Identity function object (waiting for C++20). */
|
|
struct identity {
|
|
/*! @brief Indicates that this is a transparent function object. */
|
|
using is_transparent = void;
|
|
|
|
/**
|
|
* @brief Returns its argument unchanged.
|
|
* @tparam Type Type of the argument.
|
|
* @param value The actual argument.
|
|
* @return The submitted value as-is.
|
|
*/
|
|
template<class Type>
|
|
[[nodiscard]] constexpr Type &&operator()(Type &&value) const ENTT_NOEXCEPT {
|
|
return std::forward<Type>(value);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @brief Constant utility to disambiguate overloaded members of a class.
|
|
* @tparam Type Type of the desired overload.
|
|
* @tparam Class Type of class to which the member belongs.
|
|
* @param member A valid pointer to a member.
|
|
* @return Pointer to the member.
|
|
*/
|
|
template<typename Type, typename Class>
|
|
[[nodiscard]] constexpr auto overload(Type Class::*member) ENTT_NOEXCEPT {
|
|
return member;
|
|
}
|
|
|
|
/**
|
|
* @brief Constant utility to disambiguate overloaded functions.
|
|
* @tparam Func Function type of the desired overload.
|
|
* @param func A valid pointer to a function.
|
|
* @return Pointer to the function.
|
|
*/
|
|
template<typename Func>
|
|
[[nodiscard]] constexpr auto overload(Func *func) ENTT_NOEXCEPT {
|
|
return func;
|
|
}
|
|
|
|
/**
|
|
* @brief Helper type for visitors.
|
|
* @tparam Func Types of function objects.
|
|
*/
|
|
template<class... Func>
|
|
struct overloaded: Func... {
|
|
using Func::operator()...;
|
|
};
|
|
|
|
/**
|
|
* @brief Deduction guide.
|
|
* @tparam Func Types of function objects.
|
|
*/
|
|
template<class... Func>
|
|
overloaded(Func...) -> overloaded<Func...>;
|
|
|
|
/**
|
|
* @brief Basic implementation of a y-combinator.
|
|
* @tparam Func Type of a potentially recursive function.
|
|
*/
|
|
template<class Func>
|
|
struct y_combinator {
|
|
/**
|
|
* @brief Constructs a y-combinator from a given function.
|
|
* @param recursive A potentially recursive function.
|
|
*/
|
|
y_combinator(Func recursive)
|
|
: func{std::move(recursive)} {}
|
|
|
|
/**
|
|
* @brief Invokes a y-combinator and therefore its underlying function.
|
|
* @tparam Args Types of arguments to use to invoke the underlying function.
|
|
* @param args Parameters to use to invoke the underlying function.
|
|
* @return Return value of the underlying function, if any.
|
|
*/
|
|
template<class... Args>
|
|
decltype(auto) operator()(Args &&...args) const {
|
|
return func(*this, std::forward<Args>(args)...);
|
|
}
|
|
|
|
/*! @copydoc operator()() */
|
|
template<class... Args>
|
|
decltype(auto) operator()(Args &&...args) {
|
|
return func(*this, std::forward<Args>(args)...);
|
|
}
|
|
|
|
private:
|
|
Func func;
|
|
};
|
|
|
|
} // namespace entt
|
|
|
|
#endif
|