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 CACAO_API Resource : std::enable_shared_from_this<Resource> {
      public:
        const std::string GetAddress() const {
            return address;
        }

        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 : 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)
          : BlobResource(addr), data(data) {}

        const std::vector<unsigned char> data;

        friend class ResourceManager;
    };

    class CACAO_API TextBlobResource : 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)
          : BlobResource(addr), data(data) {}

        const std::string data;

        friend class ResourceManager;
    };
}