Program Listing for File asset_manager.h

Return to documentation for file (simple2dengine/managers/asset_manager.h)

#ifndef _SIMPLE2DENGINE_MANAGERS_ASSET_MANAGER_H_
#define _SIMPLE2DENGINE_MANAGERS_ASSET_MANAGER_H_

#include <iostream>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>

#include "simple2dengine/managers/loaders/loader.h"

namespace simple2dengine
{
    class AssetManager
    {
      public:
        void registerLoader(std::shared_ptr<Loader> loader,
                            const std::vector<std::string>& extensions);
        void load(const std::string& filename);
        void unload(const std::string& filename);
        template<class T> const T* getAsset(const std::string& filename) const
        {
            std::shared_ptr<Loader> loader = getLoader(filename);
            if(!loader)
            {
                std::cout << "Error when getting asset '" << filename
                          << "': no loaders found for extension!" << std::endl;
                return nullptr;
            }

            BaseAsset* asset = loader->getAsset(filename);
            if(asset)
            {
                Asset<T>* loadedAsset = static_cast<Asset<T>*>(asset);
                if(loadedAsset != nullptr)
                {
                    const T* ret_asset = loadedAsset->asset;
                    delete asset;
                    return ret_asset;
                }
            }

            return nullptr;
        }
        std::shared_ptr<Loader> getLoader(const std::string& filename) const;

      private:
        std::unordered_map<std::string, std::shared_ptr<Loader>> loaders; // all loaders
    };
} // namespace simple2dengine

#endif // _SIMPLE2DENGINE_MANAGERS_ASSET_MANAGER_H_