16#ifndef RANS_INTERNAL_ENCODE_SINGLESTREAMENCODERIMPL_H_
17#define RANS_INTERNAL_ENCODE_SINGLESTREAMENCODERIMPL_H_
31template <
size_t streamingLowerBound_V,
typename symbol_T,
typename derived_T>
33 SingleStreamEncoderImplBase<streamingLowerBound_V, symbol_T, derived_T>>
46 template <
typename stream_IT>
47 [[nodiscard]]
inline stream_IT
flush(stream_IT outputIter)
57 template <
typename Stream_IT>
60 return static_cast<derived_T*
>(
this)->
putSymbols(outputIter, encodeSymbols);
63 template <
typename Stream_IT>
66 assert(nActiveStreams == 1);
75 template <
typename stream_IT>
76 [[nodiscard]]
inline std::tuple<state_type, stream_IT>
renorm(
state_type state, stream_IT outputIter,
typename std::remove_pointer_t<
typename std::remove_cv_t<symbol_type>>::value_type frequency)
79 if (
state >= maxState) {
82 assert(
state < maxState);
85 return {
state, outputIter};
92template <
size_t lowerBound_V>
110 template <
typename stream_IT>
113 assert(symbol->getFrequency() != 0);
115 const auto [newState, streamPosition] = this->
renorm(this->
mState, outputIter, symbol->getFrequency());
117 this->
mState = ((newState / symbol->getFrequency()) << this->
mSymbolTablePrecision) + symbol->getCumulative() + (newState % symbol->getFrequency());
119 return streamPosition;
123#ifdef RANS_SINGLE_STREAM
124template <
size_t lowerBound_V>
125class SingleStreamEncoderImpl :
public SingleStreamEncoderImplBase<lowerBound_V, const PrecomputedSymbol*, SingleStreamEncoderImpl<lowerBound_V>>
127 using base_type = SingleStreamEncoderImplBase<lowerBound_V, const PrecomputedSymbol*, SingleStreamEncoderImpl<lowerBound_V>>;
128 __extension__
using uint128_t =
unsigned __int128;
131 using stream_type =
typename base_type::stream_type;
132 using state_type =
typename base_type::state_type;
133 using symbol_type =
typename base_type::symbol_type;
134 using size_type =
typename base_type::size_type;
135 using difference_type =
typename base_type::difference_type;
138 SingleStreamEncoderImpl() =
default;
139 explicit SingleStreamEncoderImpl(size_type symbolTablePrecission) noexcept : base_type{symbolTablePrecission} {};
141 using base_type::putSymbols;
143 template <
typename stream_IT>
144 [[nodiscard]]
inline stream_IT putSymbols(stream_IT outputIter,
const symbol_type& symbol)
146 assert(symbol->getFrequency() != 0);
148 const auto [newState, streamPosition] = this->
renorm(this->mState, outputIter, symbol->getFrequency());
150 state_type quotient =
static_cast<state_type
>((
static_cast<uint128_t
>(newState) * symbol->getReciprocalFrequency()) >> 64);
151 quotient = quotient >> symbol->getReciprocalShift();
152 this->mState = newState + symbol->getCumulative() + quotient * symbol->getFrequencyComplement();
154 return streamPosition;
Defines the common operations for encoding data onto an rANS stream.
Contains statistical information for one source symbol, required for encoding/decoding.
common helper classes and functions
std::tuple< ransState_t, stream_IT > renorm(ransState_t state, stream_IT outputIter, count_t frequency, size_t symbolTablePrecision)
typename base_type::difference_type difference_type
CompatEncoderImpl()=default
typename base_type::stream_type stream_type
CompatEncoderImpl(size_type symbolTablePrecission) noexcept
typename base_type::state_type state_type
typename base_type::symbol_type symbol_type
typename base_type::size_type size_type
stream_IT putSymbols(stream_IT outputIter, const symbol_type &symbol)
std::ptrdiff_t difference_type
static constexpr state_type getStreamingLowerBound() noexcept
static constexpr state_type getStreamOutTypeBits() noexcept
size_type mSymbolTablePrecision
Stream_IT putSymbols(Stream_IT outputIter, const symbol_type &encodeSymbols, size_type nActiveStreams)
typename base_type::state_type state_type
SingleStreamEncoderImplBase(size_t symbolTablePrecision) noexcept
static constexpr size_type getNstreams() noexcept
std::tuple< state_type, stream_IT > renorm(state_type state, stream_IT outputIter, typename std::remove_pointer_t< typename std::remove_cv_t< symbol_type > >::value_type frequency)
typename base_type::symbol_type symbol_type
stream_IT flush(stream_IT outputIter)
static constexpr state_type getStreamingLowerBound() noexcept
typename base_type::stream_type stream_type
typename base_type::size_type size_type
Stream_IT putSymbols(Stream_IT outputIter, const symbol_type &encodeSymbols)
typename base_type::difference_type difference_type
SingleStreamEncoderImplBase()=default
constexpr size_t pow2(size_t n) noexcept