Advertisement
Guest User

Untitled

a guest
Dec 13th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.17 KB | None | 0 0
  1. n_t Sm::decompress(byte_t* dest, Reader& r)
  2. try
  3. {
  4. const byte_t* const begin_dest(dest), *const end_dest(dest + capacity);
  5. for (;;)
  6. {
  7. byte_t byte(r.READ());
  8. if (byte == 0xFF)
  9. break;
  10.  
  11. unsigned size(1), type(byte >> 5);
  12. if (type != 7)
  13. size += byte & 0x1F;
  14. else
  15. {
  16. type = byte >> 2 & 7;
  17. size += (byte & 3) << 8 | r.READ();
  18. }
  19.  
  20. switch (type)
  21. {
  22. // Direct copy
  23. case 0:
  24. r.READ(dest, size);
  25. break;
  26.  
  27. // Byte fill
  28. case 1:
  29. std::fill_n(dest, size, r.READ());
  30. break;
  31.  
  32. // Word fill
  33. case 2:
  34. {
  35. std::array<byte_t, 2> filler{r.READ(), r.READ()};
  36. for (index_t i{}; i < size; ++i)
  37. dest[i] = filler[i & 1];
  38.  
  39. break;
  40. }
  41.  
  42. // Incrementing fill
  43. case 3:
  44. std::iota(dest, dest + size, r.READ());
  45. break;
  46.  
  47. // Dictionary copy
  48. case 4:
  49. {
  50. // Note that std::copy/memcpy with overlapping ranges is UB
  51. word_t offset(r.get<word_t>());
  52.  
  53. for (index_t i{}; i < size; ++i)
  54. dest[i] = begin_dest[offset + i];
  55.  
  56. break;
  57. }
  58.  
  59. // Inverted dictionary copy
  60. case 5:
  61. {
  62. word_t offset(r.get<word_t>());
  63.  
  64. for (index_t i{}; i < size; ++i)
  65. dest[i] = ~begin_dest[offset + i];
  66.  
  67. break;
  68. }
  69.  
  70. // Sliding dictionary copy
  71. case 6:
  72. {
  73. // Note that std::copy/memcpy with overlapping ranges is UB
  74. byte_t offset(r.READ());
  75.  
  76. for (index_t i{}; i < size; ++i)
  77. dest[i] = dest[i - offset];
  78.  
  79. break;
  80. }
  81.  
  82. // Inverted sliding dictionary copy
  83. case 7:
  84. {
  85. byte_t offset(r.READ());
  86.  
  87. for (index_t i{}; i < size; ++i)
  88. dest[i] = ~dest[i - offset];
  89.  
  90. break;
  91. }
  92. }
  93.  
  94. dest += size;
  95. }
  96.  
  97. return dest - begin_dest;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement