00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00030 #include <cassert>
00031
00032
00041 template<typename OutputBuffer >
00042 template<typename Iterator>
00043 void claw::rle_encoder<OutputBuffer>::encode( Iterator first, Iterator last,
00044 output_buffer_type& output ) const
00045 {
00046 const unsigned int max_encodable = output.max_encodable();
00047 const unsigned int min_interesting = output.min_interesting();
00048 raw_buffer_type raw_buffer;
00049
00050 assert( max_encodable > 0 );
00051
00052 while (first != last)
00053 {
00054 unsigned int count = 1;
00055 pattern_type pattern = *first;
00056 Iterator saved_it = first;
00057 ++first;
00058 bool ok = true;
00059
00060
00061 while ( ok && (first != last) && (count < max_encodable) )
00062 if (*first == pattern)
00063 {
00064 ++count;
00065 ++first;
00066 }
00067 else
00068 ok = false;
00069
00070
00071 if ( count >= min_interesting )
00072 {
00073 if ( !raw_buffer.empty() )
00074 {
00075 output.raw( raw_buffer.begin(), raw_buffer.end() );
00076 raw_buffer.clear();
00077 }
00078
00079 output.encode( count, pattern );
00080 }
00081 else
00082 raw_buffer.insert( raw_buffer.end(), saved_it, first );
00083 }
00084
00085
00086 if ( !raw_buffer.empty() )
00087 output.raw( raw_buffer.begin(), raw_buffer.end() );
00088 }