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/core/any.hpp | 513 ----------------------------------------- 1 file changed, 513 deletions(-) delete mode 100644 deps/include/entt/core/any.hpp (limited to 'deps/include/entt/core/any.hpp') diff --git a/deps/include/entt/core/any.hpp b/deps/include/entt/core/any.hpp deleted file mode 100644 index 9707996..0000000 --- a/deps/include/entt/core/any.hpp +++ /dev/null @@ -1,513 +0,0 @@ -#ifndef ENTT_CORE_ANY_HPP -#define ENTT_CORE_ANY_HPP - -#include -#include -#include -#include -#include "../config/config.h" -#include "../core/utility.hpp" -#include "fwd.hpp" -#include "type_info.hpp" -#include "type_traits.hpp" - -namespace entt { - -/*! @cond TURN_OFF_DOXYGEN */ -namespace internal { - -enum class any_operation : std::uint8_t { - copy, - move, - transfer, - assign, - destroy, - compare, - get -}; - -} // namespace internal -/*! @endcond */ - -/*! @brief Possible modes of an any object. */ -enum class any_policy : std::uint8_t { - /*! @brief Default mode, the object owns the contained element. */ - owner, - /*! @brief Aliasing mode, the object _points_ to a non-const element. */ - ref, - /*! @brief Const aliasing mode, the object _points_ to a const element. */ - cref -}; - -/** - * @brief A SBO friendly, type-safe container for single values of any type. - * @tparam Len Size of the storage reserved for the small buffer optimization. - * @tparam Align Optional alignment requirement. - */ -template -class basic_any { - using operation = internal::any_operation; - using vtable_type = const void *(const operation, const basic_any &, const void *); - - struct storage_type { - // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays, modernize-avoid-c-arrays) - alignas(Align) std::byte data[Len + !Len]; - }; - - template - static constexpr bool in_situ = Len && alignof(Type) <= Align && sizeof(Type) <= Len && std::is_nothrow_move_constructible_v; - - template - static const void *basic_vtable(const operation op, const basic_any &value, const void *other) { - static_assert(!std::is_void_v && std::is_same_v>, Type>, "Invalid type"); - const Type *elem = nullptr; - - if constexpr(in_situ) { - elem = (value.mode == any_policy::owner) ? reinterpret_cast(&value.storage) : static_cast(value.instance); - } else { - elem = static_cast(value.instance); - } - - switch(op) { - case operation::copy: - if constexpr(std::is_copy_constructible_v) { - static_cast(const_cast(other))->initialize(*elem); - } - break; - case operation::move: - if constexpr(in_situ) { - if(value.mode == any_policy::owner) { - return ::new(&static_cast(const_cast(other))->storage) Type{std::move(*const_cast(elem))}; - } - } - - return (static_cast(const_cast(other))->instance = std::exchange(const_cast(value).instance, nullptr)); - case operation::transfer: - if constexpr(std::is_move_assignable_v) { - *const_cast(elem) = std::move(*static_cast(const_cast(other))); - return other; - } - [[fallthrough]]; - case operation::assign: - if constexpr(std::is_copy_assignable_v) { - *const_cast(elem) = *static_cast(other); - return other; - } - break; - case operation::destroy: - if constexpr(in_situ) { - elem->~Type(); - } else if constexpr(std::is_array_v) { - delete[] elem; - } else { - delete elem; - } - break; - case operation::compare: - if constexpr(!std::is_function_v && !std::is_array_v && is_equality_comparable_v) { - return *elem == *static_cast(other) ? other : nullptr; - } else { - return (elem == other) ? other : nullptr; - } - case operation::get: - return elem; - } - - return nullptr; - } - - template - void initialize([[maybe_unused]] Args &&...args) { - using plain_type = std::remove_cv_t>; - info = &type_id(); - - if constexpr(!std::is_void_v) { - vtable = basic_vtable; - - if constexpr(std::is_lvalue_reference_v) { - static_assert((std::is_lvalue_reference_v && ...) && (sizeof...(Args) == 1u), "Invalid arguments"); - mode = std::is_const_v> ? any_policy::cref : any_policy::ref; - instance = (std::addressof(args), ...); - } else if constexpr(in_situ) { - if constexpr(std::is_aggregate_v && (sizeof...(Args) != 0u || !std::is_default_constructible_v)) { - ::new(&storage) plain_type{std::forward(args)...}; - } else { - ::new(&storage) plain_type(std::forward(args)...); - } - } else { - if constexpr(std::is_aggregate_v && (sizeof...(Args) != 0u || !std::is_default_constructible_v)) { - instance = new plain_type{std::forward(args)...}; - } else if constexpr(std::is_array_v) { - static_assert(sizeof...(Args) == 0u, "Invalid arguments"); - instance = new plain_type[std::extent_v](); - } else { - instance = new plain_type(std::forward(args)...); - } - } - } - } - - basic_any(const basic_any &other, const any_policy pol) noexcept - : instance{other.data()}, - info{other.info}, - vtable{other.vtable}, - mode{pol} {} - -public: - /*! @brief Size of the internal storage. */ - static constexpr auto length = Len; - /*! @brief Alignment requirement. */ - static constexpr auto alignment = Align; - - /*! @brief Default constructor. */ - constexpr basic_any() noexcept - : basic_any{std::in_place_type} {} - - /** - * @brief Constructs a wrapper by directly initializing the new object. - * @tparam Type Type of object to use to initialize the wrapper. - * @tparam Args Types of arguments to use to construct the new instance. - * @param args Parameters to use to construct the instance. - */ - template - explicit basic_any(std::in_place_type_t, Args &&...args) - : instance{}, - info{}, - vtable{}, - mode{any_policy::owner} { - initialize(std::forward(args)...); - } - - /** - * @brief Constructs a wrapper from a given value. - * @tparam Type Type of object to use to initialize the wrapper. - * @param value An instance of an object to use to initialize the wrapper. - */ - template, basic_any>>> - basic_any(Type &&value) - : basic_any{std::in_place_type>, std::forward(value)} {} - - /** - * @brief Copy constructor. - * @param other The instance to copy from. - */ - basic_any(const basic_any &other) - : basic_any{} { - if(other.vtable) { - other.vtable(operation::copy, other, this); - } - } - - /** - * @brief Move constructor. - * @param other The instance to move from. - */ - basic_any(basic_any &&other) noexcept - : instance{}, - info{other.info}, - vtable{other.vtable}, - mode{other.mode} { - if(other.vtable) { - other.vtable(operation::move, other, this); - } - } - - /*! @brief Frees the internal storage, whatever it means. */ - ~basic_any() noexcept { - if(vtable && (mode == any_policy::owner)) { - vtable(operation::destroy, *this, nullptr); - } - } - - /** - * @brief Copy assignment operator. - * @param other The instance to copy from. - * @return This any object. - */ - basic_any &operator=(const basic_any &other) { - if(this != &other) { - reset(); - - if(other.vtable) { - other.vtable(operation::copy, other, this); - } - } - - return *this; - } - - /** - * @brief Move assignment operator. - * @param other The instance to move from. - * @return This any object. - */ - basic_any &operator=(basic_any &&other) noexcept { - ENTT_ASSERT(this != &other, "Self move assignment"); - - reset(); - - if(other.vtable) { - other.vtable(operation::move, other, this); - info = other.info; - vtable = other.vtable; - mode = other.mode; - } - - return *this; - } - - /** - * @brief Value assignment operator. - * @tparam Type Type of object to use to initialize the wrapper. - * @param value An instance of an object to use to initialize the wrapper. - * @return This any object. - */ - template, basic_any>>> - basic_any &operator=(Type &&value) { - emplace>(std::forward(value)); - return *this; - } - - /** - * @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 *info; - } - - /** - * @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 vtable ? vtable(operation::get, *this, nullptr) : nullptr; - } - - /** - * @brief Returns an opaque pointer to the contained instance. - * @param req Expected type. - * @return An opaque pointer the contained instance, if any. - */ - [[nodiscard]] const void *data(const type_info &req) const noexcept { - return *info == req ? data() : nullptr; - } - - /** - * @brief Returns an opaque pointer to the contained instance. - * @return An opaque pointer the contained instance, if any. - */ - [[nodiscard]] void *data() noexcept { - return mode == any_policy::cref ? nullptr : const_cast(std::as_const(*this).data()); - } - - /** - * @brief Returns an opaque pointer to the contained instance. - * @param req Expected type. - * @return An opaque pointer the contained instance, if any. - */ - [[nodiscard]] void *data(const type_info &req) noexcept { - return mode == any_policy::cref ? nullptr : const_cast(std::as_const(*this).data(req)); - } - - /** - * @brief Replaces the contained object by creating a new instance directly. - * @tparam Type Type of object to use to initialize the wrapper. - * @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) { - reset(); - initialize(std::forward(args)...); - } - - /** - * @brief Assigns a value to the contained object without replacing it. - * @param other The value to assign to the contained object. - * @return True in case of success, false otherwise. - */ - bool assign(const basic_any &other) { - if(vtable && mode != any_policy::cref && *info == *other.info) { - return (vtable(operation::assign, *this, other.data()) != nullptr); - } - - return false; - } - - /*! @copydoc assign */ - bool assign(basic_any &&other) { - if(vtable && mode != any_policy::cref && *info == *other.info) { - if(auto *val = other.data(); val) { - return (vtable(operation::transfer, *this, val) != nullptr); - } else { - return (vtable(operation::assign, *this, std::as_const(other).data()) != nullptr); - } - } - - return false; - } - - /*! @brief Destroys contained object */ - void reset() { - if(vtable && (mode == any_policy::owner)) { - vtable(operation::destroy, *this, nullptr); - } - - // unnecessary but it helps to detect nasty bugs - ENTT_ASSERT((instance = nullptr) == nullptr, ""); - info = &type_id(); - vtable = nullptr; - mode = any_policy::owner; - } - - /** - * @brief Returns false if a wrapper is empty, true otherwise. - * @return False if the wrapper is empty, true otherwise. - */ - [[nodiscard]] explicit operator bool() const noexcept { - return vtable != nullptr; - } - - /** - * @brief Checks if two wrappers differ in their content. - * @param other Wrapper with which to compare. - * @return False if the two objects differ in their content, true otherwise. - */ - [[nodiscard]] bool operator==(const basic_any &other) const noexcept { - if(vtable && *info == *other.info) { - return (vtable(operation::compare, *this, other.data()) != nullptr); - } - - return (!vtable && !other.vtable); - } - - /** - * @brief Checks if two wrappers differ in their content. - * @param other Wrapper with which to compare. - * @return True if the two objects differ in their content, false otherwise. - */ - [[nodiscard]] bool operator!=(const basic_any &other) const noexcept { - return !(*this == other); - } - - /** - * @brief Aliasing constructor. - * @return A wrapper that shares a reference to an unmanaged object. - */ - [[nodiscard]] basic_any as_ref() noexcept { - return basic_any{*this, (mode == any_policy::cref ? any_policy::cref : any_policy::ref)}; - } - - /*! @copydoc as_ref */ - [[nodiscard]] basic_any as_ref() const noexcept { - return basic_any{*this, any_policy::cref}; - } - - /** - * @brief Returns the current mode of an any object. - * @return The current mode of the any object. - */ - [[nodiscard]] any_policy policy() const noexcept { - return mode; - } - -private: - union { - const void *instance; - storage_type storage; - }; - const type_info *info; - vtable_type *vtable; - any_policy mode; -}; - -/** - * @brief Performs type-safe access to the contained object. - * @tparam Type Type to which conversion is required. - * @tparam Len Size of the storage reserved for the small buffer optimization. - * @tparam Align Alignment requirement. - * @param data Target any object. - * @return The element converted to the requested type. - */ -template -[[nodiscard]] Type any_cast(const basic_any &data) noexcept { - const auto *const instance = any_cast>(&data); - ENTT_ASSERT(instance, "Invalid instance"); - return static_cast(*instance); -} - -/*! @copydoc any_cast */ -template -[[nodiscard]] Type any_cast(basic_any &data) noexcept { - // forces const on non-reference types to make them work also with wrappers for const references - auto *const instance = any_cast>(&data); - ENTT_ASSERT(instance, "Invalid instance"); - return static_cast(*instance); -} - -/*! @copydoc any_cast */ -template -[[nodiscard]] Type any_cast(basic_any &&data) noexcept { - if constexpr(std::is_copy_constructible_v>>) { - if(auto *const instance = any_cast>(&data); instance) { - return static_cast(std::move(*instance)); - } else { - return any_cast(data); - } - } else { - auto *const instance = any_cast>(&data); - ENTT_ASSERT(instance, "Invalid instance"); - return static_cast(std::move(*instance)); - } -} - -/*! @copydoc any_cast */ -template -[[nodiscard]] const Type *any_cast(const basic_any *data) noexcept { - const auto &info = type_id>(); - return static_cast(data->data(info)); -} - -/*! @copydoc any_cast */ -template -[[nodiscard]] Type *any_cast(basic_any *data) noexcept { - if constexpr(std::is_const_v) { - // last attempt to make wrappers for const references return their values - return any_cast(&std::as_const(*data)); - } else { - const auto &info = type_id>(); - return static_cast(data->data(info)); - } -} - -/** - * @brief Constructs a wrapper from a given type, passing it all arguments. - * @tparam Type Type of object to use to initialize the wrapper. - * @tparam Len Size of the storage reserved for the small buffer optimization. - * @tparam Align Optional alignment requirement. - * @tparam Args Types of arguments to use to construct the new instance. - * @param args Parameters to use to construct the instance. - * @return A properly initialized wrapper for an object of the given type. - */ -template::length, std::size_t Align = basic_any::alignment, typename... Args> -[[nodiscard]] basic_any make_any(Args &&...args) { - return basic_any{std::in_place_type, std::forward(args)...}; -} - -/** - * @brief Forwards its argument and avoids copies for lvalue references. - * @tparam Len Size of the storage reserved for the small buffer optimization. - * @tparam Align Optional alignment requirement. - * @tparam Type Type of argument to use to construct the new instance. - * @param value Parameter to use to construct the instance. - * @return A properly initialized and not necessarily owning wrapper. - */ -template::length, std::size_t Align = basic_any::alignment, typename Type> -[[nodiscard]] basic_any forward_as_any(Type &&value) { - return basic_any{std::in_place_type, std::forward(value)}; -} - -} // namespace entt - -#endif -- cgit