// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequisites.hpp #include #include namespace Ndk { /*! * \ingroup NDK * \class Ndk::Component * \brief NDK class that represents a component for an entity which interacts with a system * * \remark This class is meant to be derived as CRTP: "Component" */ /*! * \brief Constructs a Component object by default */ template Component::Component() : BaseComponent(GetComponentIndex()) { } template Component::~Component() = default; /*! * \brief Clones the component * \return The clone newly created * * \remark The component to clone should be trivially copy constructible */ template std::unique_ptr Component::Clone() const { ///FIXME: Pas encore supporté par GCC (4.9.2) //static_assert(std::is_trivially_copy_constructible::value, "ComponentType must be copy-constructible"); return std::make_unique(static_cast(*this)); } /*! * \brief Registers the component by assigning it an index */ template ComponentIndex Component::RegisterComponent(ComponentId id) { //We use the lambda to create a factory function auto factory = []() -> BaseComponent* { return nullptr; //< Temporary workaround to allow non-default-constructed components, will be updated for serialization //return new ComponentType; }; return BaseComponent::RegisterComponent(id, factory); } /*! * \brief Registers the component by assigning it an index based on the name */ template template ComponentIndex Component::RegisterComponent(const char (&name)[N]) { // We convert the string to a number which will be used as unique identifier ComponentId id = BuildComponentId(name); return RegisterComponent(id); } }