MCPcopy Create free account
hub / github.com/OpenLoco/OpenLoco / encodeRunLengthSingle

Method encodeRunLengthSingle

src/OpenLoco/src/S5/SawyerStream.cpp:273–319  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

271}
272
273void SawyerStreamWriter::encodeRunLengthSingle(MemoryStream& buffer, std::span<const std::byte> data)
274{
275 auto src = data.data();
276 auto srcEnd = src + data.size();
277 auto srcNormStart = src;
278 uint8_t count = 0;
279
280 while (src < srcEnd - 1)
281 {
282 if ((count != 0 && src[0] == src[1]) || count > 125)
283 {
284 buffer.writeValue(static_cast<std::byte>(count - 1));
285 buffer.write(srcNormStart, count);
286 srcNormStart += count;
287 count = 0;
288 }
289 if (src[0] == src[1])
290 {
291 for (; count < 125 && src + count < srcEnd; count++)
292 {
293 if (src[0] != src[count])
294 {
295 break;
296 }
297 }
298 buffer.writeValue(static_cast<std::byte>(257 - count));
299 buffer.writeValue(src[0]);
300 src += count;
301 srcNormStart = src;
302 count = 0;
303 }
304 else
305 {
306 count++;
307 src++;
308 }
309 }
310 if (src == srcEnd - 1)
311 {
312 count++;
313 }
314 if (count != 0)
315 {
316 buffer.writeValue(static_cast<std::byte>(count - 1));
317 buffer.write(srcNormStart, count);
318 }
319}
320
321void SawyerStreamWriter::encodeRunLengthMulti(MemoryStream& buffer, std::span<const std::byte> data)
322{

Callers

nothing calls this directly

Calls 4

writeValueMethod · 0.80
dataMethod · 0.45
sizeMethod · 0.45
writeMethod · 0.45

Tested by

no test coverage detected