|
|
- #ifndef ENTT_ENTITY_ACTOR_HPP
- #define ENTT_ENTITY_ACTOR_HPP
-
-
- #include <cassert>
- #include <utility>
- #include <type_traits>
- #include "../config/config.h"
- #include "registry.hpp"
- #include "entity.hpp"
- #include "fwd.hpp"
-
-
- namespace entt {
-
-
- /**
- * @brief Dedicated to those who aren't confident with entity-component systems.
- *
- * Tiny wrapper around a registry, for all those users that aren't confident
- * with entity-component systems and prefer to iterate objects directly.
- *
- * @tparam Entity A valid entity type (see entt_traits for more details).
- */
- template<typename Entity>
- struct basic_actor {
- /*! @brief Type of registry used internally. */
- using registry_type = basic_registry<Entity>;
- /*! @brief Underlying entity identifier. */
- using entity_type = Entity;
-
- /**
- * @brief Constructs an actor by using the given registry.
- * @param ref An entity-component system properly initialized.
- */
- basic_actor(registry_type &ref)
- : reg{&ref}, entt{ref.create()}
- {}
-
- /*! @brief Default destructor. */
- virtual ~basic_actor() {
- reg->destroy(entt);
- }
-
- /**
- * @brief Move constructor.
- *
- * After actor move construction, instances that have been moved from are
- * placed in a valid but unspecified state. It's highly discouraged to
- * continue using them.
- *
- * @param other The instance to move from.
- */
- basic_actor(basic_actor &&other)
- : reg{other.reg}, entt{other.entt}
- {
- other.entt = null;
- }
-
- /**
- * @brief Move assignment operator.
- *
- * After actor move assignment, instances that have been moved from are
- * placed in a valid but unspecified state. It's highly discouraged to
- * continue using them.
- *
- * @param other The instance to move from.
- * @return This actor.
- */
- basic_actor & operator=(basic_actor &&other) {
- if(this != &other) {
- auto tmp{std::move(other)};
- std::swap(reg, tmp.reg);
- std::swap(entt, tmp.entt);
- }
-
- return *this;
- }
-
- /**
- * @brief Assigns the given component to an actor.
- *
- * A new instance of the given component is created and initialized with the
- * arguments provided (the component must have a proper constructor or be of
- * aggregate type). Then the component is assigned to the actor.<br/>
- * In case the actor already has a component of the given type, it's
- * replaced with the new one.
- *
- * @tparam Component Type of the component to create.
- * @tparam Args Types of arguments to use to construct the component.
- * @param args Parameters to use to initialize the component.
- * @return A reference to the newly created component.
- */
- template<typename Component, typename... Args>
- decltype(auto) assign(Args &&... args) {
- return reg->template assign_or_replace<Component>(entt, std::forward<Args>(args)...);
- }
-
- /**
- * @brief Removes the given component from an actor.
- * @tparam Component Type of the component to remove.
- */
- template<typename Component>
- void remove() {
- reg->template remove<Component>(entt);
- }
-
- /**
- * @brief Checks if an actor has the given component.
- * @tparam Component Type of the component for which to perform the check.
- * @return True if the actor has the component, false otherwise.
- */
- template<typename Component>
- bool has() const ENTT_NOEXCEPT {
- return reg->template has<Component>(entt);
- }
-
- /**
- * @brief Returns references to the given components for an actor.
- * @tparam Component Types of components to get.
- * @return References to the components owned by the actor.
- */
- template<typename... Component>
- decltype(auto) get() const ENTT_NOEXCEPT {
- return std::as_const(*reg).template get<Component...>(entt);
- }
-
- /*! @copydoc get */
- template<typename... Component>
- decltype(auto) get() ENTT_NOEXCEPT {
- return reg->template get<Component...>(entt);
- }
-
- /**
- * @brief Returns pointers to the given components for an actor.
- * @tparam Component Types of components to get.
- * @return Pointers to the components owned by the actor.
- */
- template<typename... Component>
- auto try_get() const ENTT_NOEXCEPT {
- return std::as_const(*reg).template try_get<Component...>(entt);
- }
-
- /*! @copydoc try_get */
- template<typename... Component>
- auto try_get() ENTT_NOEXCEPT {
- return reg->template try_get<Component...>(entt);
- }
-
- /**
- * @brief Returns a reference to the underlying registry.
- * @return A reference to the underlying registry.
- */
- inline const registry_type & backend() const ENTT_NOEXCEPT {
- return *reg;
- }
-
- /*! @copydoc backend */
- inline registry_type & backend() ENTT_NOEXCEPT {
- return const_cast<registry_type &>(std::as_const(*this).backend());
- }
-
- /**
- * @brief Returns the entity associated with an actor.
- * @return The entity associated with the actor.
- */
- inline entity_type entity() const ENTT_NOEXCEPT {
- return entt;
- }
-
- private:
- registry_type *reg;
- Entity entt;
- };
-
-
- }
-
-
- #endif // ENTT_ENTITY_ACTOR_HPP
|