15 #if (defined(_MSC_VER) && (_MSC_VER < 1400)) && !defined(__MWERKS__) 17 typedef std::reverse_bidirectional_iterator<unsigned int *, unsigned int> RevIt;
18 #elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) 19 typedef std::reverse_iterator<unsigned int *, std::random_access_iterator_tag, unsigned int> RevIt;
21 typedef std::reverse_iterator<unsigned int *> RevIt;
25 :
Filter(attachment), m_counting(false), m_bitCount(0), m_buffer(0)
26 , m_bitsBuffered(0), m_bytesBuffered(0)
30 void LowFirstBitWriter::StartCounting()
37 unsigned long LowFirstBitWriter::FinishCounting()
44 void LowFirstBitWriter::PutBits(
unsigned long value,
unsigned int length)
50 m_buffer |= value << m_bitsBuffered;
51 m_bitsBuffered += length;
53 while (m_bitsBuffered >= 8)
55 m_outputBuffer[m_bytesBuffered++] = (byte)m_buffer;
56 if (m_bytesBuffered == m_outputBuffer.
size())
67 void LowFirstBitWriter::FlushBitBuffer()
70 m_bitCount += 8*(m_bitsBuffered > 0);
73 if (m_bytesBuffered > 0)
78 if (m_bitsBuffered > 0)
87 void LowFirstBitWriter::ClearBitBuffer()
103 : symbol(0), parent(0) {}
105 : symbol(rhs.symbol), parent(rhs.parent) {}
108 union {
size_t parent;
unsigned depth, freq;};
113 inline bool operator()(
unsigned int lhs,
const HuffmanNode &rhs) {
return lhs < rhs.freq;}
114 inline bool operator()(
const HuffmanNode &lhs,
const HuffmanNode &rhs)
const {
return lhs.freq < rhs.freq;}
116 inline bool operator()(
const HuffmanNode &lhs,
unsigned int rhs) {
return lhs.freq < rhs;}
119 void HuffmanEncoder::GenerateCodeLengths(
unsigned int *codeBits,
unsigned int maxCodeBits,
const unsigned int *codeCounts,
size_t nCodes)
126 for (i=0; i<nCodes; i++)
129 tree[i].freq = codeCounts[i];
132 size_t treeBegin = std::upper_bound(tree.begin(), tree.end(), 0,
FreqLessThan()) - tree.begin();
133 if (treeBegin == nCodes)
135 std::fill(codeBits, codeBits+nCodes, 0);
138 tree.resize(nCodes + nCodes - treeBegin - 1);
140 size_t leastLeaf = treeBegin, leastInterior = nCodes;
141 for (i=nCodes; i<tree.size(); i++)
144 least = (leastLeaf == nCodes || (leastInterior < i && tree[leastInterior].freq < tree[leastLeaf].freq)) ? leastInterior++ : leastLeaf++;
145 tree[i].freq = tree[least].freq;
146 tree[least].parent = i;
147 least = (leastLeaf == nCodes || (leastInterior < i && tree[leastInterior].freq < tree[leastLeaf].freq)) ? leastInterior++ : leastLeaf++;
148 tree[i].freq += tree[least].freq;
149 tree[least].parent = i;
152 tree[tree.size()-1].depth = 0;
153 if (tree.size() >= 2)
154 for (i=tree.size()-2; i>=nCodes; i--)
155 tree[i].depth = tree[tree[i].parent].depth + 1;
156 unsigned int sum = 0;
158 std::fill(blCount.begin(), blCount.end(), 0);
159 for (i=treeBegin; i<nCodes; i++)
161 const size_t n = tree[i].parent;
162 const size_t depth =
STDMIN(maxCodeBits, tree[n].depth + 1);
164 sum += 1 << (maxCodeBits - depth);
167 unsigned int overflow = sum > (
unsigned int)(1 << maxCodeBits) ? sum - (1 << maxCodeBits) : 0;
171 unsigned int bits = maxCodeBits-1;
172 while (blCount[bits] == 0)
175 blCount[bits+1] += 2;
177 blCount[maxCodeBits]--;
180 for (i=0; i<treeBegin; i++)
181 codeBits[tree[i].symbol] = 0;
182 unsigned int bits = maxCodeBits;
183 for (i=treeBegin; i<nCodes; i++)
185 while (blCount[bits] == 0)
187 codeBits[tree[i].symbol] = bits;
196 unsigned int maxCodeBits = *std::max_element(codeBits, codeBits+nCodes);
197 if (maxCodeBits == 0)
201 std::fill(blCount.
begin(), blCount.
end(), 0);
203 for (i=0; i<nCodes; i++)
204 blCount[codeBits[i]]++;
209 for (i=2; i<=maxCodeBits; i++)
211 code = (code + blCount[i-1]) << 1;
214 CRYPTOPP_ASSERT(maxCodeBits == 1 || code == (1 << maxCodeBits) - blCount[maxCodeBits]);
216 m_valueToCode.resize(nCodes);
217 for (i=0; i<nCodes; i++)
219 unsigned int len = m_valueToCode[i].len = codeBits[i];
221 m_valueToCode[i].code =
BitReverse(nextCode[len]++) >> (8*
sizeof(code_t)-len);
225 inline void HuffmanEncoder::Encode(
LowFirstBitWriter &writer, value_t value)
const 228 writer.PutBits(m_valueToCode[value].code, m_valueToCode[value].len);
235 InitializeStaticEncoders();
243 InitializeStaticEncoders();
247 void Deflator::InitializeStaticEncoders()
249 unsigned int codeLengths[288];
250 std::fill(codeLengths + 0, codeLengths + 144, 8);
251 std::fill(codeLengths + 144, codeLengths + 256, 9);
252 std::fill(codeLengths + 256, codeLengths + 280, 7);
253 std::fill(codeLengths + 280, codeLengths + 288, 8);
254 m_staticLiteralEncoder.
Initialize(codeLengths, 288);
255 std::fill(codeLengths + 0, codeLengths + 32, 5);
256 m_staticDistanceEncoder.
Initialize(codeLengths, 32);
265 m_log2WindowSize = log2WindowSize;
266 DSIZE = 1 << m_log2WindowSize;
268 HSIZE = 1 << m_log2WindowSize;
270 m_byteBuffer.
New(2*DSIZE);
273 m_matchBuffer.
New(DSIZE/2);
280 m_compressibleDeflateLevel = detectUncompressible ? m_deflateLevel : 0;
283 void Deflator::Reset(
bool forceReset)
290 m_headerWritten =
false;
291 m_matchAvailable =
false;
295 m_minLookahead = MAX_MATCH;
296 m_matchBufferEnd = 0;
304 std::fill(m_head.
begin(), m_head.
end(), byte(0));
306 std::fill(m_literalCounts.
begin(), m_literalCounts.
end(), byte(0));
307 std::fill(m_distanceCounts.
begin(), m_distanceCounts.
end(), byte(0));
315 if (deflateLevel == m_deflateLevel)
320 static const unsigned int configurationTable[10][4] = {
330 {32, 128, 258, 1024},
331 {32, 258, 258, 4096}};
333 GOOD_MATCH = configurationTable[deflateLevel][0];
334 MAX_LAZYLENGTH = configurationTable[deflateLevel][1];
335 MAX_CHAIN_LENGTH = configurationTable[deflateLevel][3];
337 m_deflateLevel = deflateLevel;
340 unsigned int Deflator::FillWindow(
const byte *str,
size_t length)
342 unsigned int maxBlockSize = (
unsigned int)
STDMIN(2UL*DSIZE, 0xffffUL);
344 if (m_stringStart >= maxBlockSize - MAX_MATCH)
346 if (m_blockStart < DSIZE)
349 memcpy(m_byteBuffer, m_byteBuffer + DSIZE, DSIZE);
351 m_dictionaryEnd = m_dictionaryEnd < DSIZE ? 0 : m_dictionaryEnd-DSIZE;
353 m_stringStart -= DSIZE;
355 m_previousMatch -= DSIZE;
357 m_blockStart -= DSIZE;
364 for (i=0; i<HSIZE; i++)
367 for (i=0; i<DSIZE; i++)
372 unsigned int accepted =
UnsignedMin(maxBlockSize-(m_stringStart+m_lookahead), length);
374 memcpy(m_byteBuffer + m_stringStart + m_lookahead, str, accepted);
375 m_lookahead += accepted;
379 inline unsigned int Deflator::ComputeHash(
const byte *str)
const 382 return ((str[0] << 10) ^ (str[1] << 5) ^ str[2]) & HMASK;
385 unsigned int Deflator::LongestMatch(
unsigned int &bestMatch)
const 390 unsigned int bestLength =
STDMAX(m_previousLength, (
unsigned int)MIN_MATCH-1);
391 if (m_lookahead <= bestLength)
394 const byte *scan = m_byteBuffer + m_stringStart, *scanEnd = scan +
STDMIN((
unsigned int)MAX_MATCH, m_lookahead);
395 unsigned int limit = m_stringStart > (DSIZE-MAX_MATCH) ? m_stringStart - (DSIZE-MAX_MATCH) : 0;
396 unsigned int current = m_head[ComputeHash(scan)];
398 unsigned int chainLength = MAX_CHAIN_LENGTH;
399 if (m_previousLength >= GOOD_MATCH)
402 while (current > limit && --chainLength > 0)
404 const byte *match = m_byteBuffer + current;
405 CRYPTOPP_ASSERT(scan + bestLength < m_byteBuffer + m_stringStart + m_lookahead);
406 if (scan[bestLength-1] == match[bestLength-1] && scan[bestLength] == match[bestLength] && scan[0] == match[0] && scan[1] == match[1])
409 unsigned int len = (
unsigned int)(
410 #
if defined(_STDEXT_BEGIN) && !(defined(_MSC_VER) && (_MSC_VER < 1400 || _MSC_VER >= 1600)) && !defined(_STLPORT_VERSION)
411 stdext::unchecked_mismatch
416 (stdext::make_unchecked_array_iterator(scan)+3, stdext::make_unchecked_array_iterator(scanEnd), stdext::make_unchecked_array_iterator(match)+3).first - stdext::make_unchecked_array_iterator(scan));
418 (scan+3, scanEnd, match+3).first - scan);
421 if (len > bestLength)
427 if (len == (
unsigned int)(scanEnd - scan))
431 current = m_prev[current & DMASK];
433 return (bestMatch > 0) ? bestLength : 0;
436 inline void Deflator::InsertString(
unsigned int start)
439 unsigned int hash = ComputeHash(m_byteBuffer + start);
440 m_prev[start & DMASK] = m_head[hash];
441 m_head[hash] = word16(start);
444 void Deflator::ProcessBuffer()
446 if (!m_headerWritten)
448 WritePrestreamHeader();
449 m_headerWritten =
true;
452 if (m_deflateLevel == 0)
454 m_stringStart += m_lookahead;
456 m_blockLength = m_stringStart - m_blockStart;
457 m_matchAvailable =
false;
461 while (m_lookahead > m_minLookahead)
463 while (m_dictionaryEnd < m_stringStart && m_dictionaryEnd+3 <= m_stringStart+m_lookahead)
464 InsertString(m_dictionaryEnd++);
466 if (m_matchAvailable)
468 unsigned int matchPosition = 0, matchLength = 0;
469 bool usePreviousMatch;
470 if (m_previousLength >= MAX_LAZYLENGTH)
471 usePreviousMatch =
true;
474 matchLength = LongestMatch(matchPosition);
475 usePreviousMatch = (matchLength == 0);
477 if (usePreviousMatch)
479 MatchFound(m_stringStart-1-m_previousMatch, m_previousLength);
480 m_stringStart += m_previousLength-1;
481 m_lookahead -= m_previousLength-1;
482 m_matchAvailable =
false;
486 m_previousLength = matchLength;
487 m_previousMatch = matchPosition;
488 LiteralByte(m_byteBuffer[m_stringStart-1]);
495 m_previousLength = 0;
496 m_previousLength = LongestMatch(m_previousMatch);
497 if (m_previousLength)
498 m_matchAvailable =
true;
500 LiteralByte(m_byteBuffer[m_stringStart]);
505 CRYPTOPP_ASSERT(m_stringStart - (m_blockStart+m_blockLength) == (
unsigned int)m_matchAvailable);
508 if (m_minLookahead == 0 && m_matchAvailable)
510 LiteralByte(m_byteBuffer[m_stringStart-1]);
511 m_matchAvailable =
false;
515 size_t Deflator::Put2(
const byte *str,
size_t length,
int messageEnd,
bool blocking)
521 while (accepted < length)
523 unsigned int newAccepted = FillWindow(str+accepted, length-accepted);
526 ProcessUncompressedData(str+accepted, newAccepted);
527 accepted += newAccepted;
537 WritePoststreamTail();
541 Output(0, NULLPTR, 0, messageEnd, blocking);
552 m_minLookahead = MAX_MATCH;
555 EncodeBlock(
false, STORED);
559 void Deflator::LiteralByte(byte b)
561 if (m_matchBufferEnd == m_matchBuffer.
size())
564 m_matchBuffer[m_matchBufferEnd++].literalCode = b;
565 m_literalCounts[b]++;
569 void Deflator::MatchFound(
unsigned int distance,
unsigned int length)
571 if (m_matchBufferEnd == m_matchBuffer.
size())
574 static const unsigned int lengthCodes[] = {
575 257, 258, 259, 260, 261, 262, 263, 264, 265, 265, 266, 266, 267, 267, 268, 268,
576 269, 269, 269, 269, 270, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272,
577 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274,
578 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 276, 276, 276, 276, 276, 276,
579 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
580 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
581 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279,
582 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
583 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
584 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281,
585 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
586 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
587 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
588 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283,
589 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284,
590 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 285};
591 static const unsigned int lengthBases[] =
592 {3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,
594 static const unsigned int distanceBases[30] =
595 {1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,
596 4097,6145,8193,12289,16385,24577};
599 EncodedMatch &m = m_matchBuffer[m_matchBufferEnd++];
601 unsigned int lengthCode = lengthCodes[length-3];
602 m.literalCode = lengthCode;
603 m.literalExtra = length - lengthBases[lengthCode-257];
604 unsigned int distanceCode = (
unsigned int)(std::upper_bound(distanceBases, distanceBases+30, distance) - distanceBases - 1);
605 m.distanceCode = distanceCode;
606 m.distanceExtra = distance - distanceBases[distanceCode];
608 m_literalCounts[lengthCode]++;
609 m_distanceCounts[distanceCode]++;
610 m_blockLength += length;
613 inline unsigned int CodeLengthEncode(
const unsigned int *begin,
614 const unsigned int *end,
615 const unsigned int *& p,
616 unsigned int &extraBits,
617 unsigned int &extraBitsLength)
622 const unsigned int *oldp = p;
623 if (v==0 && p[1]==0 && p[2]==0)
625 for (p=p+3; p!=end && *p==0 && p!=oldp+138; p++) {}
626 unsigned int repeat = (
unsigned int)(p - oldp);
629 extraBits = repeat-3;
635 extraBits = repeat-11;
640 else if (p!=begin && v==p[-1] && v==p[1] && v==p[2])
642 for (p=p+3; p!=end && *p==v && p!=oldp+6; p++) {}
643 unsigned int repeat = (
unsigned int)(p - oldp);
644 extraBits = repeat-3;
655 void Deflator::EncodeBlock(
bool eof,
unsigned int blockType)
658 PutBits(blockType, 2);
660 if (blockType == STORED)
671 if (blockType == DYNAMIC)
676 m_literalCounts[256] = 1;
677 HuffmanEncoder::GenerateCodeLengths(literalCodeLengths, 15, m_literalCounts, 286);
678 m_dynamicLiteralEncoder.
Initialize(literalCodeLengths, 286);
679 unsigned int hlit = (
unsigned int)(
FindIfNot(RevIt(literalCodeLengths.
end()), RevIt(literalCodeLengths.
begin()+257), 0).base() - (literalCodeLengths.
begin()+257));
681 HuffmanEncoder::GenerateCodeLengths(distanceCodeLengths, 15, m_distanceCounts, 30);
682 m_dynamicDistanceEncoder.
Initialize(distanceCodeLengths, 30);
683 unsigned int hdist = (
unsigned int)(
FindIfNot(RevIt(distanceCodeLengths.
end()), RevIt(distanceCodeLengths.
begin()+1), 0).base() - (distanceCodeLengths.
begin()+1));
686 memcpy(combinedLengths, literalCodeLengths, (hlit+257)*
sizeof(
unsigned int));
687 memcpy(combinedLengths+hlit+257, distanceCodeLengths, (hdist+1)*
sizeof(
unsigned int));
690 std::fill(codeLengthCodeCounts.
begin(), codeLengthCodeCounts.
end(), 0);
691 const unsigned int *p = combinedLengths.
begin(), *begin = combinedLengths.begin(), *end = combinedLengths.end();
694 unsigned int code=0, extraBits=0, extraBitsLength=0;
695 code = CodeLengthEncode(begin, end, p, extraBits, extraBitsLength);
696 codeLengthCodeCounts[code]++;
698 HuffmanEncoder::GenerateCodeLengths(codeLengthCodeLengths, 7, codeLengthCodeCounts, 19);
700 static const unsigned int border[] = {
701 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
702 unsigned int hclen = 19;
703 while (hclen > 4 && codeLengthCodeLengths[border[hclen-1]] == 0)
711 for (
unsigned int i=0; i<hclen+4; i++)
712 PutBits(codeLengthCodeLengths[border[i]], 3);
714 p = combinedLengths.begin();
717 unsigned int code=0, extraBits=0, extraBitsLength=0;
718 code = CodeLengthEncode(begin, end, p, extraBits, extraBitsLength);
719 codeLengthEncoder.Encode(*
this, code);
720 PutBits(extraBits, extraBitsLength);
724 static const unsigned int lengthExtraBits[] = {
725 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
726 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0};
727 static const unsigned int distanceExtraBits[] = {
728 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
729 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
732 const HuffmanEncoder &literalEncoder = (blockType == STATIC) ? m_staticLiteralEncoder : m_dynamicLiteralEncoder;
733 const HuffmanEncoder &distanceEncoder = (blockType == STATIC) ? m_staticDistanceEncoder : m_dynamicDistanceEncoder;
735 for (
unsigned int i=0; i<m_matchBufferEnd; i++)
737 unsigned int literalCode = m_matchBuffer[i].literalCode;
738 literalEncoder.Encode(*
this, literalCode);
739 if (literalCode >= 257)
742 PutBits(m_matchBuffer[i].literalExtra, lengthExtraBits[literalCode-257]);
743 unsigned int distanceCode = m_matchBuffer[i].distanceCode;
744 distanceEncoder.Encode(*
this, distanceCode);
745 PutBits(m_matchBuffer[i].distanceExtra, distanceExtraBits[distanceCode]);
748 literalEncoder.Encode(*
this, 256);
752 void Deflator::EndBlock(
bool eof)
754 if (m_blockLength == 0 && !eof)
757 if (m_deflateLevel == 0)
759 EncodeBlock(eof, STORED);
761 if (m_compressibleDeflateLevel > 0 && ++m_detectCount == m_detectSkip)
763 m_deflateLevel = m_compressibleDeflateLevel;
769 unsigned long storedLen = 8*((
unsigned long)m_blockLength+4) +
RoundUpToMultipleOf(m_bitsBuffered+3, 8U)-m_bitsBuffered;
772 EncodeBlock(eof, STATIC);
773 unsigned long staticLen = FinishCounting();
775 unsigned long dynamicLen;
776 if (m_blockLength < 128 && m_deflateLevel < 8)
777 dynamicLen = ULONG_MAX;
781 EncodeBlock(eof, DYNAMIC);
782 dynamicLen = FinishCounting();
785 if (storedLen <= staticLen && storedLen <= dynamicLen)
787 EncodeBlock(eof, STORED);
789 if (m_compressibleDeflateLevel > 0)
793 m_detectSkip = m_detectSkip ?
STDMIN(2*m_detectSkip, 128U) : 1;
798 if (staticLen <= dynamicLen)
799 EncodeBlock(eof, STATIC);
801 EncodeBlock(eof, DYNAMIC);
803 if (m_compressibleDeflateLevel > 0)
808 m_matchBufferEnd = 0;
809 m_blockStart += m_blockLength;
811 std::fill(m_literalCounts.
begin(), m_literalCounts.
end(), 0);
812 std::fill(m_distanceCounts.
begin(), m_distanceCounts.
end(), 0);
int GetIntValueWithDefault(const char *name, int defaultValue) const
Get a named value with type int, with default.
iterator end()
Provides an iterator pointing beyond the last element in the memory block.
InputIt FindIfNot(InputIt first, InputIt last, const T &value)
Finds first element not in a range.
An invalid argument was detected.
Stack-based SecBlock that grows into the heap.
Utility functions for the Crypto++ library.
T GetValueWithDefault(const char *name, T defaultValue) const
Get a named value.
void New(size_type newSize)
Change size without preserving contents.
bool IsolatedFlush(bool hardFlush, bool blocking)
Flushes data buffered by this object, without signal propagation.
DEFLATE compression and decompression (RFC 1951)
byte BitReverse(byte value)
Reverses bits in a 8-bit value.
byte order is little-endian
AlgorithmParameters MakeParameters(const char *name, const T &value, bool throwIfNotUsed=true)
Create an object that implements NameValuePairs.
Minimum deflation level, fastest speed (0)
BufferedTransformation * AttachedTransformation()
Retrieve attached transformation.
T1 SaturatingSubtract(const T1 &a, const T2 &b)
Performs a saturating subtract clamped at 0.
const T1 UnsignedMin(const T1 &a, const T2 &b)
Safe comparison of values that could be neagtive and incorrectly promoted.
Maximum window size, largest table (15)
#define COUNTOF(arr)
Counts elements in an array.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
HuffmanEncoder()
Construct a HuffmanEncoder.
void SetDeflateLevel(int deflateLevel)
Sets the deflation level.
iterator begin()
Provides an iterator pointing to the first element in the memory block.
Default deflation level, compromise between speed (6)
Deflator(BufferedTransformation *attachment=NULL, int deflateLevel=DEFAULT_DEFLATE_LEVEL, int log2WindowSize=DEFAULT_LOG2_WINDOW_SIZE, bool detectUncompressible=true)
Construct a Deflator compressor.
LowFirstBitWriter(BufferedTransformation *attachment)
Construct a LowFirstBitWriter.
void Initialize(const unsigned int *codeBits, unsigned int nCodes)
Initialize or reinitialize this object.
Implementation of BufferedTransformation's attachment interface.
std::string IntToString(T value, unsigned int base=10)
Converts a value to a string.
size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking)
Input multiple bytes for processing.
T1 RoundUpToMultipleOf(const T1 &n, const T2 &m)
Rounds a value up to a multiple of a second value.
const T & STDMAX(const T &a, const T &b)
Replacement function for std::max.
Minimum deflation level, slowest speed (9)
Crypto++ library namespace.
Minimum window size, smallest table (9)
void IsolatedInitialize(const NameValuePairs ¶meters)
Initialize or reinitialize this object, without signal propagation.
size_type size() const
Provides the count of elements in the SecBlock.
Interface for retrieving values given their names.