24#include "rawspeedconfig.h"
41template <
typename CodeTag>
67 std::vector<CodeSymbol> symbols;
82 symbols.emplace_back(code, l);
111 ThrowRDE(
"Codes-per-length table is empty");
118 if (count > Traits::MaxNumCodeValues)
119 ThrowRDE(
"Too big code-values table");
122 unsigned maxCodes = 2;
124 for (
auto codeLen = 1UL; codeLen <
nCodesPerLength.size(); codeLen++) {
128 const auto maxCodesInCurrLen = (1U << codeLen);
130 if (nCodes > maxCodesInCurrLen) {
131 ThrowRDE(
"Corrupt Huffman. Can never have %u codes in %lu-bit len",
136 if (nCodes > maxCodes) {
138 "Corrupt Huffman. Can only fit %u out of %u codes in %lu-bit len",
139 maxCodes, nCodes, codeLen);
157 std::copy(data.
begin(), data.
end(), std::back_inserter(this->codeValues));
161 if (cValue <= Traits::MaxCodeValue)
163 ThrowRDE(
"Corrupt Huffman code: code value %u is larger than maximum %u",
164 cValue, Traits::MaxCodeValue);
assert(dim.area() >=area)
CodeTraits< CodeTag > Traits
std::vector< CodeValueTy > codeValues
AbstractPrefixCode()=default
int RAWSPEED_READONLY size() const
const uint8_t * begin() const
const uint8_t * end() const
size_type RAWSPEED_READONLY getSize() const
typename AbstractPrefixCode< CodeTag >::Traits Traits
size_t RAWSPEED_READONLY maxCodeLength() const
uint32_t setNCodesPerLength(Buffer data)
std::vector< unsigned int > nCodesPerLength
AbstractPrefixCode< CodeTag > Parent
bool operator==(const HuffmanCode &other) const
std::vector< CodeSymbol > generateCodeSymbols() const
typename AbstractPrefixCode< CodeTag >::CodeSymbol CodeSymbol
void setCodeValues(Array1DRef< const typename Traits::CodeValueTy > data)
unsigned int RAWSPEED_READONLY maxCodesCount() const