// Copyright (C) 2003 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #undef DLIB_ENTROPY_ENCODER_KERNEl_ABSTRACT_ #ifdef DLIB_ENTROPY_ENCODER_KERNEl_ABSTRACT_ #include "../algs.h" #include <iosfwd> #include "../uintn.h" namespace dlib { class entropy_encoder { /*! INITIAL VALUE stream_is_set() == false WHAT THIS OBJECT REPRESENTS This object represents an entropy encoder (could be implemented as an arithmetic encoder for example). Note that all implementations of entropy_encoder and entropy_decoder are paired. This means that if you use entropy_encoder_kernel_n to encode something then you must use the corresponding entropy_decoder_kernel_n to decode it. NOTATION: At any moment each symbol has a certain probability of appearing in the input stream. These probabilities may change as each symbol is encountered and the probability model is updated accordingly. let P(i) be a function which gives the probability of seeing the ith symbol of an N symbol alphabet BEFORE the probability model is updated to account for the current symbol. ( The domain of P(i) is from 0 to N-1. ) for each i: P(i) == COUNT/TOTAL where COUNT and TOTAL are integers. and TOTAL is the same number for all P(i) but COUNT may vary. let LOW_COUNT(i) be the sum of all P(x)*TOTAL from x == 0 to x == i-1 (note that LOW_COUNT(0) == 0) let HIGH_COUNT(i) be the sum of all P(x)*TOTAL from x == 0 to x == i !*/ public: entropy_encoder ( ); /*! ensures - #*this is properly initialized throws - std::bad_alloc !*/ virtual ~entropy_encoder ( ); /*! ensures - all memory associated with *this has been released - if (stream_is_set()) then - any buffered data in *this will be written to get_stream() !*/ void clear( ); /*! ensures - #*this has its initial value - if (stream_is_set()) then - any buffered data in *this will be written to get_stream() - clears any memory of all previous calls to encode() from #*this throws - std::ios_base::failure if (stream_is_set() && there was a problem writing to get_stream()) then this exception will be thrown. #*this will be unusable until clear() is called and succeeds - any other exception if this exception is thrown then #*this is unusable until clear() is called and succeeds !*/ void set_stream ( std::ostream& out ); /*! ensures - #get_stream() == out - #stream_is_set() == true - if (stream_is_set()) then - any buffered data in *this will be written to get_stream() - clears any memory of all previous calls to encode() from #*this throws - std::ios_base::failure if (stream_is_set() && there was a problem writing to get_stream()) then this exception will be thrown. #*this will be unusable until clear() is called and succeeds - any other exception if this exception is thrown then #*this is unusable until clear() is called and succeeds !*/ bool stream_is_set ( ) const; /*! ensures - returns true if a stream has been associated with *this by calling set_stream() !*/ std::ostream& get_stream ( ) const; /*! requires - stream_is_set() == true ensures - returns a reference to the ostream object that *this writes its encoded data to !*/ void encode ( uint32 low_count, uint32 high_count, uint32 total ); /*! requires - 0 < total < 65536 (2^16) - total == TOTAL - low_count < high_count <= total - stream_is_set() == true ensures - encodes the symbol S where: - LOW_COUNT(S) == low_count - HIGH_COUNT(S) == high_count throws - std::ios_base::failure if (there was a problem writing to get_stream()) then this exception will be thrown. #*this will be unusable until clear() is called and succeeds - any other exception if this exception is thrown then #*this is unusable until clear() is called and succeeds !*/ private: // restricted functions entropy_encoder(entropy_encoder&); // copy constructor entropy_encoder& operator=(entropy_encoder&); // assignment operator }; } #endif // DLIB_ENTROPY_ENCODER_KERNEl_ABSTRACT_