diff options
| author | untodesu <kirill@untode.su> | 2025-03-15 16:22:09 +0500 |
|---|---|---|
| committer | untodesu <kirill@untode.su> | 2025-03-15 16:22:09 +0500 |
| commit | 3bf42c6ff3805a0d42bbc661794a95ff31bedc26 (patch) | |
| tree | 05049955847504808d6bed2bb7b155f8b03807bb /deps/include/entt/core/utility.hpp | |
| parent | 02294547dcde0d4ad76e229106702261e9f10a51 (diff) | |
| download | voxelius-3bf42c6ff3805a0d42bbc661794a95ff31bedc26.tar.bz2 voxelius-3bf42c6ff3805a0d42bbc661794a95ff31bedc26.zip | |
Add whatever I was working on for the last month
Diffstat (limited to 'deps/include/entt/core/utility.hpp')
| -rw-r--r-- | deps/include/entt/core/utility.hpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/deps/include/entt/core/utility.hpp b/deps/include/entt/core/utility.hpp new file mode 100644 index 0000000..ddab926 --- /dev/null +++ b/deps/include/entt/core/utility.hpp @@ -0,0 +1,101 @@ +#ifndef ENTT_CORE_UTILITY_HPP
+#define ENTT_CORE_UTILITY_HPP
+
+#include <type_traits>
+#include <utility>
+
+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<typename Type>
+ [[nodiscard]] constexpr Type &&operator()(Type &&value) const 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) 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) noexcept {
+ return func;
+}
+
+/**
+ * @brief Helper type for visitors.
+ * @tparam Func Types of function objects.
+ */
+template<typename... Func>
+struct overloaded: Func... {
+ using Func::operator()...;
+};
+
+/**
+ * @brief Deduction guide.
+ * @tparam Func Types of function objects.
+ */
+template<typename... Func>
+overloaded(Func...) -> overloaded<Func...>;
+
+/**
+ * @brief Basic implementation of a y-combinator.
+ * @tparam Func Type of a potentially recursive function.
+ */
+template<typename Func>
+struct y_combinator {
+ /**
+ * @brief Constructs a y-combinator from a given function.
+ * @param recursive A potentially recursive function.
+ */
+ constexpr y_combinator(Func recursive) noexcept(std::is_nothrow_move_constructible_v<Func>)
+ : 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<typename... Args>
+ constexpr decltype(auto) operator()(Args &&...args) const noexcept(std::is_nothrow_invocable_v<Func, const y_combinator &, Args...>) {
+ return func(*this, std::forward<Args>(args)...);
+ }
+
+ /*! @copydoc operator()() */
+ template<typename... Args>
+ constexpr decltype(auto) operator()(Args &&...args) noexcept(std::is_nothrow_invocable_v<Func, y_combinator &, Args...>) {
+ return func(*this, std::forward<Args>(args)...);
+ }
+
+private:
+ Func func;
+};
+
+} // namespace entt
+
+#endif
|
