Claw 1.7.0
|
00001 00006 #include <map> 00007 00008 /*----------------------------------------------------------------------------*/ 00014 template<typename InputBuffer, typename OutputBuffer> 00015 void claw::lzw_encoder<InputBuffer, OutputBuffer>::encode 00016 ( input_buffer_type& input, output_buffer_type& output ) const 00017 { 00018 typedef std::pair<unsigned int, unsigned int> word; 00019 00020 if ( !input.end_of_data() ) 00021 { 00022 std::map<word, unsigned int> table; 00023 00024 unsigned int symbol = input.get_next(); 00025 unsigned int prefix_code = symbol; 00026 unsigned int next_code = input.symbols_count(); 00027 00028 while ( !input.end_of_data() && (next_code != output.max_code()) ) 00029 { 00030 symbol = input.get_next(); 00031 00032 word new_word(prefix_code, symbol); 00033 00034 if ( table.find(new_word) != table.end() ) 00035 prefix_code = table[new_word]; 00036 else 00037 { 00038 output.write(prefix_code); 00039 output.new_code(next_code); 00040 table[new_word] = next_code; 00041 prefix_code = symbol; 00042 00043 ++next_code; 00044 } 00045 } 00046 00047 output.write(prefix_code); 00048 } 00049 } // lzw_encoder::encode()