private void CoreFmt <T0, T1, T2>(ref StringMaker sm, IFormatProvider?provider, T0 arg0, T1 arg1, T2 arg2, ReadOnlySpan <object?> args) { var literalIndex = 0; foreach (var segment in _segments) { int literalCount = segment.LiteralCount; if (literalCount > 0) { // the segment has some literal text sm.Append(LiteralString.AsSpan(literalIndex, literalCount)); literalIndex += literalCount; } var argIndex = segment.ArgIndex; if (argIndex >= 0) { // the segment has an arg to format switch (argIndex) { case 0: AppendArg(ref sm, arg0, segment.ArgFormat, provider, segment.ArgWidth); break; case 1: AppendArg(ref sm, arg1, segment.ArgFormat, provider, segment.ArgWidth); break; case 2: AppendArg(ref sm, arg2, segment.ArgFormat, provider, segment.ArgWidth); break; default: AppendArg(ref sm, args[argIndex - 3], segment.ArgFormat, provider, segment.ArgWidth); break; } } } }
/// <summary> /// Formats a string with arguments. /// </summary> /// <param name="destination">Where to write the resulting string.</param> /// <param name="charsWritten">The number of characters actually written to the destination span.</param> /// <param name="provider">An optional format provider that provides formatting functionality for individual arguments.</param> /// <param name="args">Arguments to use in the formatting operation.</param> /// <returns>True if there was enough room in teh destination span for the resulting string.</returns> public bool TryFormat(Span <char> destination, out int charsWritten, IFormatProvider?provider, params object?[]?args) { CheckNumArgs(0, args); if (NumArgumentsNeeded == 0) { if (destination.Length < LiteralString.Length) { charsWritten = 0; return(false); } LiteralString.AsSpan().CopyTo(destination); charsWritten = LiteralString.Length; return(true); } return(args !.Length switch { 1 => TryFmt <object?, object?, object?>(destination, out charsWritten, provider, args[0], null, null, null), 2 => TryFmt <object?, object?, object?>(destination, out charsWritten, provider, args[0], args[1], null, null), 3 => TryFmt <object?, object?, object?>(destination, out charsWritten, provider, args[0], args[1], args[2], null), _ => TryFmt <object?, object?, object?>(destination, out charsWritten, provider, args[0], args[1], args[2], args.AsSpan(3)), });