52 template <
typename stream_IT,
typename source_IT,
typename literals_IT = std::
nullptr_t, std::enable_if_t<utils::isCompatibleIter_v<
typename symbolTable_T::source_type, source_IT>,
bool> = true>
53 void process(stream_IT inputEnd, source_IT outputBegin,
size_t messageLength,
size_t nStreams, literals_IT literalsEnd =
nullptr)
const
57 if (messageLength == 0) {
58 LOG(warning) <<
"Empty message passed to decoder, skipping decode process";
63 throw DecodingError(fmt::format(
"Invalid number of decoder streams {}", nStreams));
66 stream_IT inputIter = inputEnd;
68 source_IT outputIter = outputBegin;
69 literals_IT literalsIter = literalsEnd;
71 auto lookupSymbol = [&literalsIter,
this](uint32_t cumulativeFrequency) -> value_type {
72 if constexpr (!std::is_null_pointer_v<literals_IT>) {
73 if (this->
mSymbolTable.isEscapeSymbol(cumulativeFrequency)) {
74 return value_type{*(--literalsIter), this->
mSymbolTable.getEscapeSymbol()};
84 const auto cumul = decoder.get();
85 const value_type symbol = lookupSymbol(cumul);
86#ifdef RANS_LOG_PROCESSED_DATA
87 arrayLogger << symbol.first;
89 return std::make_tuple(symbol.first, decoder.advanceSymbol(inputIter, symbol.second));
93 for (
auto& decoder : decoders) {
94 inputIter = decoder.init(inputIter);
97 const size_t nLoops = messageLength / nStreams;
98 const size_t nLoopRemainder = messageLength % nStreams;
100 for (
size_t i = 0;
i < nLoops; ++
i) {
101#if defined(RANS_OPENMP)
102#pragma omp unroll partial(2)
104 for (
auto& decoder : decoders) {
105 std::tie(*outputIter++, inputIter) =
decode(decoder);
109 for (
size_t i = 0;
i < nLoopRemainder; ++
i) {
110 std::tie(*outputIter++, inputIter) =
decode(decoders[
i]);
113#ifdef RANS_LOG_PROCESSED_DATA
114 LOG(info) <<
"decoderOutput:" << arrayLogger;
120 inline void process(gsl::span<const stream_type> inputStream, gsl::span<source_type> outputStream,
size_t messageLength,
size_t nStreams, literals_IT literalsEnd =
nullptr)
const
122 process(inputStream.data() + inputStream.size(), outputStream.data(), nStreams, literalsEnd);