Program Listing for File ResourceManager.hpp

Return to documentation for file (include/ari/ResourceManager.hpp)

#pragma once
#include <string>
#include <vector>
#include <stack>

namespace ari
{
    class ResourceLoader;

    template <class T>
    class ResourceManager
    {
    public:

        virtual ~ResourceManager() = default;

        std::shared_ptr<T> Load(const std::string& filename,    void* extraParams)
        {
            // Searching for resource.
            for (const auto& res: m_vResources)
            {
                if (res)
                {
                    if (!res->GetFileName().empty() && !filename.empty())
                    {
                        if (res->GetFileName() == filename)
                        {
                            return res;
                        }
                    }
                }
            }

            // Resource not loaded yet.
            T* pResource = nullptr;
            const uint32_t handle = GetNewHandle();

            if (!LoadResource(&pResource, handle, filename, extraParams))
                return nullptr;

            return AddResource(pResource);
        }

        void AddLoader(ResourceLoader* pLoader)
        {
            m_vLoaders.push_back(pLoader);
        }

        uint32_t GetNewHandle()
        {
            uint32_t handle;
            if (!m_sHandles.empty())
            {
                handle = m_sHandles.top();
                m_sHandles.pop();
            }
            else
            {
                handle = uint32_t(m_vResources.size());
            }
            return handle;
        }

        std::shared_ptr<T> AddResource(T* _resource)
        {
            std::shared_ptr<T> sp(_resource);
            if (_resource->m_iHandle >= m_vResources.size())
                m_vResources.push_back(sp);
            else
                m_vResources[_resource->m_iHandle] = sp;

            return sp;
        }

    protected:

        virtual bool LoadResource(T** ppOut, uint32_t handle, const std::string& filename,
            void* extraParams) = 0;

        std::vector<std::shared_ptr<T>> m_vResources;
        std::stack<uint32_t>            m_sHandles;
        std::vector<ResourceLoader*>    m_vLoaders;

    };
} // ari