Add factory
Bigfoot / Build & Test Debug with ./ConanProfiles/host/clang_asan (Unity Build: OFF, Variant: toolmode) (push) Failing after 22s
Bigfoot / Build & Test Debug with ./ConanProfiles/host/clang_asan (Unity Build: ON, Variant: game) (push) Failing after 21s
Bigfoot / Build & Test Debug with ./ConanProfiles/host/clang_asan (Unity Build: ON, Variant: toolmode) (push) Failing after 22s
Bigfoot / Sonarqube (game) (push) Skipped
Bigfoot / Sonarqube (toolmode) (push) Skipped
Bigfoot / Build & Test Debug with ./ConanProfiles/host/clang (Unity Build: OFF, Variant: game) (push) Failing after 21s
Bigfoot / Build & Test Debug with ./ConanProfiles/host/clang (Unity Build: OFF, Variant: toolmode) (push) Failing after 22s
Bigfoot / Build & Test Debug with ./ConanProfiles/host/clang (Unity Build: ON, Variant: game) (push) Failing after 22s
Bigfoot / Build & Test Debug with ./ConanProfiles/host/clang (Unity Build: ON, Variant: toolmode) (push) Failing after 20s
Bigfoot / Build & Test Debug with ./ConanProfiles/host/clang_asan (Unity Build: OFF, Variant: game) (push) Failing after 21s
Bigfoot / Build & Test RelWithDebInfo with ./ConanProfiles/host/clang (Unity Build: OFF, Variant: game) (push) Failing after 22s
Bigfoot / Build & Test RelWithDebInfo with ./ConanProfiles/host/clang (Unity Build: OFF, Variant: toolmode) (push) Failing after 21s
Bigfoot / Build & Test RelWithDebInfo with ./ConanProfiles/host/clang (Unity Build: ON, Variant: toolmode) (push) Failing after 20s
Bigfoot / Build & Test RelWithDebInfo with ./ConanProfiles/host/clang_asan (Unity Build: OFF, Variant: game) (push) Failing after 22s
Bigfoot / Build & Test RelWithDebInfo with ./ConanProfiles/host/clang_asan (Unity Build: OFF, Variant: toolmode) (push) Failing after 23s
Bigfoot / Build & Test RelWithDebInfo with ./ConanProfiles/host/clang_asan (Unity Build: ON, Variant: game) (push) Failing after 23s
Bigfoot / Build & Test RelWithDebInfo with ./ConanProfiles/host/clang_asan (Unity Build: ON, Variant: toolmode) (push) Failing after 22s
Bigfoot / Build & Test Release with ./ConanProfiles/host/clang (Unity Build: OFF, Variant: game) (push) Failing after 20s
Bigfoot / Build & Test RelWithDebInfo with ./ConanProfiles/host/clang (Unity Build: ON, Variant: game) (push) Failing after 21s
Bigfoot / Build & Test Release with ./ConanProfiles/host/clang (Unity Build: OFF, Variant: toolmode) (push) Failing after 22s
Bigfoot / Build & Test Release with ./ConanProfiles/host/clang (Unity Build: ON, Variant: game) (push) Failing after 20s
Bigfoot / Build & Test Release with ./ConanProfiles/host/clang_asan (Unity Build: OFF, Variant: toolmode) (push) Failing after 22s
Bigfoot / Build & Test Release with ./ConanProfiles/host/clang (Unity Build: ON, Variant: toolmode) (push) Failing after 22s
Bigfoot / Build & Test Release with ./ConanProfiles/host/clang_asan (Unity Build: OFF, Variant: game) (push) Failing after 21s
Bigfoot / Build & Test Release with ./ConanProfiles/host/clang_asan (Unity Build: ON, Variant: game) (push) Failing after 19s
Bigfoot / Build & Test Release with ./ConanProfiles/host/clang_asan (Unity Build: ON, Variant: toolmode) (push) Failing after 20s
Bigfoot / Clang Format Checks (push) Failing after 12s

