From 61e5bcef2629e2d68b805a956a96fff264d4f74d Mon Sep 17 00:00:00 2001 From: untodesu Date: Sat, 28 Jun 2025 01:59:49 +0500 Subject: Restructure dependencies and update to C++20 - Nuked static_assert from almost everywhere in the project - Nuked binary dependency support. Might add one later though - Separated dependency headers into a separate include subdirectory - Grafted a thirdpartylegalnotices.txt generator from RITEG - Pushed development snapshot version to 2126 (26th week of 2025) --- deps/include/entt/poly/fwd.hpp | 21 --- deps/include/entt/poly/poly.hpp | 310 ---------------------------------------- 2 files changed, 331 deletions(-) delete mode 100644 deps/include/entt/poly/fwd.hpp delete mode 100644 deps/include/entt/poly/poly.hpp (limited to 'deps/include/entt/poly') diff --git a/deps/include/entt/poly/fwd.hpp b/deps/include/entt/poly/fwd.hpp deleted file mode 100644 index 89e2c90..0000000 --- a/deps/include/entt/poly/fwd.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef ENTT_POLY_FWD_HPP -#define ENTT_POLY_FWD_HPP - -#include - -namespace entt { - -// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays, modernize-avoid-c-arrays) -template -class basic_poly; - -/** - * @brief Alias declaration for the most common use case. - * @tparam Concept Concept descriptor. - */ -template -using poly = basic_poly; - -} // namespace entt - -#endif diff --git a/deps/include/entt/poly/poly.hpp b/deps/include/entt/poly/poly.hpp deleted file mode 100644 index 21f57ae..0000000 --- a/deps/include/entt/poly/poly.hpp +++ /dev/null @@ -1,310 +0,0 @@ -#ifndef ENTT_POLY_POLY_HPP -#define ENTT_POLY_POLY_HPP - -#include -#include -#include -#include -#include -#include "../core/any.hpp" -#include "../core/type_info.hpp" -#include "../core/type_traits.hpp" -#include "fwd.hpp" - -namespace entt { - -/*! @brief Inspector class used to infer the type of the virtual table. */ -struct poly_inspector { - /** - * @brief Generic conversion operator (definition only). - * @tparam Type Type to which conversion is requested. - */ - template - operator Type &&() const; - - /** - * @brief Dummy invocation function (definition only). - * @tparam Member Index of the function to invoke. - * @tparam Args Types of arguments to pass to the function. - * @param args The arguments to pass to the function. - * @return A poly inspector convertible to any type. - */ - template - [[nodiscard]] poly_inspector invoke(Args &&...args) const; - - /*! @copydoc invoke */ - template - [[nodiscard]] poly_inspector invoke(Args &&...args); -}; - -/** - * @brief Static virtual table factory. - * @tparam Concept Concept descriptor. - * @tparam Len Size of the storage reserved for the small buffer optimization. - * @tparam Align Alignment requirement. - */ -template -class poly_vtable { - using inspector = typename Concept::template type; - - template - static auto vtable_entry(Ret (*)(inspector &, Args...)) -> Ret (*)(basic_any &, Args...); - - template - static auto vtable_entry(Ret (*)(const inspector &, Args...)) -> Ret (*)(const basic_any &, Args...); - - template - static auto vtable_entry(Ret (*)(Args...)) -> Ret (*)(const basic_any &, Args...); - - template - static auto vtable_entry(Ret (inspector::*)(Args...)) -> Ret (*)(basic_any &, Args...); - - template - static auto vtable_entry(Ret (inspector::*)(Args...) const) -> Ret (*)(const basic_any &, Args...); - - template - static auto make_vtable(value_list) noexcept - -> decltype(std::make_tuple(vtable_entry(Candidate)...)); - - template - [[nodiscard]] static constexpr auto make_vtable(type_list) noexcept { - if constexpr(sizeof...(Func) == 0u) { - return decltype(make_vtable(typename Concept::template impl{})){}; - } else if constexpr((std::is_function_v && ...)) { - return decltype(std::make_tuple(vtable_entry(std::declval())...)){}; - } - } - - template - static void fill_vtable_entry(Ret (*&entry)(Any &, Args...)) noexcept { - if constexpr(std::is_invocable_r_v) { - entry = +[](Any &, Args... args) -> Ret { - return std::invoke(Candidate, std::forward(args)...); - }; - } else { - entry = +[](Any &instance, Args... args) -> Ret { - return static_cast(std::invoke(Candidate, any_cast &>(instance), std::forward(args)...)); - }; - } - } - - template - [[nodiscard]] static auto fill_vtable(std::index_sequence) noexcept { - vtable_type impl{}; - (fill_vtable_entry>>(std::get(impl)), ...); - return impl; - } - - using vtable_type = decltype(make_vtable(Concept{})); - static constexpr bool is_mono_v = std::tuple_size_v == 1u; - -public: - /*! @brief Virtual table type. */ - using type = std::conditional_t, const vtable_type *>; - - /** - * @brief Returns a static virtual table for a specific concept and type. - * @tparam Type The type for which to generate the virtual table. - * @return A static virtual table for the given concept and type. - */ - template - [[nodiscard]] static type instance() noexcept { - static_assert(std::is_same_v>, "Type differs from its decayed form"); - static const vtable_type vtable = fill_vtable(std::make_index_sequence::size>{}); - - if constexpr(is_mono_v) { - return std::get<0>(vtable); - } else { - return &vtable; - } - } -}; - -/** - * @brief Poly base class used to inject functionalities into concepts. - * @tparam Poly The outermost poly class. - */ -template -struct poly_base { - /** - * @brief Invokes a function from the static virtual table. - * @tparam Member Index of the function to invoke. - * @tparam Args Types of arguments to pass to the function. - * @param self A reference to the poly object that made the call. - * @param args The arguments to pass to the function. - * @return The return value of the invoked function, if any. - */ - template - [[nodiscard]] decltype(auto) invoke(const poly_base &self, Args &&...args) const { - const auto &poly = static_cast(self); - - if constexpr(std::is_function_v>) { - return poly.vtable(poly.storage, std::forward(args)...); - } else { - return std::get(*poly.vtable)(poly.storage, std::forward(args)...); - } - } - - /*! @copydoc invoke */ - template - [[nodiscard]] decltype(auto) invoke(poly_base &self, Args &&...args) { - auto &poly = static_cast(self); - - if constexpr(std::is_function_v>) { - static_assert(Member == 0u, "Unknown member"); - return poly.vtable(poly.storage, std::forward(args)...); - } else { - return std::get(*poly.vtable)(poly.storage, std::forward(args)...); - } - } -}; - -/** - * @brief Shortcut for calling `poly_base::invoke`. - * @tparam Member Index of the function to invoke. - * @tparam Poly A fully defined poly object. - * @tparam Args Types of arguments to pass to the function. - * @param self A reference to the poly object that made the call. - * @param args The arguments to pass to the function. - * @return The return value of the invoked function, if any. - */ -template -decltype(auto) poly_call(Poly &&self, Args &&...args) { - return std::forward(self).template invoke(self, std::forward(args)...); -} - -/** - * @brief Static polymorphism made simple and within everyone's reach. - * - * Static polymorphism is a very powerful tool in C++, albeit sometimes - * cumbersome to obtain.
- * This class aims to make it simple and easy to use. - * - * @note - * Both deduced and defined static virtual tables are supported.
- * Moreover, the `poly` class template also works with unmanaged objects. - * - * @tparam Concept Concept descriptor. - * @tparam Len Size of the storage reserved for the small buffer optimization. - * @tparam Align Optional alignment requirement. - */ -template -class basic_poly: private Concept::template type>> { - friend struct poly_base; - -public: - /*! @brief Concept type. */ - using concept_type = typename Concept::template type>; - /*! @brief Virtual table type. */ - using vtable_type = typename poly_vtable::type; - - /*! @brief Default constructor. */ - basic_poly() noexcept = default; - - /** - * @brief Constructs a poly by directly initializing the new object. - * @tparam Type Type of object to use to initialize the poly. - * @tparam Args Types of arguments to use to construct the new instance. - * @param args Parameters to use to construct the instance. - */ - template - explicit basic_poly(std::in_place_type_t, Args &&...args) - : storage{std::in_place_type, std::forward(args)...}, - vtable{poly_vtable::template instance>>()} {} - - /** - * @brief Constructs a poly from a given value. - * @tparam Type Type of object to use to initialize the poly. - * @param value An instance of an object to use to initialize the poly. - */ - template>, basic_poly>>> - basic_poly(Type &&value) noexcept - : basic_poly{std::in_place_type>>, std::forward(value)} {} - - /** - * @brief Returns the object type if any, `type_id()` otherwise. - * @return The object type if any, `type_id()` otherwise. - */ - [[nodiscard]] const type_info &type() const noexcept { - return storage.type(); - } - - /** - * @brief Returns an opaque pointer to the contained instance. - * @return An opaque pointer the contained instance, if any. - */ - [[nodiscard]] const void *data() const noexcept { - return storage.data(); - } - - /*! @copydoc data */ - [[nodiscard]] void *data() noexcept { - return storage.data(); - } - - /** - * @brief Replaces the contained object by creating a new instance directly. - * @tparam Type Type of object to use to initialize the poly. - * @tparam Args Types of arguments to use to construct the new instance. - * @param args Parameters to use to construct the instance. - */ - template - void emplace(Args &&...args) { - storage.template emplace(std::forward(args)...); - vtable = poly_vtable::template instance>>(); - } - - /*! @brief Destroys contained object */ - void reset() { - storage.reset(); - vtable = {}; - } - - /** - * @brief Returns false if a poly is empty, true otherwise. - * @return False if the poly is empty, true otherwise. - */ - [[nodiscard]] explicit operator bool() const noexcept { - return static_cast(storage); - } - - /** - * @brief Returns a pointer to the underlying concept. - * @return A pointer to the underlying concept. - */ - [[nodiscard]] concept_type *operator->() noexcept { - return this; - } - - /*! @copydoc operator-> */ - [[nodiscard]] const concept_type *operator->() const noexcept { - return this; - } - - /** - * @brief Aliasing constructor. - * @return A poly that shares a reference to an unmanaged object. - */ - [[nodiscard]] basic_poly as_ref() noexcept { - basic_poly ref{}; - ref.storage = storage.as_ref(); - ref.vtable = vtable; - return ref; - } - - /*! @copydoc as_ref */ - [[nodiscard]] basic_poly as_ref() const noexcept { - basic_poly ref{}; - ref.storage = storage.as_ref(); - ref.vtable = vtable; - return ref; - } - -private: - basic_any storage{}; - vtable_type vtable{}; -}; - -} // namespace entt - -#endif -- cgit