aboutsummaryrefslogtreecommitdiffstats
path: root/README.md
diff options
context:
space:
mode:
authorclyne <clyne@bitgloo.com>2020-08-03 21:19:08 -0400
committerGitHub <noreply@github.com>2020-08-03 21:19:08 -0400
commitd2249cbbfac61e4e9a8af28a2e10c65353f7e761 (patch)
treef22a88583bb6dca1f0c8732ba73a545669d8946d /README.md
parent50d13782ee9ac14328921b867270fccd16f292ec (diff)
Update README.md
Diffstat (limited to 'README.md')
-rw-r--r--README.md37
1 files changed, 36 insertions, 1 deletions
diff --git a/README.md b/README.md
index cfc63c4..cd59891 100644
--- a/README.md
+++ b/README.md
@@ -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);
+}
+```