#ifndef ENTT_ENTITY_FWD_HPP #define ENTT_ENTITY_FWD_HPP #include #include #include #include "../config/config.h" #include "../core/fwd.hpp" #include "../core/type_traits.hpp" namespace entt { /*! @brief Default entity identifier. */ enum class entity : id_type {}; /*! @brief Storage deletion policy. */ enum class deletion_policy : std::uint8_t { /*! @brief Swap-and-pop deletion policy. */ swap_and_pop = 0u, /*! @brief In-place deletion policy. */ in_place = 1u, /*! @brief Swap-only deletion policy. */ swap_only = 2u }; template> class basic_sparse_set; template, typename = void> class basic_storage; template class basic_sigh_mixin; template> class basic_registry; template class basic_view; template> class basic_runtime_view; template class basic_group; template> class basic_observer; template class basic_organizer; template class basic_handle; template class basic_snapshot; template class basic_snapshot_loader; template class basic_continuous_loader; /*! @brief Alias declaration for the most common use case. */ using sparse_set = basic_sparse_set<>; /** * @brief Alias declaration for the most common use case. * @tparam Type Element type. */ template using storage = basic_storage; /** * @brief Alias declaration for the most common use case. * @tparam Type Underlying storage type. */ template using sigh_mixin = basic_sigh_mixin>; /*! @brief Alias declaration for the most common use case. */ using registry = basic_registry<>; /*! @brief Alias declaration for the most common use case. */ using observer = basic_observer; /*! @brief Alias declaration for the most common use case. */ using organizer = basic_organizer; /*! @brief Alias declaration for the most common use case. */ using handle = basic_handle; /*! @brief Alias declaration for the most common use case. */ using const_handle = basic_handle; /** * @brief Alias declaration for the most common use case. * @tparam Args Other template parameters. */ template using handle_view = basic_handle; /** * @brief Alias declaration for the most common use case. * @tparam Args Other template parameters. */ template using const_handle_view = basic_handle; /*! @brief Alias declaration for the most common use case. */ using snapshot = basic_snapshot; /*! @brief Alias declaration for the most common use case. */ using snapshot_loader = basic_snapshot_loader; /*! @brief Alias declaration for the most common use case. */ using continuous_loader = basic_continuous_loader; /*! @brief Alias declaration for the most common use case. */ using runtime_view = basic_runtime_view; /*! @brief Alias declaration for the most common use case. */ using const_runtime_view = basic_runtime_view; /** * @brief Alias for exclusion lists. * @tparam Type List of types. */ template struct exclude_t final: type_list { /*! @brief Default constructor. */ explicit constexpr exclude_t() = default; }; /** * @brief Variable template for exclusion lists. * @tparam Type List of types. */ template inline constexpr exclude_t exclude{}; /** * @brief Alias for lists of observed elements. * @tparam Type List of types. */ template struct get_t final: type_list { /*! @brief Default constructor. */ explicit constexpr get_t() = default; }; /** * @brief Variable template for lists of observed elements. * @tparam Type List of types. */ template inline constexpr get_t get{}; /** * @brief Alias for lists of owned elements. * @tparam Type List of types. */ template struct owned_t final: type_list { /*! @brief Default constructor. */ explicit constexpr owned_t() = default; }; /** * @brief Variable template for lists of owned elements. * @tparam Type List of types. */ template inline constexpr owned_t owned{}; /** * @brief Applies a given _function_ to a get list and generate a new list. * @tparam Type Types provided by the get list. * @tparam Op Unary operation as template class with a type member named `type`. */ template class Op> struct type_list_transform, Op> { /*! @brief Resulting get list after applying the transform function. */ using type = get_t::type...>; }; /** * @brief Applies a given _function_ to an exclude list and generate a new list. * @tparam Type Types provided by the exclude list. * @tparam Op Unary operation as template class with a type member named `type`. */ template class Op> struct type_list_transform, Op> { /*! @brief Resulting exclude list after applying the transform function. */ using type = exclude_t::type...>; }; /** * @brief Applies a given _function_ to an owned list and generate a new list. * @tparam Type Types provided by the owned list. * @tparam Op Unary operation as template class with a type member named `type`. */ template class Op> struct type_list_transform, Op> { /*! @brief Resulting owned list after applying the transform function. */ using type = owned_t::type...>; }; /** * @brief Provides a common way to define storage types. * @tparam Type Storage value type. * @tparam Entity A valid entity type. * @tparam Allocator Type of allocator used to manage memory and elements. */ template, typename = void> struct storage_type { /*! @brief Type-to-storage conversion result. */ using type = ENTT_STORAGE(sigh_mixin, basic_storage); }; /** * @brief Helper type. * @tparam Args Arguments to forward. */ template using storage_type_t = typename storage_type::type; /** * Type-to-storage conversion utility that preserves constness. * @tparam Type Storage value type, eventually const. * @tparam Entity A valid entity type. * @tparam Allocator Type of allocator used to manage memory and elements. */ template>> struct storage_for { /*! @brief Type-to-storage conversion result. */ using type = constness_as_t, Entity, Allocator>, Type>; }; /** * @brief Helper type. * @tparam Args Arguments to forward. */ template using storage_for_t = typename storage_for::type; /** * @brief Alias declaration for the most common use case. * @tparam Get Types of storage iterated by the view. * @tparam Exclude Types of storage used to filter the view. */ template> using view = basic_view, type_list_transform_t>; /** * @brief Alias declaration for the most common use case. * @tparam Owned Types of storage _owned_ by the group. * @tparam Get Types of storage _observed_ by the group. * @tparam Exclude Types of storage used to filter the group. */ template using group = basic_group, type_list_transform_t, type_list_transform_t>; } // namespace entt #endif