TMP によるコンパイル時ハフマンエンコーダー(Compile time huffman encoder)
何となく書いて見た。テンプレートメタプログラミングによって、コンパイル時にハフマンツリーを構築し各記号を符号化して生成する。
以下のサンプルコードで標準出力以外は全てコンパイル時に行われる。
exp:
#include<srook/mpl/cxx17/huffman_coding/huffman_encode.hpp> #include<iostream> #include<boost/type_index.hpp> template<class T> inline void type_print() { std::cout<<boost::typeindex::type_id<T>().pretty_name()<<std::endl; } int main() { using value=srook::huffman_coding::pack<'A','D','B','C','B','A','B','C','B','B','C','E'>; type_print<value>(); type_print< srook::huffman_coding::huffman_encode<value> >(); }
output:
srook::huffman_coding::(anonymous namespace)::pack<(char)65, (char)68, (char)66, (char)67, (char)66, (char)65, (char)66, (char)67, (char)66, (char)66, (char)67, (char)69> srook::huffman_coding::(anonymous namespace)::pack<true, true, false, true, true, true, false, false, true, false, false, true, true, false, false, true, false, false, false, true, false, true, true, true, true>
出力がtrue
、false
になっているがそれぞれを単に1と0に読み替えれば良い。
TMPで簡易的なコンパイル時ハフマン符号機書いて見た。 https://t.co/I0ghZWzMYQ
— roκi (@530506) 2017年4月28日