170 lines
5.4 KiB
C++
170 lines
5.4 KiB
C++
// Copyright (C) 2003 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_LZ77_BUFFER_KERNEl_C_
|
|
#define DLIB_LZ77_BUFFER_KERNEl_C_
|
|
|
|
#include "lz77_buffer_kernel_abstract.h"
|
|
#include "../algs.h"
|
|
#include "../assert.h"
|
|
#include <iostream>
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
template <
|
|
typename lz77_base
|
|
>
|
|
class lz77_buffer_kernel_c : public lz77_base
|
|
{
|
|
|
|
public:
|
|
lz77_buffer_kernel_c (
|
|
unsigned long total_limit,
|
|
unsigned long lookahead_limit
|
|
);
|
|
|
|
unsigned char lookahead_buffer (
|
|
unsigned long index
|
|
) const;
|
|
|
|
unsigned char history_buffer (
|
|
unsigned long index
|
|
) const;
|
|
|
|
void shift_buffers (
|
|
unsigned long N
|
|
);
|
|
|
|
|
|
|
|
unsigned long make_safe (
|
|
unsigned long total_limit,
|
|
unsigned long lookahead_limit
|
|
)
|
|
/*!
|
|
ensures
|
|
- if ( 6 < total_limit < 32 &&
|
|
15 < lookahead_limit <= 2^(total_limit-2)
|
|
) then
|
|
- returns total_limit
|
|
- else
|
|
- throws due to failed CASSERT
|
|
!*/
|
|
{
|
|
unsigned long exp_size = (total_limit!=0)?total_limit-2:0;
|
|
unsigned long two_pow_total_limit_minus_2 = 1;
|
|
while (exp_size != 0)
|
|
{
|
|
--exp_size;
|
|
two_pow_total_limit_minus_2 <<= 1;
|
|
}
|
|
|
|
// make sure requires clause is not broken
|
|
DLIB_CASSERT( 6 < total_limit && total_limit < 32 &&
|
|
15 < lookahead_limit && lookahead_limit <= two_pow_total_limit_minus_2,
|
|
"\tlz77_buffer::lz77_buffer(unsigned long,unsigned long)"
|
|
<< "\n\ttotal_limit must be in the range 7 to 31 and \n\tlookahead_limit in the range 15 to 2^(total_limit-2)"
|
|
<< "\n\tthis: " << this
|
|
<< "\n\ttotal_limit: " << total_limit
|
|
<< "\n\tlookahead_limit: " << lookahead_limit
|
|
);
|
|
|
|
return total_limit;
|
|
}
|
|
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
// member function definitions
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename lz77_base
|
|
>
|
|
void lz77_buffer_kernel_c<lz77_base>::
|
|
shift_buffers (
|
|
unsigned long N
|
|
)
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_CASSERT( N <= this->get_lookahead_buffer_size(),
|
|
"\tvoid lz77_buffer::shift_buffers(unsigned long)"
|
|
<< "\n\tN must be <= the number of chars in the lookahead buffer"
|
|
<< "\n\tthis: " << this
|
|
<< "\n\tget_lookahead_buffer_size(): " << this->get_lookahead_buffer_size()
|
|
<< "\n\tN: " << N
|
|
);
|
|
|
|
// call the real function
|
|
lz77_base::shift_buffers(N);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename lz77_base
|
|
>
|
|
unsigned char lz77_buffer_kernel_c<lz77_base>::
|
|
history_buffer (
|
|
unsigned long index
|
|
) const
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_CASSERT( index < this->get_history_buffer_size(),
|
|
"\tunsigned char lz77_buffer::history_buffer(unsigned long) const"
|
|
<< "\n\tindex must be in the range 0 to get_history_buffer_size()-1"
|
|
<< "\n\tthis: " << this
|
|
<< "\n\tget_history_buffer_size(): " << this->get_history_buffer_size()
|
|
<< "\n\tindex: " << index
|
|
);
|
|
|
|
// call the real function
|
|
return lz77_base::history_buffer(index);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename lz77_base
|
|
>
|
|
unsigned char lz77_buffer_kernel_c<lz77_base>::
|
|
lookahead_buffer (
|
|
unsigned long index
|
|
) const
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_CASSERT( index < this->get_lookahead_buffer_size(),
|
|
"\tunsigned char lz77_buffer::lookahead_buffer(unsigned long) const"
|
|
<< "\n\tindex must be in the range 0 to get_lookahead_buffer_size()-1"
|
|
<< "\n\tthis: " << this
|
|
<< "\n\tget_lookahead_buffer_size(): " << this->get_lookahead_buffer_size()
|
|
<< "\n\tindex: " << index
|
|
);
|
|
|
|
// call the real function
|
|
return lz77_base::lookahead_buffer(index);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename lz77_base
|
|
>
|
|
lz77_buffer_kernel_c<lz77_base>::
|
|
lz77_buffer_kernel_c (
|
|
unsigned long total_limit,
|
|
unsigned long lookahead_limit
|
|
) :
|
|
lz77_base(make_safe(total_limit,lookahead_limit),lookahead_limit)
|
|
{
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_LZ77_BUFFER_KERNEl_C_
|
|
|