using System; namespace Unity.Collections { [GenerateTestsForBurstCompatibility] public unsafe static partial class FixedStringMethods { /// /// Append two characters to this IUTF8Bytes. This is used as a helper for internal formatting. /// [GenerateTestsForBurstCompatibility(GenericTypeArguments = new[] { typeof(FixedString128Bytes) })] internal static FormatError Append(ref this T fs, char a, char b) where T : unmanaged, INativeList, IUTF8Bytes { FormatError err = FormatError.None; err |= fs.Append((Unicode.Rune) a); err |= fs.Append((Unicode.Rune) b); if (err != FormatError.None) return FormatError.Overflow; return FormatError.None; } /// /// Append three characters to this IUTF8Bytes. This is used as a helper for internal formatting. /// [GenerateTestsForBurstCompatibility(GenericTypeArguments = new[] { typeof(FixedString128Bytes) })] internal static FormatError Append(ref this T fs, char a, char b, char c) where T : unmanaged, INativeList, IUTF8Bytes { FormatError err = FormatError.None; err |= fs.Append((Unicode.Rune) a); err |= fs.Append((Unicode.Rune) b); err |= fs.Append((Unicode.Rune) c); if (err != FormatError.None) return FormatError.Overflow; return FormatError.None; } /// /// Append 'I' 'n' 'f' 'i' 'n' 'i' 't' 'y' characters to this IUTF8Bytes. This is used as a helper for internal formatting. /// [GenerateTestsForBurstCompatibility(GenericTypeArguments = new[] { typeof(FixedString128Bytes) })] internal static FormatError Append(ref this T fs, char a, char b, char c, char d, char e, char f, char g, char h) where T : unmanaged, INativeList, IUTF8Bytes { FormatError err = FormatError.None; err |= fs.Append((Unicode.Rune) a); err |= fs.Append((Unicode.Rune) b); err |= fs.Append((Unicode.Rune) c); err |= fs.Append((Unicode.Rune) d); err |= fs.Append((Unicode.Rune) e); err |= fs.Append((Unicode.Rune) f); err |= fs.Append((Unicode.Rune) g); err |= fs.Append((Unicode.Rune) h); if (err != FormatError.None) return FormatError.Overflow; return FormatError.None; } [GenerateTestsForBurstCompatibility(GenericTypeArguments = new[] { typeof(FixedString128Bytes) })] internal static FormatError AppendScientific(ref this T fs, char *source, int sourceLength, int decimalExponent, char decimalSeparator = '.') where T : unmanaged, INativeList, IUTF8Bytes { FormatError error; if ((error = fs.Append(source[0])) != FormatError.None) return error; if (sourceLength > 1) { if ((error = fs.Append(decimalSeparator)) != FormatError.None) return error; for (var i = 1; i < sourceLength; ++i) { if ((error = fs.Append(source[i])) != FormatError.None) return error; } } if ((error = fs.Append('E')) != FormatError.None) return error; if (decimalExponent < 0) { if ((error = fs.Append('-')) != FormatError.None) return error; decimalExponent *= -1; decimalExponent -= sourceLength - 1; } else { if ((error = fs.Append('+')) != FormatError.None) return error; decimalExponent += sourceLength - 1; } var ascii = stackalloc char[2]; const int decimalDigits = 2; for (var i = 0; i < decimalDigits; ++i) { var decimalDigit = decimalExponent % 10; ascii[1 - i] = (char)('0' + decimalDigit); decimalExponent /= 10; } for (var i = 0; i < decimalDigits; ++i) if ((error = fs.Append(ascii[i])) != FormatError.None) return error; return FormatError.None; } /// /// Check if runes a, b, c are found at offset offset /// /// The target offset /// rune a /// rune b /// rune c /// [GenerateTestsForBurstCompatibility(GenericTypeArguments = new[] { typeof(FixedString128Bytes) })] internal static bool Found(ref this T fs, ref int offset, char a, char b, char c) where T : unmanaged, INativeList, IUTF8Bytes { int old = offset; if ((fs.Read(ref offset).value | 32) == a && (fs.Read(ref offset).value | 32) == b && (fs.Read(ref offset).value | 32) == c) return true; offset = old; return false; } /// /// /// /// /// /// /// /// /// /// /// /// /// [GenerateTestsForBurstCompatibility(GenericTypeArguments = new[] { typeof(FixedString128Bytes) })] internal static bool Found(ref this T fs, ref int offset, char a, char b, char c, char d, char e, char f, char g, char h) where T : unmanaged, INativeList, IUTF8Bytes { int old = offset; if ((fs.Read(ref offset).value | 32) == a && (fs.Read(ref offset).value | 32) == b && (fs.Read(ref offset).value | 32) == c && (fs.Read(ref offset).value | 32) == d && (fs.Read(ref offset).value | 32) == e && (fs.Read(ref offset).value | 32) == f && (fs.Read(ref offset).value | 32) == g && (fs.Read(ref offset).value | 32) == h) return true; offset = old; return false; } } }