aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorclyne <clyne@bitgloo.com>2020-12-29 19:21:32 -0500
committerGitHub <noreply@github.com>2020-12-29 19:21:32 -0500
commit9b019e37aa32263b9853c17ec4e11048ce2df569 (patch)
tree17420f906522b0df609285db2a1fb20542ec3296
parent9eea49e31258e471f56a1a4791a35fc6f9532af8 (diff)
Clean up readme, add guide
-rw-r--r--README.md38
1 files changed, 26 insertions, 12 deletions
diff --git a/README.md b/README.md
index 374051b..21e139f 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,12 @@
# consteval-huffman
-Allows for long strings of text or data to be compressed at compile-time, with an efficient decoder routine for decompression at run-time. The decoder conforms to `std::forward_iterator`, allowing for use in ranged-for or standard algorithms.
+A C++20 utility for compressing string literals at compile-time to save program space. The compressed data can be decompressed at run-time through the use of a decoder that follows `std::forward_iterator`.
-Compression is achieved using [Huffman coding](https://en.wikipedia.org/wiki/Huffman_coding), which works by creating short codes (measured in bits) for frequently-occuring characters. This works best on larger pieces of data, or more so data that is limited in its range of values (e.g. written text).
+Compression is achieved using [Huffman coding](https://en.wikipedia.org/wiki/Huffman_coding), which works by creating short codes (measured in bits) for frequently-occuring characters. This works best on larger pieces of data that are limited in their range of values (e.g. written text).
+
+## Requirements
+
+A C++20 compliant compiler. `consteval-huffman` is confirmed to work on gcc 10.1 and later, doesn't work yet on clang.
## Use cases
@@ -12,21 +16,31 @@ A ~3.5kB string of JSON can be compressed down ~2.5kB ([see it on Godbolt](https
**2. Scripts (e.g. Lisp)**
-A ~40 line comment-including sample of Lisp can be reduced from 1,662 bytes to 1,244 (418 bytes saved) ([Godbolt](https://godbolt.org/z/Kbenbh)).
+A ~40 line comment-including sample of Lisp can be reduced from 1,662 bytes to 1,251 (412 bytes saved) ([Godbolt](https://godbolt.org/z/Kbenbh)).
+
+**3. Numbers?**
+
+A string of numbers 1 to 100 separated with spaces can be compressed to 64% of its original size ([Godbolt](https://godbolt.org/z/Te17aM)).
## How to Use
```cpp
+// 1.
#include "consteval_huffman.hpp"
-// Using the _huffman suffix creates an object with the compressed data.
-// If data is not smaller after compression, the object will keep the data uncompressed.
-constinit auto some_data = "This is my string of data"_huffman;
+// 2.
+auto data = "This is my string of data"_huffman; // "\0\x1 Non-text data works too!"
-int main()
-{
- // Decompress and print out the data
- for (auto c : some_data)
- putchar(c);
-}
+// 3.
+for (char c : data)
+ std::cout << c;
```
+
+Use `data.begin()` or `data.cbegin()` to get an iterator for the data which decompresses the next byte with every increment.
+These of course come with `end()` and `cend()`.
+
+Use `data()` to get a pointer to the *compressed* data.
+
+Use `size()` to get the size of the compressed data.
+
+Should compression not decrease the size of the given data, the data will be stored uncompressed. The above functions will still behave as they should.