Program Listing for File Resource.hpp

Return to documentation for file (engine/include/Cacao/Resource.hpp)

#pragma once

#include "DllHelper.hpp"

#include <memory>
#include <string>
#include <vector>

namespace Cacao {
    class BlobResource;
    class Asset;

    class CACAO_API Resource : std::enable_shared_from_this<Resource> {
      public:
        const std::string GetAddress() const {
            return address;
        }

        template<typename T>
            requires std::is_base_of_v<Resource, T> && (!std::is_same_v<BlobResource, T>) && (!std::is_same_v<Asset, T>)
        static bool ValidateResourceAddr(const std::string& addr);

        virtual ~Resource();

      protected:
        Resource(const std::string& addr)
          : address(addr) {
            RegisterSelf();
        }

        std::string address;

        void RegisterSelf();
    };

    class CACAO_API BlobResource : public Resource {
      protected:
        BlobResource(const std::string& addr)
          : Resource(addr) {}
    };

    class CACAO_API BinaryBlobResource final : public BlobResource {
      public:
        static std::shared_ptr<BinaryBlobResource> Create(std::vector<unsigned char>&& data, const std::string& addr) {
            return std::shared_ptr<BinaryBlobResource>(new BinaryBlobResource(std::move(data), addr));
        }

        const std::vector<unsigned char>& GetData() {
            return data;
        }

      private:
        BinaryBlobResource(std::vector<unsigned char>&& data, const std::string& addr);

        const std::vector<unsigned char> data;

        friend class ResourceManager;
    };

    class CACAO_API TextBlobResource final : public BlobResource {
      public:
        static std::shared_ptr<TextBlobResource> Create(std::string&& data, const std::string& addr) {
            return std::shared_ptr<TextBlobResource>(new TextBlobResource(std::move(data), addr));
        }

        const std::string& GetData() {
            return data;
        }

      private:
        TextBlobResource(std::string&& data, const std::string& addr);

        const std::string data;

        friend class ResourceManager;
    };
}