#ifndef __JABYENGINE_LZ4_DECOMPRESSOR_HPP__ #define __JABYENGINE_LZ4_DECOMPRESSOR_HPP__ #include "../../stddef.h" #include "array_range.hpp" #include "types.hpp" namespace JabyEngine { class LZ4Decompressor { public: struct Result { Progress progress; size_t bytes_ready; static constexpr Result new_error() { return {Progress::Error, 0}; } static constexpr Result new_done(size_t bytes_ready) { return {Progress::Done, bytes_ready}; } static constexpr Result new_in_progress(size_t bytes_ready) { return {Progress::InProgress, bytes_ready}; } }; private: struct State { enum struct Step { ReadToken, ObtainLiteralLength, CopyLiterals, ObtainMatchOffset, ObtainMatchLength, CopyMatch, }; Step step = Step::ReadToken; size_t literal_length = 0; size_t match_length = 0; uint16_t match_offset = 0xFFFF; State() = default; }; private: uint8_t* dst_adr = nullptr; State state; static bool obtain_any_length(ArrayRange& data, uint32_t &dst_length); pair read_token(ArrayRange& data); pair obtain_literal_length(ArrayRange& data); pair copy_literals(ArrayRange& data); pair obtain_match_offset(ArrayRange& data); pair obtain_match_length(ArrayRange& data); pair copy_match(ArrayRange& data); public: LZ4Decompressor() = default; LZ4Decompressor(uint8_t* dst_adr) : LZ4Decompressor() { LZ4Decompressor::setup(dst_adr); } void setup(uint8_t* dst_adr); void reset(); Result process(ArrayRange data); }; } #endif //!__JABYENGINE_LZ4_DECOMPRESSOR_HPP__