82 constexpr int maxNodesNeeded= 256 + 255;
83 Node nodePool[maxNodesNeeded];
88 struct cmpHN {
bool operator()(Node* l, Node* r) {
return (l->frequency > r->frequency); } };
97 for (std::size_t i = 0; i < 256 ; ++i)
98 if( (
symbols + i)->frequency > 0 )
99 underlyingNodeVector.
push_back(
new (nodePool + npNext++) Node(
symbols + i) );
102ALIB_DBG( dbgAllValuesAreSame= (sortedNodes.size() == 1); )
104 while (sortedNodes.size() > 1) {
106 Node* left = sortedNodes.top(); sortedNodes.pop();
107 Node* right= sortedNodes.top(); sortedNodes.pop();
111 sortedNodes.push(
new ( nodePool + npNext++ ) Node(left, right) );
114 tree= sortedNodes.top();
115 ALIB_ASSERT_ERROR( npNext <= maxNodesNeeded ,
"BITBUFFER/AC/HFMN",
"This can never happen" )
127 stack[0] = Stack{ tree, 0 };
130TEMP_PT(
Log_Warning(
"------ Huffman Encoding Table ----------") )
134 auto* node= stack[depth].node;
140 if( node->isLeaf() ) {
142 bw.WriteBits<9>( 1 |
static_cast<unsigned>(node->getSymbol() -
symbols) << 1 );
145 node->getSymbol()->wordLength= depth;
146 for(
int i= 0 ; i <= wordNo ; ++i )
147 node->getSymbol()->words[i]= words[i];
149TEMP_PT(
NString512 bits; bits <<
Bin(node->symbol->words[0], node->symbol->wordLength);
151 Lox_Warning(
"HM I: {:3}: {:<15} (len={!ATAB:2}, freq={:>5})",
154 node->symbol->wordLength,
155 node->symbol->frequency ) )
158 words[wordNo]&= ~(uint32_t(1) << ( bitNo ) );
164 bw.WriteBits<1>( 0u );
167 if( stack[depth].walked == 0) {
168 stack[depth].walked++;
169 stack[depth+1]= Stack{ node->getLeft() , 0};
175 if( stack[depth].walked == 1) {
176 stack[depth].walked++;
177 words[wordNo] |= (1 << ( bitNo ) );
178 stack[depth+1]= Stack{ node->getRight() , 0};
184 words[wordNo]&= ~(uint32_t(1) << ( bitNo ) );
187TEMP_PT(
Log_Warning(
"------End of Huffman Encoding Table ----------") )
191TEMP_PT(
Log_Warning(
"------ Huffman Decoding Table ----------") )
200 stack[depth= 0]= Stack{ &
tree, 0 };
202 auto* node= stack[depth].node;
204 if(
br.ReadBits<1>() ) {
205 node->symbol= uint8_t(
br.ReadBits<8>());
212TEMP_PT( dbgWord.DeleteEnd(1); )
217 if( stack[depth].read == 0) {
220TEMP_PT( dbgWord <<
'0'; )
221 stack[depth+1]= Stack{ node->left , 0 };
227 if( stack[depth].read == 1) {
229TEMP_PT( dbgWord <<
'1'; )
231 stack[depth+1]= Stack{ node->right , 0 };
236TEMP_PT( dbgWord.DeleteEnd(1); )
242TEMP_PT(
Log_Warning(
"------End of Huffman Decoding Table ----------") )