diff options
author | clyne <clyne@bitgloo.com> | 2020-08-03 21:19:08 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-03 21:19:08 -0400 |
commit | d2249cbbfac61e4e9a8af28a2e10c65353f7e761 (patch) | |
tree | f22a88583bb6dca1f0c8732ba73a545669d8946d /README.md | |
parent | 50d13782ee9ac14328921b867270fccd16f292ec (diff) |
Update README.md
Diffstat (limited to 'README.md')
-rw-r--r-- | README.md | 37 |
1 files changed, 36 insertions, 1 deletions
@@ -1,2 +1,37 @@ # consteval-huffman -Compile-time Huffman coding compression using C++20 + +Allows for long string or data constants to be compressed at compile-time, with a small decoder routine for decompression at run-time. + +Compression is achieved using Huffman coding, which works by creating codes for frequently-occuring characters. + +## Use cases + +**1. Text configurations (e.g. JSON)** + +A ~3.5kB string of JSON can be compressed down ~2.5kB ([see it on Godbolt](https://godbolt.org/z/P6a9Kr)). + +**2. Scripts (e.g. Lisp)** + +A ~40 line commented sample of Lisp can be reduced from 1,662 bytes to 1,244 (418 bytes saved) ([on Godbolt](https://godbolt.org/z/c64Pzz)). + +Compression will work best on not-small blocks of text or data. This is because a decoding tree must be stored with the compressed data, requiring three bytes per value. + +## How to Use + +```cpp +#include "consteval_huffman.hpp" + +constexpr static const char some_data_raw[] = /* insert text here */; + +constinit static const auto some_data = consteval_huffman<some_data_raw>(); + +// Or, with a set data length: +// ... some_data = consteval_huffman<some_data_raw, 1500>(); + +int main() +{ + // Decompress and print out the data + for (auto decode = some_data.get_decoder(); decode; ++decode) + putchar(*decode); +} +``` |