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 : public 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<Asset, T>)
        static bool ValidateResourceAddr(const std::string& addr);

        virtual ~Resource();

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

        std::string address;
    };

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

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

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

        std::string_view GetDataAsString() {
            return std::string_view(reinterpret_cast<const char*>(data.data()), data.size());
        }

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

        const std::vector<unsigned char> data;

        friend class ResourceManager;
    };
}