Advertisement
Guest User

Untitled

a guest
Nov 24th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.71 KB | None | 0 0
  1. #ifndef HUFFMAN_H
  2. #define HUFFMAN_H
  3.  
  4. #include <cstdio>
  5. #include <bitset>
  6.  
  7. // void* : "n, sign, 4 digits each except first int"
  8.  
  9. static const int NUMBER_OF_DIGITS = 10;
  10.  
  11. static const int SIZE_OF_INT_IN_NUMBER = 4;
  12.  
  13. template <size_t size>
  14. class Huffman {
  15.  
  16. public :
  17.  
  18. Huffman(short *encodingSizeDigits, std::bitset<NUMBER_OF_DIGITS> *encodingDigits, void *number) {
  19. for (int i = 0; i < NUMBER_OF_DIGITS; ++i) {
  20. this->encodingSizeDigits[i] = encodingSizeDigits[i];
  21. this->encodingDigits[i] = encodingDigits[i];
  22. }
  23.  
  24. int *num = (int *)number;
  25. sign = (bool)num[1];
  26. numberOfArrays = (size_t)num[0];
  27.  
  28. int n = num[0];
  29. size_t sz = 0;
  30. for (int i = 2; n > 0; ++i, --n) {
  31. if (i == 2) {
  32. addDigitFirstInt(sz, num[i]);
  33. } else {
  34. addDigitNotFirstInt(sz, num[i]);
  35. }
  36. }
  37. }
  38.  
  39. friend size_t calculateHuffmanParameters(short *encodingSizeDigits, std::bitset<NUMBER_OF_DIGITS> *encodingDigits, void *number) {
  40. return 0;
  41. }
  42.  
  43. void *getNumber() {
  44. size_t sz = size;
  45. int *number = new int[numberOfArrays + 2];
  46. number[0] = int(numberOfArrays);
  47. number[1] = sign;
  48. for (size_t position = numberOfArrays + 1; position > 1; --position) {
  49. short *digits = new short[SIZE_OF_INT_IN_NUMBER];
  50. int j = 0;
  51. if (position == 2) {
  52. while (sz > 0) {
  53. for (j = SIZE_OF_INT_IN_NUMBER; j > 0; --j) {
  54. digits[j - 1] = getDigit(sz);
  55. sz -= encodingSizeDigits[digits[j - 1]];
  56. }
  57. }
  58. } else {
  59. for (j = SIZE_OF_INT_IN_NUMBER; j > 0; --j) {
  60. digits[j - 1] = getDigit(sz);
  61. sz -= encodingSizeDigits[digits[j - 1]];
  62. }
  63. }
  64. int value = 0;
  65. for (; j < SIZE_OF_INT_IN_NUMBER; ++j) {
  66. value = value * 10 + digits[j];
  67. }
  68. number[position] = value;
  69. }
  70. return number;
  71. }
  72.  
  73. private :
  74.  
  75. size_t numberOfArrays; // для более простого восстановления
  76. bool sign;
  77. std::bitset<size> data;
  78.  
  79. short encodingSizeDigits[NUMBER_OF_DIGITS];
  80. std::bitset<NUMBER_OF_DIGITS> encodingDigits[NUMBER_OF_DIGITS];
  81.  
  82. void addDigitFirstInt(size_t &sz, int value) {
  83. if (value >= 10) {
  84. addDigitFirstInt(sz, value / 10);
  85. }
  86. short digit = short(value % 10);
  87. for (short j = 0; j < encodingSizeDigits[digit]; ++j) {
  88. data[sz++] = encodingDigits[digit][j];
  89. }
  90. }
  91.  
  92. void addDigitNotFirstInt(size_t &sz, int value, int depth = 0) {
  93. if (depth == SIZE_OF_INT_IN_NUMBER) {
  94. return;
  95. }
  96. addDigitNotFirstInt(sz, value / 10, depth + 1);
  97. short digit = short(value % 10);
  98. for (short j = 0; j < encodingSizeDigits[digit]; ++j) {
  99. data[sz++] = encodingDigits[digit][j];
  100. }
  101. }
  102.  
  103. short getDigit(size_t &sz) {
  104. for (short digit = 0; digit < NUMBER_OF_DIGITS; ++digit) {
  105. if (size < encodingSizeDigits[digit]) {
  106. continue;
  107. }
  108. bool mark = true;
  109. for (short j = 0; j < encodingSizeDigits[digit]; ++j) {
  110. if (data[sz - j - 1] != encodingDigits[digit][encodingSizeDigits[digit] - j - 1]) {
  111. mark = false;
  112. break;
  113. }
  114. }
  115. if (mark) {
  116. return digit;
  117. }
  118. }
  119. }
  120.  
  121. };
  122.  
  123.  
  124. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement