131 lines
4.1 KiB
C++
131 lines
4.1 KiB
C++
// Copyright (C) 2005 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#undef DLIB_LZP_BUFFER_KERNEl_ABSTRACT_
|
|
#ifdef DLIB_LZP_BUFFER_KERNEl_ABSTRACT_
|
|
|
|
#include "../algs.h"
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
class lzp_buffer
|
|
{
|
|
/*!
|
|
INITIAL VALUE
|
|
size() == some value defined by the constructor argument
|
|
Initially this object is at some predefined empty or ground state.
|
|
for all i: (*this)[i] == 0
|
|
|
|
WHAT THIS OBJECT REPRESENTS
|
|
This object represents some varation on the LZP algorithm
|
|
described by Charles Bloom in his paper "LZP: a new data
|
|
compression algorithm"
|
|
|
|
The LZP algorithm is a lot like lz77 except there is no need to pass
|
|
the location of matches in the history buffer to the decoder because
|
|
LZP uses the data it has already seen to predict the location of the
|
|
next match.
|
|
|
|
NOTE
|
|
The add() and predict_match() functions must be called in the same
|
|
order by the coder and decoder. If they aren't the state of the
|
|
lzp_buffer objects in the coder and decoder may differ and the decoder
|
|
won't be able to correctly decode the data stream.
|
|
!*/
|
|
|
|
public:
|
|
|
|
explicit lzp_buffer (
|
|
unsigned long buffer_size
|
|
);
|
|
/*!
|
|
requires
|
|
- 10 < buffer_size < 32
|
|
ensures
|
|
- #*this is properly initialized
|
|
- #size() == 2^buffer_size
|
|
throws
|
|
- std::bad_alloc
|
|
!*/
|
|
|
|
virtual ~lzp_buffer (
|
|
);
|
|
/*!
|
|
ensures
|
|
- any resources associated with *this have been released
|
|
!*/
|
|
|
|
void clear(
|
|
);
|
|
/*!
|
|
ensures
|
|
- #*this has its initial value
|
|
throws
|
|
- std::bad_alloc
|
|
if this exception is thrown then #*this is unusable
|
|
until clear() is called and succeeds
|
|
!*/
|
|
|
|
void add (
|
|
unsigned char symbol
|
|
);
|
|
/*!
|
|
ensures
|
|
- shifts everything in the history buffer left 1.
|
|
(i.e. #(*this)[i+1] == (*this)[i])
|
|
- #(*this)[0] == symbol
|
|
throws
|
|
- std::bad_alloc
|
|
if this exception is thrown then #*this is unusable
|
|
until clear() is called and succeeds
|
|
!*/
|
|
|
|
unsigned long predict_match (
|
|
unsigned long& index
|
|
);
|
|
/*!
|
|
ensures
|
|
- updates the prediction for the current context.
|
|
(the current context is the last few symbols seen. i.e. (*this)[0],
|
|
(*this)[1], etc.)
|
|
- if (*this can generate a prediction) then
|
|
- #index == the predicted location of a match in the history buffer.
|
|
(i.e. (*this)[#index] is the first symbol of the predicted match)
|
|
- returns the order this prediction came from
|
|
- else
|
|
- returns 0
|
|
throws
|
|
- std::bad_alloc
|
|
if this exception is thrown then #*this is unusable
|
|
until clear() is called and succeeds
|
|
!*/
|
|
|
|
size_t size (
|
|
) const;
|
|
/*!
|
|
ensures
|
|
- returns the size of the history buffer
|
|
!*/
|
|
|
|
unsigned char operator[] (
|
|
unsigned long index
|
|
) const;
|
|
/*!
|
|
requires
|
|
- index < size()
|
|
ensures
|
|
- returns the symbol at the given index in the history buffer
|
|
!*/
|
|
|
|
private:
|
|
|
|
// restricted functions
|
|
lzp_buffer(const lzp_buffer&); // copy constructor
|
|
lzp_buffer& operator=(const lzp_buffer&); // assignment operator
|
|
|
|
};
|
|
}
|
|
|
|
#endif // DLIB_LZP_BUFFER_KERNEl_ABSTRACT_
|
|
|