7 template<
typename ValueType,
typename LengthType>
12 template<
typename ValueType,
typename LengthType>
17 template<
typename ValueType,
typename LengthType>
21 return uUncompressedInputSize *
sizeof(Run);
24 template<
typename ValueType,
typename LengthType>
27 if(uSrcLength %
sizeof(ValueType) != 0)
29 POLYVOX_THROW(std::length_error,
"Source length must be a integer multiple of the ValueType size");
33 uSrcLength /=
sizeof(ValueType);
34 uDstLength /=
sizeof(Run);
37 ValueType* pSrcDataAsType =
reinterpret_cast<ValueType*
>(pSrcData);
38 Run* pDstDataAsRun =
reinterpret_cast<Run*
>(pDstData);
41 ValueType* pSrcDataEnd = pSrcDataAsType + uSrcLength;
42 Run* pDstDataEnd = pDstDataAsRun + uDstLength;
48 pDstDataAsRun->value = *pSrcDataAsType;
50 pDstDataAsRun->length = 1;
51 uDstLengthInBytes +=
sizeof(Run);
54 while(pSrcDataAsType < pSrcDataEnd)
58 if((*pSrcDataAsType == pDstDataAsRun->value) && (pDstDataAsRun->length < (std::numeric_limits<LengthType>::max)()))
60 pDstDataAsRun->length++;
68 if(pDstDataAsRun >= pDstDataEnd)
70 POLYVOX_THROW(std::runtime_error,
"Insufficient space in destination buffer.");
74 pDstDataAsRun->value = *pSrcDataAsType;
75 pDstDataAsRun->length = 1;
76 uDstLengthInBytes +=
sizeof(Run);
82 return uDstLengthInBytes;
85 template<
typename ValueType,
typename LengthType>
88 if(uSrcLength %
sizeof(Run) != 0)
90 POLYVOX_THROW(std::length_error,
"Source length must be a integer multiple of the Run size");
94 uSrcLength /=
sizeof(Run);
95 uDstLength /=
sizeof(ValueType);
98 Run* pSrcDataAsRun =
reinterpret_cast<Run*
>(pSrcData);
99 ValueType* pDstDataAsType =
reinterpret_cast<ValueType*
>(pDstData);
102 Run* pSrcDataEnd = pSrcDataAsRun + uSrcLength;
103 ValueType* pDstDataEnd = pDstDataAsType + uDstLength;
108 while(pSrcDataAsRun < pSrcDataEnd)
111 if(pDstDataAsType + pSrcDataAsRun->length > pDstDataEnd)
113 POLYVOX_THROW(std::runtime_error,
"Insufficient space in destination buffer.");
117 std::fill(pDstDataAsType, pDstDataAsType + pSrcDataAsRun->length, pSrcDataAsRun->value);
118 pDstDataAsType += pSrcDataAsRun->length;
120 uDstLengthInBytes += pSrcDataAsRun->length *
sizeof(ValueType);
124 return uDstLengthInBytes;