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)),
            });