126 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			126 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | <#/*THIS IS A T4 FILE - see t4_text_templating.md for what it is and how to run codegen*/#> | ||
|  | <#@ template debug="True" #> | ||
|  | <#@ output extension=".gen.cs" encoding="utf-8" #> | ||
|  | <#@ assembly name="System.Core" #> | ||
|  | <#@ import namespace="System.Linq" #> | ||
|  | 
 | ||
|  | //------------------------------------------------------------------------------ | ||
|  | // <auto-generated> | ||
|  | //     This code was generated by a tool. | ||
|  | // | ||
|  | //     TextTransform Samples/Packages/com.unity.collections/Unity.Collections/FixedStringFormatMethods.tt | ||
|  | // | ||
|  | //     Changes to this file may cause incorrect behavior and will be lost if | ||
|  | //     the code is regenerated. | ||
|  | // </auto-generated> | ||
|  | //------------------------------------------------------------------------------ | ||
|  | 
 | ||
|  | using System; | ||
|  | using Unity.Collections.LowLevel.Unsafe; | ||
|  | 
 | ||
|  | namespace Unity.Collections | ||
|  | { | ||
|  |     /// <summary> | ||
|  |     /// Provides extension methods for FixedString*N*Bytes. | ||
|  |     /// </summary> | ||
|  |     public unsafe static partial class FixedStringMethods | ||
|  |     { | ||
|  | <# | ||
|  |     for (var ARGS = 1; ARGS <= 10; ++ARGS) | ||
|  |     { | ||
|  |         var TYPES    = String.Join(", ", Enumerable.Range(0, ARGS).Select(n => $"T{n}")); | ||
|  |         var PARAMS   = String.Join(", ", Enumerable.Range(0, ARGS).Select(n => $"in T{n} arg{n}")); | ||
|  |         var ARGNAMES = String.Join(", ", Enumerable.Range(0, ARGS).Select(n => $"arg{n}")); | ||
|  |         var TxDOCS   = String.Join("\r\n        /// ", Enumerable.Range(0, ARGS).Select(n => $"<typeparam name=\"T{n}\">The type of value to interpolate into the format string.</typeparam>")); | ||
|  |         var ARGxDOCS = String.Join("\r\n        /// ", Enumerable.Range(0, ARGS).Select(n => $"<param name=\"arg{n}\">A FixedString*N*Bytes to interpolate into the format string.</param>")); | ||
|  |         var BCOMPAT  = String.Join(", ", Enumerable.Range(0, ARGS).Select(n => $"typeof(FixedString128Bytes /*T{n}*/)")); | ||
|  | #> | ||
|  |         /// <summary> | ||
|  |         /// Interpolates strings into a format string and appends the result to this string. | ||
|  |         /// </summary> | ||
|  |         /// <remarks> | ||
|  |         /// Similar to `StringBuilder.AppendFormat` but with significant limitations: | ||
|  |         /// - Only supports FixedString*N*Bytes arguments. To use other string types, convert them to FixedString*N*Bytes first. | ||
|  |         /// - Only supports numeric format placeholders of the form `{0}` .. `{N}`. | ||
|  |         /// - No format modifiers (*e.g.* `{0:x}`) are supported. | ||
|  |         /// | ||
|  |         /// The overloads of this method take up to ten strings to interpolate into the format string. | ||
|  |         /// </remarks> | ||
|  |         /// <typeparam name="T">A FixedString*N*Bytes type.</typeparam> | ||
|  |         /// <typeparam name="U">A FixedString*N*Bytes type.</typeparam> | ||
|  |         /// <#=TxDOCS#> | ||
|  |         /// <param name="dest">The string to append to.</param>d | ||
|  |         /// <param name="format">A string to be interpolated and appended.</param> | ||
|  |         /// <#=ARGxDOCS#> | ||
|  |         /// <returns><see cref="FormatError.None"/> if successful.  Otherwise returns the appropriate <see cref="FormatError"/>.</returns> | ||
|  |         [GenerateTestsForBurstCompatibility(GenericTypeArguments = new[] { typeof(FixedString128Bytes /*T*/), typeof(FixedString128Bytes /*U*/), <#=BCOMPAT#> })] | ||
|  |         public static unsafe FormatError AppendFormat<T, U, <#=TYPES#>>(ref this T dest, in U format, <#=PARAMS#>) | ||
|  |             where T : unmanaged, INativeList<byte>, IUTF8Bytes | ||
|  |             where U : unmanaged, INativeList<byte>, IUTF8Bytes | ||
|  | <# | ||
|  |         for (var a = 0; a < ARGS; ++a) | ||
|  |             WriteLine("            where T{0} : unmanaged, INativeList<byte>, IUTF8Bytes", a); | ||
|  | #> | ||
|  |         { | ||
|  |             ref var formatRef = ref UnsafeUtilityExtensions.AsRef(in format); | ||
|  |             int formatLength = formatRef.Length; | ||
|  |             byte* formatBytes = formatRef.GetUnsafePtr(); | ||
|  |             int i = 0; | ||
|  |             FormatError err = FormatError.None; | ||
|  |             while (i < formatLength) | ||
|  |             { | ||
|  |                 byte currByte = formatBytes[i++]; | ||
|  |                 if (currByte == (byte)'{') | ||
|  |                 { | ||
|  |                     if (i < formatLength) | ||
|  |                         currByte = formatBytes[i++]; | ||
|  |                     else | ||
|  |                         return FormatError.BadFormatSpecifier; | ||
|  | 
 | ||
|  |                     if (currByte >= (byte)'0' && currByte <= (byte)'9' && i < formatLength && formatBytes[i++] == (byte)'}') | ||
|  |                     { | ||
|  |                         switch (currByte - (byte)'0') | ||
|  |                         { | ||
|  | <# | ||
|  |         for(var a = 0; a < ARGS; ++a) | ||
|  |         { | ||
|  |             WriteLine($"                            case {a}: err = dest.Append(in arg{a}); break;"); | ||
|  |         } | ||
|  | #> | ||
|  |                             default: err = FormatError.BadFormatSpecifier; break; | ||
|  |                         } | ||
|  |                     } | ||
|  |                     else if (currByte == (byte)'{') | ||
|  |                         err = dest.AppendRawByte(currByte); | ||
|  |                     else | ||
|  |                         err = FormatError.BadFormatSpecifier; | ||
|  |                 } | ||
|  |                 else if (currByte == (byte)'}') | ||
|  |                 { | ||
|  |                     if (i < formatLength) | ||
|  |                         currByte = formatBytes[i++]; | ||
|  |                     else | ||
|  |                         err = FormatError.BadFormatSpecifier; | ||
|  | 
 | ||
|  |                     if (currByte == (byte)'}') | ||
|  |                         err = dest.AppendRawByte(currByte); | ||
|  |                     else | ||
|  |                         err = FormatError.BadFormatSpecifier; | ||
|  |                 } | ||
|  |                 else | ||
|  |                     err = dest.AppendRawByte(currByte); | ||
|  | 
 | ||
|  |                 if (err != FormatError.None) | ||
|  |                     return err; | ||
|  |             } | ||
|  | 
 | ||
|  |             return FormatError.None; | ||
|  |         } | ||
|  | 
 | ||
|  | <# | ||
|  |     } | ||
|  | #> | ||
|  | 
 | ||
|  |     } | ||
|  | } |