Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Utf8Formatter.cs
Go to the documentation of this file.
5using System.Text;
6
7namespace System.Buffers.Text;
8
9public static class Utf8Formatter
10{
11 [StructLayout(LayoutKind.Explicit)]
12 private struct DecomposedGuid
13 {
14 [FieldOffset(0)]
15 public Guid Guid;
16
17 [FieldOffset(0)]
18 public byte Byte00;
19
20 [FieldOffset(1)]
21 public byte Byte01;
22
23 [FieldOffset(2)]
24 public byte Byte02;
25
26 [FieldOffset(3)]
27 public byte Byte03;
28
29 [FieldOffset(4)]
30 public byte Byte04;
31
32 [FieldOffset(5)]
33 public byte Byte05;
34
35 [FieldOffset(6)]
36 public byte Byte06;
37
38 [FieldOffset(7)]
39 public byte Byte07;
40
41 [FieldOffset(8)]
42 public byte Byte08;
43
44 [FieldOffset(9)]
45 public byte Byte09;
46
47 [FieldOffset(10)]
48 public byte Byte10;
49
50 [FieldOffset(11)]
51 public byte Byte11;
52
53 [FieldOffset(12)]
54 public byte Byte12;
55
56 [FieldOffset(13)]
57 public byte Byte13;
58
59 [FieldOffset(14)]
60 public byte Byte14;
61
62 [FieldOffset(15)]
63 public byte Byte15;
64 }
65
66 private static readonly uint[] s_dayAbbreviations = new uint[7] { 7238995u, 7237453u, 6649172u, 6579543u, 7694420u, 6910534u, 7627091u };
67
68 private static readonly uint[] s_dayAbbreviationsLowercase = new uint[7] { 7239027u, 7237485u, 6649204u, 6579575u, 7694452u, 6910566u, 7627123u };
69
70 private static readonly uint[] s_monthAbbreviations = new uint[12]
71 {
72 7233866u, 6448454u, 7496013u, 7499841u, 7954765u, 7238986u, 7107914u, 6780225u, 7365971u, 7627599u,
73 7761742u, 6513988u
74 };
75
76 private static readonly uint[] s_monthAbbreviationsLowercase = new uint[12]
77 {
78 7233898u, 6448486u, 7496045u, 7499873u, 7954797u, 7239018u, 7107946u, 6780257u, 7366003u, 7627631u,
79 7761774u, 6514020u
80 };
81
82 public static bool TryFormat(bool value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
83 {
84 char symbolOrDefault = FormattingHelpers.GetSymbolOrDefault(in format, 'G');
85 if (value)
86 {
87 if (symbolOrDefault == 'G')
88 {
90 {
91 goto IL_0033;
92 }
93 }
94 else
95 {
96 if (symbolOrDefault != 'l')
97 {
98 goto IL_0083;
99 }
101 {
102 goto IL_0033;
103 }
104 }
105 }
106 else if (symbolOrDefault == 'G')
107 {
108 if (4u < (uint)destination.Length)
109 {
111 goto IL_006e;
112 }
113 }
114 else
115 {
116 if (symbolOrDefault != 'l')
117 {
118 goto IL_0083;
119 }
120 if (4u < (uint)destination.Length)
121 {
123 goto IL_006e;
124 }
125 }
126 bytesWritten = 0;
127 return false;
128 IL_006e:
129 destination[4] = 101;
130 bytesWritten = 5;
131 return true;
132 IL_0083:
133 return FormattingHelpers.TryFormatThrowFormatException(out bytesWritten);
134 IL_0033:
135 bytesWritten = 4;
136 return true;
137 }
138
139 public static bool TryFormat(DateTimeOffset value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
140 {
142 char c = format.Symbol;
143 if (format.IsDefault)
144 {
145 c = 'G';
146 offset = value.Offset;
147 }
148 return c switch
149 {
150 'R' => TryFormatDateTimeR(value.UtcDateTime, destination, out bytesWritten),
151 'l' => TryFormatDateTimeL(value.UtcDateTime, destination, out bytesWritten),
152 'O' => TryFormatDateTimeO(value.DateTime, value.Offset, destination, out bytesWritten),
153 'G' => TryFormatDateTimeG(value.DateTime, offset, destination, out bytesWritten),
154 _ => FormattingHelpers.TryFormatThrowFormatException(out bytesWritten),
155 };
156 }
157
158 public static bool TryFormat(DateTime value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
159 {
160 return FormattingHelpers.GetSymbolOrDefault(in format, 'G') switch
161 {
162 'R' => TryFormatDateTimeR(value, destination, out bytesWritten),
163 'l' => TryFormatDateTimeL(value, destination, out bytesWritten),
166 _ => FormattingHelpers.TryFormatThrowFormatException(out bytesWritten),
167 };
168 }
169
170 private static bool TryFormatDateTimeG(DateTime value, TimeSpan offset, Span<byte> destination, out int bytesWritten)
171 {
172 int num = 19;
174 {
175 num += 7;
176 }
177 if (destination.Length < num)
178 {
179 bytesWritten = 0;
180 return false;
181 }
182 bytesWritten = num;
183 byte b = destination[18];
184 value.GetDate(out var year, out var month, out var day);
185 value.GetTime(out var hour, out var minute, out var second);
187 destination[2] = 47;
189 destination[5] = 47;
191 destination[10] = 32;
193 destination[13] = 58;
195 destination[16] = 58;
198 {
199 int num2 = (int)(offset.Ticks / 600000000);
200 byte b2;
201 if (num2 < 0)
202 {
203 b2 = 45;
204 num2 = -num2;
205 }
206 else
207 {
208 b2 = 43;
209 }
210 int result;
211 int value2 = Math.DivRem(num2, 60, out result);
213 destination[23] = 58;
215 destination[20] = b2;
216 destination[19] = 32;
217 }
218 return true;
219 }
220
221 private static bool TryFormatDateTimeL(DateTime value, Span<byte> destination, out int bytesWritten)
222 {
223 if (28u >= (uint)destination.Length)
224 {
225 bytesWritten = 0;
226 return false;
227 }
228 value.GetDate(out var year, out var month, out var day);
229 value.GetTime(out var hour, out var minute, out var second);
230 uint num = s_dayAbbreviationsLowercase[(int)value.DayOfWeek];
231 destination[0] = (byte)num;
232 num >>= 8;
233 destination[1] = (byte)num;
234 num >>= 8;
235 destination[2] = (byte)num;
236 destination[3] = 44;
237 destination[4] = 32;
239 destination[7] = 32;
240 uint num2 = s_monthAbbreviationsLowercase[month - 1];
241 destination[8] = (byte)num2;
242 num2 >>= 8;
243 destination[9] = (byte)num2;
244 num2 >>= 8;
245 destination[10] = (byte)num2;
246 destination[11] = 32;
248 destination[16] = 32;
250 destination[19] = 58;
252 destination[22] = 58;
254 destination[25] = 32;
255 destination[26] = 103;
256 destination[27] = 109;
257 destination[28] = 116;
258 bytesWritten = 29;
259 return true;
260 }
261
262 private static bool TryFormatDateTimeO(DateTime value, TimeSpan offset, Span<byte> destination, out int bytesWritten)
263 {
264 int num = 27;
265 DateTimeKind dateTimeKind = DateTimeKind.Local;
267 {
268 dateTimeKind = value.Kind;
269 switch (dateTimeKind)
270 {
271 case DateTimeKind.Local:
272 offset = TimeZoneInfo.Local.GetUtcOffset(value);
273 num += 6;
274 break;
275 case DateTimeKind.Utc:
276 num++;
277 break;
278 }
279 }
280 else
281 {
282 num += 6;
283 }
284 if (destination.Length < num)
285 {
286 bytesWritten = 0;
287 return false;
288 }
289 bytesWritten = num;
290 _ = ref destination[26];
291 value.GetDate(out var year, out var month, out var day);
292 value.GetTimePrecise(out var hour, out var minute, out var second, out var tick);
294 destination[4] = 45;
296 destination[7] = 45;
298 destination[10] = 84;
300 destination[13] = 58;
302 destination[16] = 58;
304 destination[19] = 46;
305 FormattingHelpers.WriteDigits((uint)tick, destination.Slice(20, 7));
306 switch (dateTimeKind)
307 {
308 case DateTimeKind.Local:
309 {
310 int num2 = (int)(offset.Ticks / 600000000);
311 byte b;
312 if (num2 < 0)
313 {
314 b = 45;
315 num2 = -num2;
316 }
317 else
318 {
319 b = 43;
320 }
321 int result;
322 int value2 = Math.DivRem(num2, 60, out result);
324 destination[30] = 58;
326 destination[27] = b;
327 break;
328 }
329 case DateTimeKind.Utc:
330 destination[27] = 90;
331 break;
332 }
333 return true;
334 }
335
336 private static bool TryFormatDateTimeR(DateTime value, Span<byte> destination, out int bytesWritten)
337 {
338 if (28u >= (uint)destination.Length)
339 {
340 bytesWritten = 0;
341 return false;
342 }
343 value.GetDate(out var year, out var month, out var day);
344 value.GetTime(out var hour, out var minute, out var second);
345 uint num = s_dayAbbreviations[(int)value.DayOfWeek];
346 destination[0] = (byte)num;
347 num >>= 8;
348 destination[1] = (byte)num;
349 num >>= 8;
350 destination[2] = (byte)num;
351 destination[3] = 44;
352 destination[4] = 32;
354 destination[7] = 32;
355 uint num2 = s_monthAbbreviations[month - 1];
356 destination[8] = (byte)num2;
357 num2 >>= 8;
358 destination[9] = (byte)num2;
359 num2 >>= 8;
360 destination[10] = (byte)num2;
361 destination[11] = 32;
363 destination[16] = 32;
365 destination[19] = 58;
367 destination[22] = 58;
369 destination[25] = 32;
370 destination[26] = 71;
371 destination[27] = 77;
372 destination[28] = 84;
373 bytesWritten = 29;
374 return true;
375 }
376
377 public unsafe static bool TryFormat(decimal value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
378 {
379 if (format.IsDefault)
380 {
381 format = 'G';
382 }
383 switch (format.Symbol)
384 {
385 case 'G':
386 case 'g':
387 {
388 if (format.Precision != byte.MaxValue)
389 {
391 }
392 byte* digits3 = stackalloc byte[31];
393 Number.NumberBuffer number3 = new Number.NumberBuffer(Number.NumberBufferKind.Decimal, digits3, 31);
394 Number.DecimalToNumber(ref value, ref number3);
395 if (number3.Digits[0] == 0)
396 {
397 number3.IsNegative = false;
398 }
399 return TryFormatDecimalG(ref number3, destination, out bytesWritten);
400 }
401 case 'F':
402 case 'f':
403 {
404 byte* digits2 = stackalloc byte[31];
405 Number.NumberBuffer number2 = new Number.NumberBuffer(Number.NumberBufferKind.Decimal, digits2, 31);
406 Number.DecimalToNumber(ref value, ref number2);
407 byte b2 = (byte)((format.Precision == byte.MaxValue) ? 2 : format.Precision);
408 Number.RoundNumber(ref number2, number2.Scale + b2, isCorrectlyRounded: false);
409 return TryFormatDecimalF(ref number2, destination, out bytesWritten, b2);
410 }
411 case 'E':
412 case 'e':
413 {
414 byte* digits = stackalloc byte[31];
415 Number.NumberBuffer number = new Number.NumberBuffer(Number.NumberBufferKind.Decimal, digits, 31);
416 Number.DecimalToNumber(ref value, ref number);
417 byte b = (byte)((format.Precision == byte.MaxValue) ? 6 : format.Precision);
418 Number.RoundNumber(ref number, b + 1, isCorrectlyRounded: false);
419 return TryFormatDecimalE(ref number, destination, out bytesWritten, b, (byte)format.Symbol);
420 }
421 default:
422 return FormattingHelpers.TryFormatThrowFormatException(out bytesWritten);
423 }
424 }
425
426 private static bool TryFormatDecimalE(ref Number.NumberBuffer number, Span<byte> destination, out int bytesWritten, byte precision, byte exponentSymbol)
427 {
428 int scale = number.Scale;
429 ReadOnlySpan<byte> readOnlySpan = number.Digits;
430 int num = (number.IsNegative ? 1 : 0) + 1 + ((precision != 0) ? (precision + 1) : 0) + 2 + 3;
431 if (destination.Length < num)
432 {
433 bytesWritten = 0;
434 return false;
435 }
436 int num2 = 0;
437 int num3 = 0;
438 if (number.IsNegative)
439 {
440 destination[num2++] = 45;
441 }
442 byte b = readOnlySpan[num3];
443 int num4;
444 if (b == 0)
445 {
446 destination[num2++] = 48;
447 num4 = 0;
448 }
449 else
450 {
451 destination[num2++] = b;
452 num3++;
453 num4 = scale - 1;
454 }
455 if (precision > 0)
456 {
457 destination[num2++] = 46;
458 for (int i = 0; i < precision; i++)
459 {
460 byte b2 = readOnlySpan[num3];
461 if (b2 == 0)
462 {
463 while (i++ < precision)
464 {
465 destination[num2++] = 48;
466 }
467 break;
468 }
469 destination[num2++] = b2;
470 num3++;
471 }
472 }
473 destination[num2++] = exponentSymbol;
474 if (num4 >= 0)
475 {
476 destination[num2++] = 43;
477 }
478 else
479 {
480 destination[num2++] = 45;
481 num4 = -num4;
482 }
483 destination[num2++] = 48;
484 destination[num2++] = (byte)(num4 / 10 + 48);
485 destination[num2++] = (byte)(num4 % 10 + 48);
486 bytesWritten = num;
487 return true;
488 }
489
490 private static bool TryFormatDecimalF(ref Number.NumberBuffer number, Span<byte> destination, out int bytesWritten, byte precision)
491 {
492 int scale = number.Scale;
493 ReadOnlySpan<byte> readOnlySpan = number.Digits;
494 int num = (number.IsNegative ? 1 : 0) + ((scale <= 0) ? 1 : scale) + ((precision != 0) ? (precision + 1) : 0);
495 if (destination.Length < num)
496 {
497 bytesWritten = 0;
498 return false;
499 }
500 int i = 0;
501 int num2 = 0;
502 if (number.IsNegative)
503 {
504 destination[num2++] = 45;
505 }
506 if (scale <= 0)
507 {
508 destination[num2++] = 48;
509 }
510 else
511 {
512 for (; i < scale; i++)
513 {
514 byte b = readOnlySpan[i];
515 if (b == 0)
516 {
517 int num3 = scale - i;
518 for (int j = 0; j < num3; j++)
519 {
520 destination[num2++] = 48;
521 }
522 break;
523 }
524 destination[num2++] = b;
525 }
526 }
527 if (precision > 0)
528 {
529 destination[num2++] = 46;
530 int k = 0;
531 if (scale < 0)
532 {
533 int num4 = Math.Min(precision, -scale);
534 for (int l = 0; l < num4; l++)
535 {
536 destination[num2++] = 48;
537 }
538 k += num4;
539 }
540 for (; k < precision; k++)
541 {
542 byte b2 = readOnlySpan[i];
543 if (b2 == 0)
544 {
545 while (k++ < precision)
546 {
547 destination[num2++] = 48;
548 }
549 break;
550 }
551 destination[num2++] = b2;
552 i++;
553 }
554 }
555 bytesWritten = num;
556 return true;
557 }
558
559 private static bool TryFormatDecimalG(ref Number.NumberBuffer number, Span<byte> destination, out int bytesWritten)
560 {
561 int scale = number.Scale;
562 ReadOnlySpan<byte> readOnlySpan = number.Digits;
563 int digitsCount = number.DigitsCount;
564 bool flag = scale < digitsCount;
565 int num;
566 if (flag)
567 {
568 num = digitsCount + 1;
569 if (scale <= 0)
570 {
571 num += 1 + -scale;
572 }
573 }
574 else
575 {
576 num = ((scale <= 0) ? 1 : scale);
577 }
578 if (number.IsNegative)
579 {
580 num++;
581 }
582 if (destination.Length < num)
583 {
584 bytesWritten = 0;
585 return false;
586 }
587 int i = 0;
588 int num2 = 0;
589 if (number.IsNegative)
590 {
591 destination[num2++] = 45;
592 }
593 if (scale <= 0)
594 {
595 destination[num2++] = 48;
596 }
597 else
598 {
599 for (; i < scale; i++)
600 {
601 byte b = readOnlySpan[i];
602 if (b == 0)
603 {
604 int num3 = scale - i;
605 for (int j = 0; j < num3; j++)
606 {
607 destination[num2++] = 48;
608 }
609 break;
610 }
611 destination[num2++] = b;
612 }
613 }
614 if (flag)
615 {
616 destination[num2++] = 46;
617 if (scale < 0)
618 {
619 int num4 = -scale;
620 for (int k = 0; k < num4; k++)
621 {
622 destination[num2++] = 48;
623 }
624 }
625 byte b2;
626 while ((b2 = readOnlySpan[i++]) != 0)
627 {
628 destination[num2++] = b2;
629 }
630 }
631 bytesWritten = num;
632 return true;
633 }
634
635 public static bool TryFormat(double value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
636 {
637 return TryFormatFloatingPoint(value, destination, out bytesWritten, format);
638 }
639
640 public static bool TryFormat(float value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
641 {
642 return TryFormatFloatingPoint(value, destination, out bytesWritten, format);
643 }
644
645 private static bool TryFormatFloatingPoint<T>(T value, Span<byte> destination, out int bytesWritten, StandardFormat format) where T : ISpanFormattable
646 {
647 Span<char> span = default(Span<char>);
648 if (!format.IsDefault)
649 {
650 span = stackalloc char[3];
651 span = span[..format.Format(span)];
652 }
653 Span<char> destination2 = stackalloc char[128];
654 ReadOnlySpan<char> readOnlySpan = default(Span<char>);
655 if (value.TryFormat(destination2, out var charsWritten, span, CultureInfo.InvariantCulture))
656 {
657 readOnlySpan = destination2.Slice(0, charsWritten);
658 }
659 else
660 {
661 if (destination.Length <= 128)
662 {
663 bytesWritten = 0;
664 return false;
665 }
666 readOnlySpan = value.ToString(new string(span), CultureInfo.InvariantCulture);
667 }
668 if (readOnlySpan.Length > destination.Length)
669 {
670 bytesWritten = 0;
671 return false;
672 }
673 try
674 {
675 bytesWritten = Encoding.UTF8.GetBytes(readOnlySpan, destination);
676 return true;
677 }
678 catch
679 {
680 bytesWritten = 0;
681 return false;
682 }
683 }
684
685 public static bool TryFormat(Guid value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
686 {
687 int num;
689 {
690 case 'D':
691 num = -2147483612;
692 break;
693 case 'B':
694 num = -2139260122;
695 break;
696 case 'P':
697 num = -2144786394;
698 break;
699 case 'N':
700 num = 32;
701 break;
702 default:
703 return FormattingHelpers.TryFormatThrowFormatException(out bytesWritten);
704 }
705 if ((byte)num > destination.Length)
706 {
707 bytesWritten = 0;
708 return false;
709 }
710 bytesWritten = (byte)num;
711 num >>= 8;
712 if ((byte)num != 0)
713 {
714 destination[0] = (byte)num;
715 destination = destination.Slice(1);
716 }
717 num >>= 8;
718 DecomposedGuid decomposedGuid = default(DecomposedGuid);
719 decomposedGuid.Guid = value;
720 _ = ref destination[8];
726 if (num < 0)
727 {
728 destination[8] = 45;
729 destination = destination.Slice(9);
730 }
731 else
732 {
733 destination = destination.Slice(8);
734 }
735 _ = ref destination[4];
739 if (num < 0)
740 {
741 destination[4] = 45;
742 destination = destination.Slice(5);
743 }
744 else
745 {
746 destination = destination.Slice(4);
747 }
748 _ = ref destination[4];
752 if (num < 0)
753 {
754 destination[4] = 45;
755 destination = destination.Slice(5);
756 }
757 else
758 {
759 destination = destination.Slice(4);
760 }
761 _ = ref destination[4];
764 if (num < 0)
765 {
766 destination[4] = 45;
767 destination = destination.Slice(5);
768 }
769 else
770 {
771 destination = destination.Slice(4);
772 }
773 _ = ref destination[11];
780 if ((byte)num != 0)
781 {
782 destination[12] = (byte)num;
783 }
784 return true;
785 }
786
787 public static bool TryFormat(byte value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
788 {
789 return TryFormatUInt64(value, destination, out bytesWritten, format);
790 }
791
792 [CLSCompliant(false)]
793 public static bool TryFormat(sbyte value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
794 {
795 return TryFormatInt64(value, 255uL, destination, out bytesWritten, format);
796 }
797
798 [CLSCompliant(false)]
799 public static bool TryFormat(ushort value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
800 {
801 return TryFormatUInt64(value, destination, out bytesWritten, format);
802 }
803
804 public static bool TryFormat(short value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
805 {
806 return TryFormatInt64(value, 65535uL, destination, out bytesWritten, format);
807 }
808
809 [CLSCompliant(false)]
810 public static bool TryFormat(uint value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
811 {
812 return TryFormatUInt64(value, destination, out bytesWritten, format);
813 }
814
815 public static bool TryFormat(int value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
816 {
817 return TryFormatInt64(value, 4294967295uL, destination, out bytesWritten, format);
818 }
819
820 [CLSCompliant(false)]
821 public static bool TryFormat(ulong value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
822 {
823 return TryFormatUInt64(value, destination, out bytesWritten, format);
824 }
825
826 public static bool TryFormat(long value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
827 {
828 return TryFormatInt64(value, ulong.MaxValue, destination, out bytesWritten, format);
829 }
830
831 [MethodImpl(MethodImplOptions.AggressiveInlining)]
832 private static bool TryFormatInt64(long value, ulong mask, Span<byte> destination, out int bytesWritten, StandardFormat format)
833 {
834 if (format.IsDefault)
835 {
836 return TryFormatInt64Default(value, destination, out bytesWritten);
837 }
838 switch (format.Symbol)
839 {
840 case 'G':
841 case 'g':
842 if (format.HasPrecision)
843 {
845 }
846 return TryFormatInt64D(value, format.Precision, destination, out bytesWritten);
847 case 'D':
848 case 'd':
849 return TryFormatInt64D(value, format.Precision, destination, out bytesWritten);
850 case 'N':
851 case 'n':
852 return TryFormatInt64N(value, format.Precision, destination, out bytesWritten);
853 case 'x':
854 return TryFormatUInt64X((ulong)value & mask, format.Precision, useLower: true, destination, out bytesWritten);
855 case 'X':
856 return TryFormatUInt64X((ulong)value & mask, format.Precision, useLower: false, destination, out bytesWritten);
857 default:
858 return FormattingHelpers.TryFormatThrowFormatException(out bytesWritten);
859 }
860 }
861
862 [MethodImpl(MethodImplOptions.AggressiveInlining)]
863 private static bool TryFormatInt64D(long value, byte precision, Span<byte> destination, out int bytesWritten)
864 {
865 bool insertNegationSign = false;
866 if (value < 0)
867 {
868 insertNegationSign = true;
869 value = -value;
870 }
871 return TryFormatUInt64D((ulong)value, precision, destination, insertNegationSign, out bytesWritten);
872 }
873
874 [MethodImpl(MethodImplOptions.AggressiveInlining)]
875 private static bool TryFormatInt64Default(long value, Span<byte> destination, out int bytesWritten)
876 {
877 if ((ulong)value < 10uL)
878 {
879 return TryFormatUInt32SingleDigit((uint)value, destination, out bytesWritten);
880 }
881 _ = IntPtr.Size;
882 return TryFormatInt64MultipleDigits(value, destination, out bytesWritten);
883 }
884
885 [MethodImpl(MethodImplOptions.AggressiveInlining)]
886 private static bool TryFormatInt64MultipleDigits(long value, Span<byte> destination, out int bytesWritten)
887 {
888 if (value < 0)
889 {
890 value = -value;
891 int num = FormattingHelpers.CountDigits((ulong)value);
892 if (num >= destination.Length)
893 {
894 bytesWritten = 0;
895 return false;
896 }
897 destination[0] = 45;
898 bytesWritten = num + 1;
899 FormattingHelpers.WriteDigits((ulong)value, destination.Slice(1, num));
900 return true;
901 }
902 return TryFormatUInt64MultipleDigits((ulong)value, destination, out bytesWritten);
903 }
904
905 [MethodImpl(MethodImplOptions.AggressiveInlining)]
906 private static bool TryFormatInt64N(long value, byte precision, Span<byte> destination, out int bytesWritten)
907 {
908 bool insertNegationSign = false;
909 if (value < 0)
910 {
911 insertNegationSign = true;
912 value = -value;
913 }
914 return TryFormatUInt64N((ulong)value, precision, destination, insertNegationSign, out bytesWritten);
915 }
916
917 [MethodImpl(MethodImplOptions.AggressiveInlining)]
918 private static bool TryFormatUInt64(ulong value, Span<byte> destination, out int bytesWritten, StandardFormat format)
919 {
920 if (format.IsDefault)
921 {
922 return TryFormatUInt64Default(value, destination, out bytesWritten);
923 }
924 switch (format.Symbol)
925 {
926 case 'G':
927 case 'g':
928 if (format.HasPrecision)
929 {
931 }
932 return TryFormatUInt64D(value, format.Precision, destination, insertNegationSign: false, out bytesWritten);
933 case 'D':
934 case 'd':
935 return TryFormatUInt64D(value, format.Precision, destination, insertNegationSign: false, out bytesWritten);
936 case 'N':
937 case 'n':
938 return TryFormatUInt64N(value, format.Precision, destination, insertNegationSign: false, out bytesWritten);
939 case 'x':
940 return TryFormatUInt64X(value, format.Precision, useLower: true, destination, out bytesWritten);
941 case 'X':
942 return TryFormatUInt64X(value, format.Precision, useLower: false, destination, out bytesWritten);
943 default:
944 return FormattingHelpers.TryFormatThrowFormatException(out bytesWritten);
945 }
946 }
947
948 private static bool TryFormatUInt64D(ulong value, byte precision, Span<byte> destination, bool insertNegationSign, out int bytesWritten)
949 {
951 int num2 = ((precision != byte.MaxValue) ? precision : 0) - num;
952 if (num2 < 0)
953 {
954 num2 = 0;
955 }
956 int num3 = num + num2;
957 if (insertNegationSign)
958 {
959 num3++;
960 }
961 if (num3 > destination.Length)
962 {
963 bytesWritten = 0;
964 return false;
965 }
966 bytesWritten = num3;
967 if (insertNegationSign)
968 {
969 destination[0] = 45;
970 destination = destination.Slice(1);
971 }
972 if (num2 > 0)
973 {
975 }
977 return true;
978 }
979
980 [MethodImpl(MethodImplOptions.AggressiveInlining)]
981 private static bool TryFormatUInt64Default(ulong value, Span<byte> destination, out int bytesWritten)
982 {
983 if (value < 10)
984 {
985 return TryFormatUInt32SingleDigit((uint)value, destination, out bytesWritten);
986 }
987 _ = IntPtr.Size;
988 return TryFormatUInt64MultipleDigits(value, destination, out bytesWritten);
989 }
990
991 [MethodImpl(MethodImplOptions.AggressiveInlining)]
992 private static bool TryFormatUInt32SingleDigit(uint value, Span<byte> destination, out int bytesWritten)
993 {
994 if (destination.Length == 0)
995 {
996 bytesWritten = 0;
997 return false;
998 }
999 destination[0] = (byte)(48 + value);
1000 bytesWritten = 1;
1001 return true;
1002 }
1003
1004 [MethodImpl(MethodImplOptions.AggressiveInlining)]
1005 private static bool TryFormatUInt64MultipleDigits(ulong value, Span<byte> destination, out int bytesWritten)
1006 {
1008 if (num > destination.Length)
1009 {
1010 bytesWritten = 0;
1011 return false;
1012 }
1013 bytesWritten = num;
1015 return true;
1016 }
1017
1018 private static bool TryFormatUInt64N(ulong value, byte precision, Span<byte> destination, bool insertNegationSign, out int bytesWritten)
1019 {
1021 int num2 = (num - 1) / 3;
1022 int num3 = ((precision == byte.MaxValue) ? 2 : precision);
1023 int num4 = num + num2;
1024 if (num3 > 0)
1025 {
1026 num4 += num3 + 1;
1027 }
1028 if (insertNegationSign)
1029 {
1030 num4++;
1031 }
1032 if (num4 > destination.Length)
1033 {
1034 bytesWritten = 0;
1035 return false;
1036 }
1037 bytesWritten = num4;
1038 if (insertNegationSign)
1039 {
1040 destination[0] = 45;
1041 destination = destination.Slice(1);
1042 }
1044 if (num3 > 0)
1045 {
1046 destination[num + num2] = 46;
1047 FormattingHelpers.FillWithAsciiZeros(destination.Slice(num + num2 + 1, num3));
1048 }
1049 return true;
1050 }
1051
1052 private static bool TryFormatUInt64X(ulong value, byte precision, bool useLower, Span<byte> destination, out int bytesWritten)
1053 {
1055 int num2 = ((precision == byte.MaxValue) ? num : Math.Max(precision, num));
1056 if (destination.Length < num2)
1057 {
1058 bytesWritten = 0;
1059 return false;
1060 }
1061 bytesWritten = num2;
1062 if (useLower)
1063 {
1064 while ((uint)(--num2) < (uint)destination.Length)
1065 {
1066 destination[num2] = (byte)HexConverter.ToCharLower((int)value);
1067 value >>= 4;
1068 }
1069 }
1070 else
1071 {
1072 while ((uint)(--num2) < (uint)destination.Length)
1073 {
1074 destination[num2] = (byte)HexConverter.ToCharUpper((int)value);
1075 value >>= 4;
1076 }
1077 }
1078 return true;
1079 }
1080
1081 public static bool TryFormat(TimeSpan value, Span<byte> destination, out int bytesWritten, StandardFormat format = default(StandardFormat))
1082 {
1084 switch (c)
1085 {
1086 case 'T':
1087 case 't':
1088 c = 'c';
1089 break;
1090 default:
1091 return FormattingHelpers.TryFormatThrowFormatException(out bytesWritten);
1092 case 'G':
1093 case 'c':
1094 case 'g':
1095 break;
1096 }
1097 int num = 8;
1098 long ticks = value.Ticks;
1099 uint valueWithoutTrailingZeros;
1100 ulong num2;
1101 if (ticks < 0)
1102 {
1103 ticks = -ticks;
1104 if (ticks < 0)
1105 {
1106 valueWithoutTrailingZeros = 4775808u;
1107 num2 = 922337203685uL;
1108 goto IL_008d;
1109 }
1110 }
1111 (ulong Quotient, ulong Remainder) tuple = Math.DivRem((ulong)Math.Abs(value.Ticks), 10000000uL);
1112 num2 = tuple.Quotient;
1113 ulong item = tuple.Remainder;
1114 valueWithoutTrailingZeros = (uint)item;
1115 goto IL_008d;
1116 IL_008d:
1117 int num3 = 0;
1118 switch (c)
1119 {
1120 case 'c':
1121 if (valueWithoutTrailingZeros != 0)
1122 {
1123 num3 = 7;
1124 }
1125 break;
1126 case 'G':
1127 num3 = 7;
1128 break;
1129 default:
1130 if (valueWithoutTrailingZeros != 0)
1131 {
1132 num3 = 7 - FormattingHelpers.CountDecimalTrailingZeros(valueWithoutTrailingZeros, out valueWithoutTrailingZeros);
1133 }
1134 break;
1135 }
1136 if (num3 != 0)
1137 {
1138 num += num3 + 1;
1139 }
1140 ulong num4 = 0uL;
1141 ulong num5 = 0uL;
1142 if (num2 != 0)
1143 {
1144 (num4, num5) = Math.DivRem(num2, 60uL);
1145 }
1146 ulong num6 = 0uL;
1147 ulong num7 = 0uL;
1148 if (num4 != 0)
1149 {
1150 (num6, num7) = Math.DivRem(num4, 60uL);
1151 }
1152 uint num8 = 0u;
1153 uint num9 = 0u;
1154 if (num6 != 0)
1155 {
1156 (num8, num9) = Math.DivRem((uint)num6, 24u);
1157 }
1158 int num10 = 2;
1159 if (num9 < 10 && c == 'g')
1160 {
1161 num10--;
1162 num--;
1163 }
1164 int num11 = 0;
1165 if (num8 == 0)
1166 {
1167 if (c == 'G')
1168 {
1169 num += 2;
1170 num11 = 1;
1171 }
1172 }
1173 else
1174 {
1175 num11 = FormattingHelpers.CountDigits(num8);
1176 num += num11 + 1;
1177 }
1178 if (value.Ticks < 0)
1179 {
1180 num++;
1181 }
1182 if (destination.Length < num)
1183 {
1184 bytesWritten = 0;
1185 return false;
1186 }
1187 bytesWritten = num;
1188 int num12 = 0;
1189 if (value.Ticks < 0)
1190 {
1191 destination[num12++] = 45;
1192 }
1193 if (num11 > 0)
1194 {
1195 FormattingHelpers.WriteDigits(num8, destination.Slice(num12, num11));
1196 num12 += num11;
1197 destination[num12++] = (byte)((c == 'c') ? 46 : 58);
1198 }
1199 FormattingHelpers.WriteDigits(num9, destination.Slice(num12, num10));
1200 num12 += num10;
1201 destination[num12++] = 58;
1202 FormattingHelpers.WriteDigits((uint)num7, destination.Slice(num12, 2));
1203 num12 += 2;
1204 destination[num12++] = 58;
1205 FormattingHelpers.WriteDigits((uint)num5, destination.Slice(num12, 2));
1206 num12 += 2;
1207 if (num3 > 0)
1208 {
1209 destination[num12++] = 46;
1210 FormattingHelpers.WriteDigits(valueWithoutTrailingZeros, destination.Slice(num12, num3));
1211 num12 += num3;
1212 }
1213 return true;
1214 }
1215}
static readonly bool IsLittleEndian
static bool TryWriteUInt32BigEndian(Span< byte > destination, uint value)
static void WriteUInt32BigEndian(Span< byte > destination, uint value)
static void WriteDigitsWithGroupSeparator(ulong value, Span< byte > buffer)
static bool TryFormatThrowFormatException(out int bytesWritten)
static void WriteDigits(ulong value, Span< byte > buffer)
static void WriteFourDecimalDigits(uint value, Span< byte > buffer, int startingIndex=0)
static void FillWithAsciiZeros(Span< byte > buffer)
static void WriteTwoDecimalDigits(uint value, Span< byte > buffer, int startingIndex=0)
static char GetSymbolOrDefault(in StandardFormat format, char defaultSymbol)
static int CountDecimalTrailingZeros(uint value, out uint valueWithoutTrailingZeros)
static readonly TimeSpan NullUtcOffset
static readonly uint[] s_dayAbbreviationsLowercase
static bool TryFormat(Guid value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatDateTimeL(DateTime value, Span< byte > destination, out int bytesWritten)
static bool TryFormatInt64D(long value, byte precision, Span< byte > destination, out int bytesWritten)
static bool TryFormatDecimalE(ref Number.NumberBuffer number, Span< byte > destination, out int bytesWritten, byte precision, byte exponentSymbol)
static bool TryFormat(byte value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatUInt32SingleDigit(uint value, Span< byte > destination, out int bytesWritten)
static bool TryFormat(uint value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatUInt64N(ulong value, byte precision, Span< byte > destination, bool insertNegationSign, out int bytesWritten)
static bool TryFormat(DateTime value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatDecimalG(ref Number.NumberBuffer number, Span< byte > destination, out int bytesWritten)
static unsafe bool TryFormat(decimal value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatUInt64X(ulong value, byte precision, bool useLower, Span< byte > destination, out int bytesWritten)
static bool TryFormatInt64N(long value, byte precision, Span< byte > destination, out int bytesWritten)
static bool TryFormat(ulong value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static readonly uint[] s_monthAbbreviations
static bool TryFormat(double value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatUInt64MultipleDigits(ulong value, Span< byte > destination, out int bytesWritten)
static bool TryFormat(short value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static readonly uint[] s_dayAbbreviations
static bool TryFormatUInt64Default(ulong value, Span< byte > destination, out int bytesWritten)
static bool TryFormatInt64MultipleDigits(long value, Span< byte > destination, out int bytesWritten)
static bool TryFormat(float value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatDateTimeG(DateTime value, TimeSpan offset, Span< byte > destination, out int bytesWritten)
static bool TryFormatFloatingPoint< T >(T value, Span< byte > destination, out int bytesWritten, StandardFormat format)
static bool TryFormatInt64Default(long value, Span< byte > destination, out int bytesWritten)
static bool TryFormat(DateTimeOffset value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatDateTimeO(DateTime value, TimeSpan offset, Span< byte > destination, out int bytesWritten)
static bool TryFormat(ushort value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatInt64(long value, ulong mask, Span< byte > destination, out int bytesWritten, StandardFormat format)
static bool TryFormatUInt64(ulong value, Span< byte > destination, out int bytesWritten, StandardFormat format)
static bool TryFormatUInt64D(ulong value, byte precision, Span< byte > destination, bool insertNegationSign, out int bytesWritten)
static bool TryFormat(bool value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormat(int value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static readonly uint[] s_monthAbbreviationsLowercase
static bool TryFormat(TimeSpan value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormat(long value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatDecimalF(ref Number.NumberBuffer number, Span< byte > destination, out int bytesWritten, byte precision)
static bool TryFormat(sbyte value, Span< byte > destination, out int bytesWritten, StandardFormat format=default(StandardFormat))
static bool TryFormatDateTimeR(DateTime value, Span< byte > destination, out int bytesWritten)
static CultureInfo InvariantCulture
static char ToCharLower(int value)
static char ToCharUpper(int value)
static void ToBytesBuffer(byte value, Span< byte > buffer, int startingIndex=0, Casing casing=Casing.Upper)
static byte Min(byte val1, byte val2)
Definition Math.cs:912
static double Abs(double value)
static int DivRem(int a, int b, out int result)
Definition Math.cs:329
static byte Max(byte val1, byte val2)
Definition Math.cs:738
static unsafe void RoundNumber(ref NumberBuffer number, int pos, bool isCorrectlyRounded)
Definition Number.cs:3379
static unsafe void DecimalToNumber(ref decimal d, ref NumberBuffer number)
Definition Number.cs:1591
static string Argument_GWithPrecisionNotSupported
Definition SR.cs:2094
Definition SR.cs:7
static Encoding UTF8
Definition Encoding.cs:526
static TimeZoneInfo Local
static int Size
Definition IntPtr.cs:21
override string ToString()
Span< T > Slice(int start)
Definition Span.cs:271