This commit is contained in:
2026-09-08 22:31:28 +02:00
parent 10f4a09c37
commit aef49e7f11
2 changed files with 170 additions and 0 deletions
@@ -0,0 +1,75 @@
/*********************************************************************
* \file Factory.hpp
*
* \author Romain BOULLARD
* \date September 2026
*********************************************************************/
#ifndef BIGFOOT_UTILS_FACTORY_HPP
#define BIGFOOT_UTILS_FACTORY_HPP
#include <EASTL/unique_ptr.h>
#include <EASTL/utility.h>
#include <ankerl/unordered_dense.h>
namespace Bigfoot
{
template<class TYPE, class KEY, class CREATEFUNCTION>
class Factory
{
public:
/**
* Register a key inside the factory
*
* \param p_key The key
* \param p_function The create function
* \return True if the key has been registered, false if it was already registered
*/
[[nodiscard]]
bool Register(const KEY p_key, CREATEFUNCTION&& p_function)
{
if (m_createFunctions.find(p_key) == m_createFunctions.end())
{
m_createFunctions.emplace(p_key, eastl::move(p_function));
return true;
}
return false;
}
/**
* Create an instance from the factory
*
* \param p_key The key to create. Needs to have been registered with Register()
* \param p_args Arguments for the creation
* \return The created instance. nullptr is returned if the key has not been registered
*/
template<typename... ARGS>
[[nodiscard]]
eastl::unique_ptr<TYPE> Create(const KEY p_key, ARGS&&... p_args) const
{
if (const auto createFunction = m_createFunctions.find(p_key); createFunction != m_createFunctions.end())
{
return createFunction->second(eastl::forward<ARGS>(p_args)...);
}
return nullptr;
}
/**
* Remove a key and its associated create function from the factory
*
* \param p_key The key to remove
*/
void Remove(const KEY p_key)
{
m_createFunctions.erase(p_key);
}
private:
/**
* The mapping between keys and create functions
*/
ankerl::unordered_dense::map<KEY, CREATEFUNCTION> m_createFunctions;
};
} // namespace Bigfoot
#endif
+95
View File
@@ -0,0 +1,95 @@
/*********************************************************************
* \file Factory.cpp
*
* \author Romain BOULLARD
* \date September 2026
*********************************************************************/
#include <Utils/Factory.hpp>
#include <EASTL/functional.h>
#include <EASTL/unique_ptr.h>
#include <gtest/gtest.h>
namespace Bigfoot
{
class Widget
{
public:
virtual ~Widget() = default;
[[nodiscard]]
virtual std::uint32_t GetValue() const = 0;
};
class WidgetA final: public Widget
{
public:
explicit WidgetA(const std::uint32_t p_value):
m_value(p_value)
{
}
[[nodiscard]]
std::uint32_t GetValue() const override
{
return m_value;
}
private:
std::uint32_t m_value;
};
enum class WidgetKeys
{
WidgetA
};
using WidgetFactory = Factory<Widget, WidgetKeys, eastl::function<eastl::unique_ptr<Widget>(std::uint32_t)>>;
/****************************************************************************************/
class FactoryFixture: public ::testing::Test
{
protected:
static eastl::unique_ptr<Widget> CreateWidgetA(const std::uint32_t p_value)
{
return eastl::make_unique<WidgetA>(p_value);
}
WidgetFactory m_factory;
};
/****************************************************************************************/
TEST_F(FactoryFixture, Register_ShouldReturnTrueOnSuccess)
{
EXPECT_TRUE(m_factory.Register(WidgetKeys::WidgetA, &CreateWidgetA));
}
/****************************************************************************************/
TEST_F(FactoryFixture, Register_ShouldReturnFalseOnKeyDuplication)
{
std::ignore = m_factory.Register(WidgetKeys::WidgetA, &CreateWidgetA);
EXPECT_FALSE(m_factory.Register(WidgetKeys::WidgetA, &CreateWidgetA));
}
/****************************************************************************************/
TEST_F(FactoryFixture, Create_ShouldReturnAValidInstanceIfKeyIsRegistered)
{
std::ignore = m_factory.Register(WidgetKeys::WidgetA, &CreateWidgetA);
const eastl::unique_ptr<Widget> widget = m_factory.Create(WidgetKeys::WidgetA, 42);
EXPECT_EQ(widget->GetValue(), 42);
}
/****************************************************************************************/
TEST_F(FactoryFixture, Create_ShouldReturnNullptrIfKeyIsNotRegistered)
{
EXPECT_EQ(m_factory.Create(WidgetKeys::WidgetA, 42), nullptr);
}
} // namespace Bigfoot