Utf16StringHelper.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using System.Runtime.CompilerServices;
  2. namespace LitMotion
  3. {
  4. internal static class Utf16StringHelper
  5. {
  6. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  7. public static void WriteInt32(ref char[] buffer, ref int bufferOffset, int value)
  8. {
  9. WriteInt64(ref buffer, ref bufferOffset, value);
  10. }
  11. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  12. public static void WriteInt64(ref char[] buffer, ref int bufferOffset, long value)
  13. {
  14. long num1 = value, num2, num3, num4, num5, div;
  15. if (value < 0)
  16. {
  17. if (value == long.MinValue) // -9223372036854775808
  18. {
  19. ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 20);
  20. buffer[bufferOffset++] = '-';
  21. buffer[bufferOffset++] = '9';
  22. buffer[bufferOffset++] = '2';
  23. buffer[bufferOffset++] = '2';
  24. buffer[bufferOffset++] = '3';
  25. buffer[bufferOffset++] = '3';
  26. buffer[bufferOffset++] = '7';
  27. buffer[bufferOffset++] = '2';
  28. buffer[bufferOffset++] = '0';
  29. buffer[bufferOffset++] = '3';
  30. buffer[bufferOffset++] = '6';
  31. buffer[bufferOffset++] = '8';
  32. buffer[bufferOffset++] = '5';
  33. buffer[bufferOffset++] = '4';
  34. buffer[bufferOffset++] = '7';
  35. buffer[bufferOffset++] = '7';
  36. buffer[bufferOffset++] = '5';
  37. buffer[bufferOffset++] = '8';
  38. buffer[bufferOffset++] = '0';
  39. buffer[bufferOffset++] = '8';
  40. }
  41. ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 1);
  42. buffer[bufferOffset++] = '-';
  43. num1 = unchecked(-value);
  44. }
  45. // WriteUInt64(inlined)
  46. if (num1 < 10000)
  47. {
  48. if (num1 < 10) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 1); goto L1; }
  49. if (num1 < 100) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 2); goto L2; }
  50. if (num1 < 1000) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 3); goto L3; }
  51. ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 4); goto L4;
  52. }
  53. else
  54. {
  55. num2 = num1 / 10000;
  56. num1 -= num2 * 10000;
  57. if (num2 < 10000)
  58. {
  59. if (num2 < 10) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 5); goto L5; }
  60. if (num2 < 100) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 6); goto L6; }
  61. if (num2 < 1000) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 7); goto L7; }
  62. ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 8); goto L8;
  63. }
  64. else
  65. {
  66. num3 = num2 / 10000;
  67. num2 -= num3 * 10000;
  68. if (num3 < 10000)
  69. {
  70. if (num3 < 10) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 9); goto L9; }
  71. if (num3 < 100) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 10); goto L10; }
  72. if (num3 < 1000) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 11); goto L11; }
  73. ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 12); goto L12;
  74. }
  75. else
  76. {
  77. num4 = num3 / 10000;
  78. num3 -= num4 * 10000;
  79. if (num4 < 10000)
  80. {
  81. if (num4 < 10) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 13); goto L13; }
  82. if (num4 < 100) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 14); goto L14; }
  83. if (num4 < 1000) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 15); goto L15; }
  84. ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 16); goto L16;
  85. }
  86. else
  87. {
  88. num5 = num4 / 10000;
  89. num4 -= num5 * 10000;
  90. if (num5 < 10000)
  91. {
  92. if (num5 < 10) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 17); goto L17; }
  93. if (num5 < 100) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 18); goto L18; }
  94. if (num5 < 1000) { ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 19); goto L19; }
  95. ArrayHelper.EnsureCapacity(ref buffer, bufferOffset + 20); goto L20;
  96. }
  97. L20:
  98. buffer[bufferOffset++] = (char)('0' + (div = (num5 * 8389L) >> 23));
  99. num5 -= div * 1000;
  100. L19:
  101. buffer[bufferOffset++] = (char)('0' + (div = (num5 * 5243L) >> 19));
  102. num5 -= div * 100;
  103. L18:
  104. buffer[bufferOffset++] = (char)('0' + (div = (num5 * 6554L) >> 16));
  105. num5 -= div * 10;
  106. L17:
  107. buffer[bufferOffset++] = (char)('0' + num5);
  108. }
  109. L16:
  110. buffer[bufferOffset++] = (char)('0' + (div = (num4 * 8389L) >> 23));
  111. num4 -= div * 1000;
  112. L15:
  113. buffer[bufferOffset++] = (char)('0' + (div = (num4 * 5243L) >> 19));
  114. num4 -= div * 100;
  115. L14:
  116. buffer[bufferOffset++] = (char)('0' + (div = (num4 * 6554L) >> 16));
  117. num4 -= div * 10;
  118. L13:
  119. buffer[bufferOffset++] = (char)('0' + num4);
  120. }
  121. L12:
  122. buffer[bufferOffset++] = (char)('0' + (div = (num3 * 8389L) >> 23));
  123. num3 -= div * 1000;
  124. L11:
  125. buffer[bufferOffset++] = (char)('0' + (div = (num3 * 5243L) >> 19));
  126. num3 -= div * 100;
  127. L10:
  128. buffer[bufferOffset++] = (char)('0' + (div = (num3 * 6554L) >> 16));
  129. num3 -= div * 10;
  130. L9:
  131. buffer[bufferOffset++] = (char)('0' + num3);
  132. }
  133. L8:
  134. buffer[bufferOffset++] = (char)('0' + (div = (num2 * 8389L) >> 23));
  135. num2 -= div * 1000;
  136. L7:
  137. buffer[bufferOffset++] = (char)('0' + (div = (num2 * 5243L) >> 19));
  138. num2 -= div * 100;
  139. L6:
  140. buffer[bufferOffset++] = (char)('0' + (div = (num2 * 6554L) >> 16));
  141. num2 -= div * 10;
  142. L5:
  143. buffer[bufferOffset++] = (char)('0' + num2);
  144. }
  145. L4:
  146. buffer[bufferOffset++] = (char)('0' + (div = (num1 * 8389L) >> 23));
  147. num1 -= div * 1000;
  148. L3:
  149. buffer[bufferOffset++] = (char)('0' + (div = (num1 * 5243L) >> 19));
  150. num1 -= div * 100;
  151. L2:
  152. buffer[bufferOffset++] = (char)('0' + (div = (num1 * 6554L) >> 16));
  153. num1 -= div * 10;
  154. L1:
  155. buffer[bufferOffset++] = (char)('0' + num1);
  156. }
  157. }
  158. }