#pragma once #include #include #include #include #include struct LZLengthOffset { atUint32 length; // The number of bytes compressed atUint16 offset; // How far back in sliding window where bytes that match the lookAheadBuffer is located bool compare_equal(const LZLengthOffset& lo_pair) { return length == lo_pair.length && offset == lo_pair.offset; } }; class LZLookupTable { public: LZLookupTable(); LZLookupTable(atInt32 minimumMatch, atInt32 slidingWindow = 4096, atInt32 lookAheadWindow = 18); ~LZLookupTable(); LZLengthOffset search(atUint8* curPos, const atUint8* dataBegin, const atUint8* dataEnd); void setLookAheadWindow(atInt32 lookAheadWindow); private: typedef std::multimap, int32_t> LookupTable; LookupTable table; atInt32 m_minimumMatch; atInt32 m_slidingWindow; atInt32 m_lookAheadWindow; std::vector m_buffer; };