Program Listing for File LempelZiv.h

↰ Return to documentation for file (ADS/compression/LempelZiv.h)

/*--------------------------------------------------------------------------*/
/*---------------------------- File LempelZiv.h ----------------------------*/
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/*----------------------------- DEFINITIONS --------------------------------*/
/*--------------------------------------------------------------------------*/

#ifndef __ADS_LempelZiv
 #define __ADS_LempelZiv
                      /* self-identification: #endif constant */

/*--------------------------------------------------------------------------*/
/*------------------------------ INCLUDES ----------------------------------*/
/*--------------------------------------------------------------------------*/

#include "ADS/Contract.h"

#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <limits>
#include <map>
#include <optional>
#include <string>
#include <string_view>
#include <unordered_map>
#include <utility>
#include <vector>

/*--------------------------------------------------------------------------*/
/*--------------------------- NAMESPACE ------------------------------------*/
/*--------------------------------------------------------------------------*/

namespace ADS {

struct LZ77Phrase {
 std::size_t distance , length;
 std::optional< char > next;
 friend bool operator==( const LZ77Phrase & a ,
                         const LZ77Phrase & b ) = default;
 };

struct LZSSPhrase {
 std::size_t distance , length;
 char literal;
 friend bool operator==( const LZSSPhrase & a ,
                         const LZSSPhrase & b ) = default;
 };

struct LZ78Phrase {
 std::size_t id;
 char next;
 friend bool operator==( const LZ78Phrase & a ,
                         const LZ78Phrase & b ) = default;
 };

[[nodiscard]] inline std::vector< LZ77Phrase > lz77Parse(
           std::string_view s ,
           std::size_t w = std::numeric_limits< std::size_t >::max() );

[[nodiscard]] inline std::string lz77Decode(
                                     const std::vector< LZ77Phrase > & P );

[[nodiscard]] inline std::vector< LZSSPhrase > lzssParse(
           std::string_view s ,
           std::size_t w = std::numeric_limits< std::size_t >::max() ,
           std::size_t minLength = 1 );

[[nodiscard]] inline std::vector< LZSSPhrase > lzssParseHashed(
           std::string_view s , std::size_t w , std::size_t minLength = 3 ,
           std::size_t maxChain = std::numeric_limits< std::size_t >::max() );

[[nodiscard]] inline std::string lzssDecode(
                                     const std::vector< LZSSPhrase > & P );

[[nodiscard]] inline std::vector< LZ78Phrase > lz78Parse(
      std::string_view s ,
      std::size_t maxPhrases = std::numeric_limits< std::size_t >::max() );

[[nodiscard]] inline std::string lz78Decode(
      const std::vector< LZ78Phrase > & P ,
      std::size_t maxPhrases = std::numeric_limits< std::size_t >::max() );

[[nodiscard]] inline std::vector< std::uint32_t > lzwEncode(
                                                         std::string_view s );

[[nodiscard]] inline std::string lzwDecode(
                                      const std::vector< std::uint32_t > & I );

/*--------------------------------------------------------------------------*/

}  // end( namespace ADS )

/*--------------------------------------------------------------------------*/
/*-------------------------- IMPLEMENTATION --------------------------------*/
/*--------------------------------------------------------------------------*/

#include "ADS/compression/impl/LempelZiv.tpp"

/*--------------------------------------------------------------------------*/

#endif  /* LempelZiv.h included */

/*--------------------------------------------------------------------------*/
/*-------------------------- End File LempelZiv.h --------------------------*/
/*--------------------------------------------------------------------------*/