diff --git a/include/generic_object.hpp b/include/generic_object.hpp index 298985e..d3b51a3 100644 --- a/include/generic_object.hpp +++ b/include/generic_object.hpp @@ -47,11 +47,8 @@ namespace character { class Tools; - using billyObjects = std::variant; using billyEnums = std::variant; - static billyObjects new_object(const billyEnums &inputObject); - class GenericObject { public: virtual ~GenericObject() = default; @@ -65,13 +62,19 @@ namespace character { [[nodiscard]] virtual std::uint32_t add_materiel(const characteristic::characType inType) const noexcept = 0; [[nodiscard]] virtual std::string_view to_string() const noexcept = 0; + + [[nodiscard]] virtual billyEnums get_type() const noexcept = 0; }; + using billyObjects = std::unique_ptr; + + static billyObjects new_object(const billyEnums &inputObject) noexcept; + class Weapons final : virtual public GenericObject { public: const weapons type{ weapons::Sword }; - friend billyObjects new_object(const billyEnums &inputObject); + friend billyObjects new_object(const billyEnums &inputObject) noexcept; Weapons() = delete; @@ -85,7 +88,9 @@ namespace character { [[nodiscard]] std::uint32_t add_materiel(const characteristic::characType inType) const noexcept final; - [[nodiscard]] std::string_view to_string() const noexcept override; + [[nodiscard]] std::string_view to_string() const noexcept final; + + [[nodiscard]] billyEnums get_type() const noexcept final { return type; } private: explicit Weapons(const weapons type) : type(type) {} @@ -95,7 +100,7 @@ namespace character { public: const equipments type{ equipments::Chainmail }; - friend billyObjects new_object(const billyEnums &inputObject); + friend billyObjects new_object(const billyEnums &inputObject) noexcept; Equipments() = delete; @@ -109,7 +114,9 @@ namespace character { [[nodiscard]] std::uint32_t add_materiel(const characteristic::characType inType) const noexcept final; - [[nodiscard]] std::string_view to_string() const noexcept override; + [[nodiscard]] std::string_view to_string() const noexcept final; + + [[nodiscard]] billyEnums get_type() const noexcept final { return type; } private: explicit Equipments(const equipments type) : type(type) {} @@ -119,7 +126,7 @@ namespace character { public: const tools type{ tools::Fourche }; - friend billyObjects new_object(const billyEnums &inputObject); + friend billyObjects new_object(const billyEnums &inputObject) noexcept; Tools() = delete; @@ -133,7 +140,9 @@ namespace character { [[nodiscard]] std::uint32_t add_materiel(const characteristic::characType inType) const noexcept final; - [[nodiscard]] std::string_view to_string() const noexcept override; + [[nodiscard]] std::string_view to_string() const noexcept final; + + [[nodiscard]] billyEnums get_type() const noexcept final { return type; } private: explicit Tools(const tools type) : type(type) {} diff --git a/src/generic_object.cpp b/src/generic_object.cpp index 7d21f4b..00e194d 100644 --- a/src/generic_object.cpp +++ b/src/generic_object.cpp @@ -160,11 +160,11 @@ namespace character { } } - billyObjects new_object(const billyEnums &inputObject) { + billyObjects new_object(const billyEnums &inputObject) noexcept { return std::visit(overloaded{ - [](const weapons input) { return billyObjects{ Weapons{ input }}; }, - [](const equipments input) { return billyObjects{ Equipments{ input }}; }, - [](const tools input) { return billyObjects{ Tools{ input }}; } + [](const weapons input) { return billyObjects{ new Weapons{ input }}; }, + [](const equipments input) { return billyObjects{ new Equipments{ input }}; }, + [](const tools input) { return billyObjects{ new Tools{ input }}; } }, inputObject); } }