mirror of
https://github.com/quizhizhe/LiteLoaderBDS-1.16.40.git
synced 2025-06-05 03:43:40 +00:00
107 lines
2.6 KiB
C++
107 lines
2.6 KiB
C++
#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 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;
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|