diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2020-03-29 22:59:04 +0300 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2020-03-29 22:59:04 +0300 |
commit | 13771971cfaef6356ba47668cae6ce25c5c2071f (patch) | |
tree | f2706c35edb06cbf43fc18a7c30608dfea67587f /lib/embed.h | |
parent | Change rcc command line (diff) | |
download | rcc-13771971cfaef6356ba47668cae6ce25c5c2071f.tar.xz |
Drop dependency on serge-sans-paille/frozen
format:
- instead of frozen::unordered_map, create two std::arrays with
the aliased names (entries) and respective data (values)
libembed:
- Resources and CompressedResources convenience classes for raw
and compressed resources respectively
- Resources can be constexpr in regular usage
- Annotate Resources::decompress accordingly
Diffstat (limited to 'lib/embed.h')
-rw-r--r-- | lib/embed.h | 91 |
1 files changed, 75 insertions, 16 deletions
diff --git a/lib/embed.h b/lib/embed.h index bd041ff..b57d830 100644 --- a/lib/embed.h +++ b/lib/embed.h @@ -1,29 +1,88 @@ #pragma once -#include <frozen/string.h> -#include <frozen/unordered_map.h> -#include <span> -#include <vector> +#include <array> +#include <string_view> +#include "compressionctx.h" namespace embed { -enum Compression { - None, - Zstd -}; - -template <Compression c> +template <std::size_t N> class Resources { public: - Resources() = default; - explicit Resources(const std::span<const unsigned char> &dictionary); + constexpr explicit Resources( + const std::array<const char *, N> &entries, + const std::array<std::span<const uint8_t>, N> &values) + : m_entries(entries) + , m_values(values) + { + } - ~Resources(); + [[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<const uint8_t> value(const int id_) const + { + if(id_ == -1) + return {}; + else + return m_values.at(id_); + } + [[nodiscard]] constexpr std::span<const uint8_t> value(const std::string_view &path) const + { + return value(id(path)); + } - [[nodiscard]] std::vector<unsigned char> decompress(const std::span<const unsigned char> &entry); + [[deprecated("With no compression, this function returns a copy; use ::value instead")]] + [[nodiscard]] std::vector<uint8_t> 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<uint8_t> decompress(const std::string_view &path) const + { + const auto v = value(path); + return { v.begin(), v.end() }; + } -}; // class +protected: + const std::array<const char *, N> m_entries; + const std::array<std::span<const uint8_t>, N> m_values; +}; + +template <std::size_t N> +class CompressedResources final : public Resources<N> +{ +public: + explicit CompressedResources( + const std::array<const char *, N> &entries, + const std::array<std::span<const uint8_t>, N> &values, + const Compression algo, + const std::span<const uint8_t> &dictionary = {}) + : Resources<N>(entries, values) + , m_compression(make_compression_ctx(algo, dictionary)) + { + } + ~CompressedResources() = default; + + [[nodiscard]] std::vector<uint8_t> decompress(const int id_) const + { + return m_compression->decompress(Resources<N>::value(id_)); + } + [[nodiscard]] std::vector<uint8_t> decompress(const std::string_view &path) const + { + return m_compression->decompress(Resources<N>::value(path)); + } + +protected: + const std::unique_ptr<CompressionCtx> m_compression; +}; -} +} // namespace embed |