#pragma once #include #include #include "compressionctx.h" namespace embed { template class Resources { public: constexpr explicit Resources( const std::array &entries, const std::array, N> &values) : m_entries(entries) , m_values(values) { } [[nodiscard]] constexpr int id(const std::string_view &path) const { for(std::size_t i = 0; i < m_entries.size(); ++i) { if(m_entries.at(i) == path) return i; } return -1; } [[nodiscard]] constexpr std::span value(const int id_) const { if(id_ == -1) return {}; else return m_values.at(id_); } [[nodiscard]] constexpr std::span value(const std::string_view &path) const { return value(id(path)); } [[deprecated("With no compression, this function returns a copy; use ::value instead")]] [[nodiscard]] std::vector decompress(const int id_) const { const auto v = value(id_); return { v.begin(), v.end() }; } [[deprecated("With no compression, this function returns a copy; use ::value instead")]] [[nodiscard]] std::vector decompress(const std::string_view &path) const { const auto v = value(path); return { v.begin(), v.end() }; } protected: const std::array m_entries; const std::array, N> m_values; }; template class CompressedResources final : public Resources { public: explicit CompressedResources( const std::array &entries, const std::array, N> &values, const Compression algo, const std::span &dictionary = {}) : Resources(entries, values) , m_compression(make_compression_ctx(algo, dictionary)) { } ~CompressedResources() = default; [[nodiscard]] std::vector decompress(const int id_) const { return m_compression->decompress(Resources::value(id_)); } [[nodiscard]] std::vector decompress(const std::string_view &path) const { return m_compression->decompress(Resources::value(path)); } protected: const std::unique_ptr m_compression; }; } // namespace embed