diff --git a/Bigfoot/Sources/Engine/DataAccessor/DataAccessor.cpp b/Bigfoot/Sources/Engine/DataAccessor/DataAccessor.cpp new file mode 100644 index 0000000..28fd680 --- /dev/null +++ b/Bigfoot/Sources/Engine/DataAccessor/DataAccessor.cpp @@ -0,0 +1,15 @@ +/********************************************************************* + * \file DataAccessor.cpp + * + * \author Romain BOULLARD + * \date August 2026 + *********************************************************************/ +#include + +namespace Bigfoot +{ +void SetDataAccessor(DataAccessor* p_dataAccessor) +{ + g_dataAccessor = p_dataAccessor; +} +} // namespace Bigfoot diff --git a/Bigfoot/Sources/Engine/Include/Engine/DataAccessor/DataAccessor.hpp b/Bigfoot/Sources/Engine/Include/Engine/DataAccessor/DataAccessor.hpp new file mode 100644 index 0000000..c66f10c --- /dev/null +++ b/Bigfoot/Sources/Engine/Include/Engine/DataAccessor/DataAccessor.hpp @@ -0,0 +1,115 @@ +/********************************************************************* + * \file DataAccessor.hpp + * + * \author Romain BOULLARD + * \date August 2026 + *********************************************************************/ +#ifndef BIGFOOT_ENGINE_DATAACCESSOR_DATAACCESSOR_HPP +#define BIGFOOT_ENGINE_DATAACCESSOR_DATAACCESSOR_HPP +#include + +#include +#include + +#include +#include +#include + +namespace Bigfoot +{ +struct AssetMetadata +{ + UUID m_uuid = UUID::NULL_UUID; + eastl::string m_name {}; + + AssetTypeID m_typeID = 0; + eastl::string m_typeName {}; + + Time m_creationTime = 0; + Time m_modificationTime = 0; +}; + +class DataAccessor +{ + public: + DataAccessor() = default; + + DataAccessor(const DataAccessor& p_accessor) = default; + DataAccessor(DataAccessor&& p_accessor) = default; + + virtual ~DataAccessor() = default; + + /** + * Get an Asset flatbuffer + * + * \param p_uuid The asset to get the flatbuffer of + * \return The flatbuffer, can be empty if asset was not found + */ + virtual eastl::vector GetAssetFlatbuffer(const UUID& p_uuid) const = 0; + + /** + * Get an Asset metadata + * + * \param p_uuid The asset to get the metadata of + * \return The metadata, default initialized if not found (ie: UUID = NULL) + */ + virtual AssetMetadata GetAssetMetadata(const UUID& p_uuid) const = 0; + + /** + * Save an asset + * + * \p_metadata The metadata + * \p_flatbuffer The flatbuffer of the asset + */ + virtual void SaveAssetFlatbuffer(const AssetMetadata& p_metadata, + const eastl::span p_flatbuffer) = 0; + + DataAccessor& operator=(const DataAccessor& p_accessor) = default; + DataAccessor& operator=(DataAccessor&& p_accessor) = default; +}; + +/****************************************************************************************/ + +// The global data accessor for Bigfoot +inline DataAccessor* g_dataAccessor = nullptr; + +/****************************************************************************************/ + +/* + * Set the data accessor + * + * \param p_dataAccessor The data accessor to set g_dataAccessor to. + */ +void SetDataAccessor(DataAccessor* p_dataAccessor); + +/****************************************************************************************/ + +class ScopedDataAccessor +{ + public: + ScopedDataAccessor(DataAccessor* p_dataAccessor): + m_previous(g_dataAccessor) + { + SetDataAccessor(p_dataAccessor); + } + + ScopedDataAccessor(const ScopedDataAccessor& p_scopedDataAccessor) = delete; + ScopedDataAccessor(ScopedDataAccessor&& p_scopedDataAccessor) = delete; + + ~ScopedDataAccessor() + { + SetDataAccessor(m_previous); + } + + ScopedDataAccessor& operator=(const ScopedDataAccessor& p_scopedDataAccessor) = delete; + ScopedDataAccessor& operator=(ScopedDataAccessor&& p_scopedDataAccessor) = delete; + + private: + /* + * The previous data accessor. + */ + DataAccessor* m_previous = nullptr; +}; +} // namespace Bigfoot + +#endif diff --git a/Bigfoot/Tests/Engine/DataAccessor/DataAccessor.cpp b/Bigfoot/Tests/Engine/DataAccessor/DataAccessor.cpp new file mode 100644 index 0000000..93a6b22 --- /dev/null +++ b/Bigfoot/Tests/Engine/DataAccessor/DataAccessor.cpp @@ -0,0 +1,61 @@ +/********************************************************************* + * \file DataAccessor.cpp + * + * \author Romain BOULLARD + * \date August 2026 + *********************************************************************/ +#include + +#include +#include + +namespace Bigfoot +{ +class DataAccessorFixture: public ::testing::Test +{ + protected: + class DataAccessorMock: public DataAccessor + { + public: + MOCK_METHOD(eastl::vector, GetAssetFlatbuffer, (const UUID& p_uuid), (const, override)); + MOCK_METHOD(AssetMetadata, GetAssetMetadata, (const UUID& p_uuid), (const, override)); + MOCK_METHOD(void, + SaveAssetFlatbuffer, + (const AssetMetadata& p_metaData, const eastl::span p_flatbuffer), + (override)); + }; + + void SetUp() override + { + m_original = g_dataAccessor; + } + + void TearDown() override + { + SetDataAccessor(m_original); + } + + DataAccessorMock m_accessor; + DataAccessor* m_original; +}; + +/****************************************************************************************/ + +TEST_F(DataAccessorFixture, SetDataAccessor_ShouldSetTheDataAccessor) +{ + SetDataAccessor(&m_accessor); + EXPECT_EQ(g_dataAccessor, &m_accessor); +} + +/****************************************************************************************/ + +TEST_F(DataAccessorFixture, ScopedDataAccessor_ShouldChangeTheDataAccessorInAScopedWay) +{ + EXPECT_EQ(g_dataAccessor, nullptr); + { + ScopedDataAccessor dataAccessor {&m_accessor}; + EXPECT_EQ(g_dataAccessor, &m_accessor); + } + EXPECT_EQ(g_dataAccessor, nullptr); +} +} // namespace Bigfoot