From dfd75b3f967c506d2b8d7f38f9e87a642eb746f8 Mon Sep 17 00:00:00 2001 From: David Vreony Date: Thu, 4 May 2023 20:41:18 +0100 Subject: [PATCH] Feature: Nuget Author helpers (#1352) * add nuget author helpers * license tweaks * Update PackageSourceExtensions.cs * suppress ca1848 for nuget forwarder for now * import maths max helper used in mvvm tracking --- src/Whipstaff.Core/Entities/IEntityAsType.cs | 2 +- .../AuthorUsernameAsStringModel.cs | 34 + src/Whipstaff.Nuget/NugetClientHelpers.cs | 90 + .../NugetForwardingToNetCoreLogger.cs | 142 ++ .../PackageSearchResourceExtensions.cs | 118 ++ .../PackageSourceExtensions.cs | 108 + .../SourceRepositoryExtensions.cs | 71 + src/Whipstaff.Nuget/Whipstaff.Nuget.csproj | 20 + .../Extensions/CharExtensions.cs | 14 +- .../Extensions/StringExtensions.cs | 22 + src/Whipstaff.Runtime/Maths/MathHelpers.cs | 1791 +++++++++++++++++ src/Whipstaff.sln | 6 + 12 files changed, 2414 insertions(+), 4 deletions(-) create mode 100644 src/Whipstaff.Nuget/AuthorUsernameAsStringModel.cs create mode 100644 src/Whipstaff.Nuget/NugetClientHelpers.cs create mode 100644 src/Whipstaff.Nuget/NugetForwardingToNetCoreLogger.cs create mode 100644 src/Whipstaff.Nuget/PackageSearchResourceExtensions.cs create mode 100644 src/Whipstaff.Nuget/PackageSourceExtensions.cs create mode 100644 src/Whipstaff.Nuget/SourceRepositoryExtensions.cs create mode 100644 src/Whipstaff.Nuget/Whipstaff.Nuget.csproj create mode 100644 src/Whipstaff.Runtime/Maths/MathHelpers.cs diff --git a/src/Whipstaff.Core/Entities/IEntityAsType.cs b/src/Whipstaff.Core/Entities/IEntityAsType.cs index e432ce6ba..cbaf677d5 100644 --- a/src/Whipstaff.Core/Entities/IEntityAsType.cs +++ b/src/Whipstaff.Core/Entities/IEntityAsType.cs @@ -14,7 +14,7 @@ namespace Whipstaff.Core.Entities /// and easier to track changes on. /// /// Type for the wrapped value. - public interface IEntityAsType + public interface IEntityAsType { /// /// Gets the wrapped value. diff --git a/src/Whipstaff.Nuget/AuthorUsernameAsStringModel.cs b/src/Whipstaff.Nuget/AuthorUsernameAsStringModel.cs new file mode 100644 index 000000000..2f97da945 --- /dev/null +++ b/src/Whipstaff.Nuget/AuthorUsernameAsStringModel.cs @@ -0,0 +1,34 @@ +// Copyright (c) 2022 DHGMS Solutions and Contributors. All rights reserved. +// This file is licensed to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using Whipstaff.Core.Entities; +using Whipstaff.Runtime.Extensions; + +namespace Whipstaff.Nuget +{ + /// + /// Represents a nuget author username. + /// + public sealed class AuthorUsernameAsStringModel : IEntityAsString + { + /// + /// Initializes a new instance of the class. + /// + /// Nuget username as a string. + public AuthorUsernameAsStringModel(string value) + { + value.ThrowIfNullOrWhitespace(); + if (!value.IsAsciiLettersOrNumbers()) + { + throw new ArgumentException("Author name must be ASCII letters or numbers", nameof(value)); + } + + Value = value; + } + + /// + public string Value { get; } + } +} diff --git a/src/Whipstaff.Nuget/NugetClientHelpers.cs b/src/Whipstaff.Nuget/NugetClientHelpers.cs new file mode 100644 index 000000000..675cc9b80 --- /dev/null +++ b/src/Whipstaff.Nuget/NugetClientHelpers.cs @@ -0,0 +1,90 @@ +// Copyright (c) 2022 DHGMS Solutions and Contributors. All rights reserved. +// This file is licensed to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using NuGet.Common; +using NuGet.Configuration; +using NuGet.Protocol; +using NuGet.Protocol.Core.Types; + +namespace Whipstaff.Nuget +{ + /// + /// Helpers for working with the NuGet client API. + /// + public static class NugetClientHelpers + { + /// + /// Gets a list of packages for the given author name. + /// + /// Username of the author. + /// Forwarding logger instance. + /// The cancellation token for the operation. + /// List of packages for the author. + public static async Task> GetPackagesForAuthor( + AuthorUsernameAsStringModel authorName, + NugetForwardingToNetCoreLogger nugetForwardingToNetCoreLogger, + CancellationToken cancellationToken) + { + ArgumentNullException.ThrowIfNull(authorName); + ArgumentNullException.ThrowIfNull(nugetForwardingToNetCoreLogger); + + var packageSourceProvider = new PackageSourceProvider(new Settings(Environment.CurrentDirectory)); + var sources = packageSourceProvider.LoadPackageSources(); + var packages = new List(); + + foreach (var packageSource in sources) + { + var packagesForAuthor = await packageSource.GetPackagesForAuthor( + authorName, + nugetForwardingToNetCoreLogger, + cancellationToken) + .ConfigureAwait(false); + + packages.AddRange(packagesForAuthor); + } + + return packages; + } + + /// + /// Gets a list of selected information per package for the given author name. + /// + /// Return type for the selected information. + /// Username of the author. + /// selection predicate of the data to return. + /// Forwarding logger instance. + /// The cancellation token for the operation. + /// List of selected output based on packages for the author. + public static async Task> GetPackagesForAuthor( + AuthorUsernameAsStringModel authorName, + Func selector, + NugetForwardingToNetCoreLogger nugetForwardingToNetCoreLogger, + CancellationToken cancellationToken) + { + ArgumentNullException.ThrowIfNull(selector); + + var packageSourceProvider = new PackageSourceProvider(new Settings(Environment.CurrentDirectory)); + var sources = packageSourceProvider.LoadPackageSources(); + var packages = new List(); + + foreach (var packageSource in sources) + { + var packagesForAuthor = await packageSource.GetPackagesForAuthor( + authorName, + selector, + nugetForwardingToNetCoreLogger, + cancellationToken) + .ConfigureAwait(false); + + packages.AddRange(packagesForAuthor); + } + + return packages; + } + } +} diff --git a/src/Whipstaff.Nuget/NugetForwardingToNetCoreLogger.cs b/src/Whipstaff.Nuget/NugetForwardingToNetCoreLogger.cs new file mode 100644 index 000000000..ff1d5612d --- /dev/null +++ b/src/Whipstaff.Nuget/NugetForwardingToNetCoreLogger.cs @@ -0,0 +1,142 @@ +// Copyright (c) 2022 DHGMS Solutions and Contributors. All rights reserved. +// This file is licensed to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using NuGet.Common; + +namespace Whipstaff.Nuget +{ + /// + /// Nuget logger that forwards to a .NET Core logger. + /// + /// + /// This is based upon https://raw.githubusercontent.com/NuGet/NuGet.Jobs/943076ea59f3bad50b019c27e511bf82808575aa/src/NuGet.Services.Metadata.Catalog.Monitoring/Utility/CommonLogger.cs + /// Copyright (c) .NET Foundation. All rights reserved. + /// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + /// + public sealed class NugetForwardingToNetCoreLogger : NuGet.Common.ILogger + { + // This event ID is believed to be unused anywhere else but is otherwise arbitrary. + private const int DefaultLogEventId = 23847; + private static readonly EventId DefaultClientLogEvent = new EventId(DefaultLogEventId); + private readonly Microsoft.Extensions.Logging.ILogger _internalLogger; + + /// + /// Initializes a new instance of the class. + /// + /// Net Core logging framework instance. + public NugetForwardingToNetCoreLogger(Microsoft.Extensions.Logging.ILogger logger) + { + _internalLogger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + /// + public void LogDebug(string data) + { +#pragma warning disable CA1848 // Use the LoggerMessage delegates + _internalLogger.LogDebug("{Data}", data); +#pragma warning restore CA1848 // Use the LoggerMessage delegates + } + + /// + public void LogVerbose(string data) + { +#pragma warning disable CA1848 // Use the LoggerMessage delegates + _internalLogger.LogInformation("{Data}", data); +#pragma warning restore CA1848 // Use the LoggerMessage delegates + } + + /// + public void LogInformation(string data) + { +#pragma warning disable CA1848 // Use the LoggerMessage delegates + _internalLogger.LogInformation("{Data}", data); +#pragma warning restore CA1848 // Use the LoggerMessage delegates + } + + /// + public void LogMinimal(string data) + { +#pragma warning disable CA1848 // Use the LoggerMessage delegates + _internalLogger.LogInformation("{Data}", data); +#pragma warning restore CA1848 // Use the LoggerMessage delegates + } + + /// + public void LogWarning(string data) + { +#pragma warning disable CA1848 // Use the LoggerMessage delegates + _internalLogger.LogWarning("{Data}", data); +#pragma warning restore CA1848 // Use the LoggerMessage delegates + } + + /// + public void LogError(string data) + { +#pragma warning disable CA1848 // Use the LoggerMessage delegates + _internalLogger.LogError("{Data}", data); +#pragma warning restore CA1848 // Use the LoggerMessage delegates + } + + /// + public void LogInformationSummary(string data) + { +#pragma warning disable CA1848 // Use the LoggerMessage delegates + _internalLogger.LogInformation("{Data}", data); +#pragma warning restore CA1848 // Use the LoggerMessage delegates + } + + /// + public void Log(NuGet.Common.LogLevel level, string data) + { + _internalLogger.Log(GetLogLevel(level), DefaultClientLogEvent, data, null, (str, ex) => str); + } + + /// + public Task LogAsync(NuGet.Common.LogLevel level, string data) + { + _internalLogger.Log(GetLogLevel(level), DefaultClientLogEvent, data, null, (str, ex) => str); + return Task.CompletedTask; + } + + /// + public void Log(ILogMessage message) + { + if (message == null) + { + return; + } + + _internalLogger.Log(GetLogLevel(message.Level), new EventId((int)message.Code), message.Message, null, (str, ex) => str); + } + + /// + public Task LogAsync(ILogMessage message) + { + if (message == null) + { + return Task.CompletedTask; + } + + _internalLogger.Log(GetLogLevel(message.Level), new EventId((int)message.Code), message.Message, null, (str, ex) => str); + return Task.CompletedTask; + } + + private static Microsoft.Extensions.Logging.LogLevel GetLogLevel(NuGet.Common.LogLevel logLevel) + { + return logLevel switch + { + NuGet.Common.LogLevel.Debug => Microsoft.Extensions.Logging.LogLevel.Debug, + NuGet.Common.LogLevel.Verbose => Microsoft.Extensions.Logging.LogLevel.Information, + NuGet.Common.LogLevel.Information => Microsoft.Extensions.Logging.LogLevel.Information, + NuGet.Common.LogLevel.Minimal => Microsoft.Extensions.Logging.LogLevel.Information, + NuGet.Common.LogLevel.Warning => Microsoft.Extensions.Logging.LogLevel.Warning, + NuGet.Common.LogLevel.Error => Microsoft.Extensions.Logging.LogLevel.Error, + _ => Microsoft.Extensions.Logging.LogLevel.None, + }; + } + } +} diff --git a/src/Whipstaff.Nuget/PackageSearchResourceExtensions.cs b/src/Whipstaff.Nuget/PackageSearchResourceExtensions.cs new file mode 100644 index 000000000..b28a0c100 --- /dev/null +++ b/src/Whipstaff.Nuget/PackageSearchResourceExtensions.cs @@ -0,0 +1,118 @@ +// Copyright (c) 2022 DHGMS Solutions and Contributors. All rights reserved. +// This file is licensed to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using NuGet.Common; +using NuGet.Protocol.Core.Types; + +namespace Whipstaff.Nuget +{ + /// + /// Extension methods for . + /// + public static class PackageSearchResourceExtensions + { + /// + /// Gets a list of packages for the given author name in the specific package search resource. + /// + /// Package search resource to check. + /// Username of the author. + /// NuGet logging framework instance. + /// The cancellation token for the operation. + /// List of packages for the author. + public static async Task> GetPackagesForAuthor( + this PackageSearchResource packageSearchResource, + AuthorUsernameAsStringModel authorName, + ILogger logger, + CancellationToken cancellationToken) + { + ArgumentNullException.ThrowIfNull(packageSearchResource); + ArgumentNullException.ThrowIfNull(authorName); + + var result = new List(); + var searchTerm = $"author:{authorName.Value}"; + var searchFilter = new SearchFilter(false); + + var packageCount = 0; + var skip = 0; + + do + { + var searchResult = await packageSearchResource.SearchAsync( + searchTerm, + searchFilter, + skip: skip, + take: 1000, + logger, + cancellationToken).ConfigureAwait(false); + + var packages = searchResult.ToList(); + packageCount = packages.Count; + + result.AddRange(packages); + skip += 1000; + } + while (packageCount == 1000); + + return result; + } + + /// + /// Gets a list of selected information per package for the given author name in the specific package search resource. + /// + /// Return type for the selected information. + /// Package search resource to check. + /// Username of the author. + /// selection predicate of the data to return. + /// NuGet logging framework instance. + /// The cancellation token for the operation. + /// List of packages for the author. + public static async Task> GetPackagesForAuthor( + this PackageSearchResource packageSearchResource, + AuthorUsernameAsStringModel authorName, + Func selector, + ILogger logger, + CancellationToken cancellationToken) + { + ArgumentNullException.ThrowIfNull(packageSearchResource); + ArgumentNullException.ThrowIfNull(authorName); + ArgumentNullException.ThrowIfNull(selector); + ArgumentNullException.ThrowIfNull(logger); + + var result = new List(); + var searchTerm = $"author:{authorName.Value}"; + var searchFilter = new SearchFilter(false); + + var packageCount = 0; + + var skip = 0; + + do + { + var searchResult = await packageSearchResource.SearchAsync( + searchTerm, + searchFilter, + skip: 0, + take: 1000, + logger, + cancellationToken).ConfigureAwait(false); + + var packages = searchResult.Select(selector) + .ToList(); + + packageCount = packages.Count; + result.AddRange(packages); + + skip += 1000; + } + while (packageCount == 1000); + + return result; + } + } +} diff --git a/src/Whipstaff.Nuget/PackageSourceExtensions.cs b/src/Whipstaff.Nuget/PackageSourceExtensions.cs new file mode 100644 index 000000000..4283842af --- /dev/null +++ b/src/Whipstaff.Nuget/PackageSourceExtensions.cs @@ -0,0 +1,108 @@ +// Copyright (c) 2022 DHGMS Solutions and Contributors. All rights reserved. +// This file is licensed to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using NuGet.Configuration; +using NuGet.Protocol; +using NuGet.Protocol.Core.Types; + +namespace Whipstaff.Nuget +{ + /// + /// Extension Methods for . + /// + public static class PackageSourceExtensions + { + /// + /// Gets a list of packages for the given author name. + /// + /// Package source to check. + /// Username of the author. + /// Forwarding logger instance. + /// The cancellation token for the operation. + /// List of packages for the author. + public static async Task> GetPackagesForAuthor( + this PackageSource packageSource, + AuthorUsernameAsStringModel authorName, + NugetForwardingToNetCoreLogger nugetForwardingToNetCoreLogger, + CancellationToken cancellationToken) + { + ArgumentNullException.ThrowIfNull(packageSource); + + var packageSearchResource = await packageSource.GetPackageSearchResource() + .ConfigureAwait(false); + + return await packageSearchResource.GetPackagesForAuthor( + authorName, + nugetForwardingToNetCoreLogger, + cancellationToken) + .ConfigureAwait(false); + } + + /// + /// Gets a list of selected information per package for the given author name. + /// + /// Return type for the selected information. + /// Package source to check. + /// Username of the author. + /// selection predicate of the data to return. + /// Forwarding logger instance. + /// The cancellation token for the operation. + /// List of selected output based on packages for the author. + public static async Task> GetPackagesForAuthor( + this PackageSource packageSource, + AuthorUsernameAsStringModel authorName, + Func selector, + NugetForwardingToNetCoreLogger nugetForwardingToNetCoreLogger, + CancellationToken cancellationToken) + { + ArgumentNullException.ThrowIfNull(packageSource); + + var packageSearchResource = await packageSource.GetPackageSearchResource() + .ConfigureAwait(false); + + return await packageSearchResource.GetPackagesForAuthor( + authorName, + selector, + nugetForwardingToNetCoreLogger, + cancellationToken) + .ConfigureAwait(false); + } + + /// + /// Gets the source repository for the given package source. + /// + /// Package source to check. + /// Source repository for the given package source. + public static SourceRepository GetRepository(this PackageSource packageSource) + { + ArgumentNullException.ThrowIfNull(packageSource); + + return packageSource.ProtocolVersion switch + { + 2 => Repository.Factory.GetCoreV2(packageSource), + 3 => Repository.Factory.GetCoreV3(packageSource), + _ => throw new ArgumentException( + $"Protocol version {packageSource.ProtocolVersion} is not supported", + nameof(packageSource)), + }; + } + + /// + /// Gets the package search resource for the given package source. + /// + /// Package source to check. + /// Package search resource for the given package source. + public static Task GetPackageSearchResource(this PackageSource packageSource) + { + ArgumentNullException.ThrowIfNull(packageSource); + + var repository = packageSource.GetRepository(); + return repository.GetResourceAsync(); + } + } +} diff --git a/src/Whipstaff.Nuget/SourceRepositoryExtensions.cs b/src/Whipstaff.Nuget/SourceRepositoryExtensions.cs new file mode 100644 index 000000000..0ffede095 --- /dev/null +++ b/src/Whipstaff.Nuget/SourceRepositoryExtensions.cs @@ -0,0 +1,71 @@ +// Copyright (c) 2022 DHGMS Solutions and Contributors. All rights reserved. +// This file is licensed to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using NuGet.Common; +using NuGet.Protocol.Core.Types; + +namespace Whipstaff.Nuget +{ + /// + /// Extension methods for . + /// + public static class SourceRepositoryExtensions + { + /// + /// Gets a list of packages for the given author name in the specific source repository. + /// + /// Source repository to check. + /// Username of the author. + /// Nuget Logging Framework instance. + /// The cancellation token for the operation. + /// List of packages for the author. + public static async Task> GetPackagesForAuthor( + this SourceRepository sourceRepository, + AuthorUsernameAsStringModel authorName, + ILogger logger, + CancellationToken cancellationToken) + { + ArgumentNullException.ThrowIfNull(sourceRepository); + var packageSearchResource = await sourceRepository.GetResourceAsync(cancellationToken).ConfigureAwait(false); + + return await packageSearchResource.GetPackagesForAuthor( + authorName, + logger, + cancellationToken) + .ConfigureAwait(false); + } + + /// + /// Gets a list of packages for the given author name in the specific source repository. + /// + /// Return type for the selected information. + /// Source repository to check. + /// Username of the author. + /// selection predicate of the data to return. + /// Nuget Logging Framework instance. + /// The cancellation token for the operation. + /// List of selected output based on packages for the author. + public static async Task> GetPackagesForAuthor( + this SourceRepository sourceRepository, + AuthorUsernameAsStringModel authorName, + Func selector, + ILogger logger, + CancellationToken cancellationToken) + { + ArgumentNullException.ThrowIfNull(sourceRepository); + var packageSearchResource = await sourceRepository.GetResourceAsync(cancellationToken).ConfigureAwait(false); + + return await packageSearchResource.GetPackagesForAuthor( + authorName, + selector, + logger, + cancellationToken) + .ConfigureAwait(false); + } + } +} diff --git a/src/Whipstaff.Nuget/Whipstaff.Nuget.csproj b/src/Whipstaff.Nuget/Whipstaff.Nuget.csproj new file mode 100644 index 000000000..6a55f4f0a --- /dev/null +++ b/src/Whipstaff.Nuget/Whipstaff.Nuget.csproj @@ -0,0 +1,20 @@ + + + + net6.0 + enable + + + + + + + + + + + + + + + diff --git a/src/Whipstaff.Runtime/Extensions/CharExtensions.cs b/src/Whipstaff.Runtime/Extensions/CharExtensions.cs index 4990816a5..3e62ee69f 100644 --- a/src/Whipstaff.Runtime/Extensions/CharExtensions.cs +++ b/src/Whipstaff.Runtime/Extensions/CharExtensions.cs @@ -16,9 +16,17 @@ public static class CharExtensions /// Whether the string is Hexadecimal. public static bool IsHexadecimal(this char instance) { - return (instance >= '0' && instance <= '9') || - (instance >= 'a' && instance <= 'f') || - (instance >= 'A' && instance <= 'F'); + return instance is >= '0' and <= '9' or >= 'a' and <= 'f' or >= 'A' and <= 'F'; + } + + /// + /// Checks whether a character is an ASCII letter or number. + /// + /// character to check. + /// Whether a character is an ASCII letter or number. + public static bool IsAsciiLetterOrNumber(this char instance) + { + return instance is >= '0' and <= '9' or >= 'a' and <= 'z' or >= 'A' and <= 'Z'; } } } diff --git a/src/Whipstaff.Runtime/Extensions/StringExtensions.cs b/src/Whipstaff.Runtime/Extensions/StringExtensions.cs index deaf3654e..cfecfb789 100644 --- a/src/Whipstaff.Runtime/Extensions/StringExtensions.cs +++ b/src/Whipstaff.Runtime/Extensions/StringExtensions.cs @@ -91,5 +91,27 @@ public static MemoryStream ToMemoryStream(this string instance) var byteArray = Encoding.Unicode.GetBytes(instance); return new MemoryStream(byteArray); } + + /// + /// Checks whether a string is all ASCII letter or number. + /// + /// string to check. + /// Whether a character is an ASCII letter or number. + public static bool IsAsciiLettersOrNumbers(this string instance) + { + return instance.All(character => character.IsAsciiLetterOrNumber()); + } + + /// + /// Throws an if a string is null or whitespace. + /// + /// string to check. + public static void ThrowIfNullOrWhitespace(this string? instance) + { + if (string.IsNullOrWhiteSpace(instance)) + { + throw new ArgumentNullException(nameof(instance)); + } + } } } diff --git a/src/Whipstaff.Runtime/Maths/MathHelpers.cs b/src/Whipstaff.Runtime/Maths/MathHelpers.cs new file mode 100644 index 000000000..77e26a568 --- /dev/null +++ b/src/Whipstaff.Runtime/Maths/MathHelpers.cs @@ -0,0 +1,1791 @@ +// Copyright (c) 2022 DHGMS Solutions and Contributors. All rights reserved. +// This file is licensed to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using System.Runtime.CompilerServices; + +namespace Whipstaff.Runtime.Maths +{ + /// + /// Math helpers to build upon the dotnet runtime. + /// + public static class MathHelpers + { + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The seventh argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + T arg7, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + var arg7Number = selector(arg7); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The seventh argument to compare. + /// The eighth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + T arg7, + T arg8, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + var arg7Number = selector(arg7); + var arg8Number = selector(arg8); + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The seventh argument to compare. + /// The eighth argument to compare. + /// The ninth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + T arg7, + T arg8, + T arg9, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + var arg7Number = selector(arg7); + var arg8Number = selector(arg8); + var arg9Number = selector(arg9); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The seventh argument to compare. + /// The eighth argument to compare. + /// The ninth argument to compare. + /// The tenth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + T arg7, + T arg8, + T arg9, + T arg10, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + var arg7Number = selector(arg7); + var arg8Number = selector(arg8); + var arg9Number = selector(arg9); + var arg10Number = selector(arg10); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The seventh argument to compare. + /// The eighth argument to compare. + /// The ninth argument to compare. + /// The tenth argument to compare. + /// The eleventh argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + T arg7, + T arg8, + T arg9, + T arg10, + T arg11, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + var arg7Number = selector(arg7); + var arg8Number = selector(arg8); + var arg9Number = selector(arg9); + var arg10Number = selector(arg10); + var arg11Number = selector(arg11); + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The seventh argument to compare. + /// The eighth argument to compare. + /// The ninth argument to compare. + /// The tenth argument to compare. + /// The eleventh argument to compare. + /// The twelfth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + T arg7, + T arg8, + T arg9, + T arg10, + T arg11, + T arg12, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + var arg7Number = selector(arg7); + var arg8Number = selector(arg8); + var arg9Number = selector(arg9); + var arg10Number = selector(arg10); + var arg11Number = selector(arg11); + var arg12Number = selector(arg12); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The seventh argument to compare. + /// The eighth argument to compare. + /// The ninth argument to compare. + /// The tenth argument to compare. + /// The eleventh argument to compare. + /// The twelfth argument to compare. + /// The thirteenth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + T arg7, + T arg8, + T arg9, + T arg10, + T arg11, + T arg12, + T arg13, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + var arg7Number = selector(arg7); + var arg8Number = selector(arg8); + var arg9Number = selector(arg9); + var arg10Number = selector(arg10); + var arg11Number = selector(arg11); + var arg12Number = selector(arg12); + var arg13Number = selector(arg13); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The seventh argument to compare. + /// The eighth argument to compare. + /// The ninth argument to compare. + /// The tenth argument to compare. + /// The eleventh argument to compare. + /// The twelfth argument to compare. + /// The thirteenth argument to compare. + /// The fourteenth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + T arg7, + T arg8, + T arg9, + T arg10, + T arg11, + T arg12, + T arg13, + T arg14, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + var arg7Number = selector(arg7); + var arg8Number = selector(arg8); + var arg9Number = selector(arg9); + var arg10Number = selector(arg10); + var arg11Number = selector(arg11); + var arg12Number = selector(arg12); + var arg13Number = selector(arg13); + var arg14Number = selector(arg14); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number, + arg14, + arg14Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The seventh argument to compare. + /// The eighth argument to compare. + /// The ninth argument to compare. + /// The tenth argument to compare. + /// The eleventh argument to compare. + /// The twelfth argument to compare. + /// The thirteenth argument to compare. + /// The fourteenth argument to compare. + /// The fifteenth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + T arg7, + T arg8, + T arg9, + T arg10, + T arg11, + T arg12, + T arg13, + T arg14, + T arg15, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + var arg7Number = selector(arg7); + var arg8Number = selector(arg8); + var arg9Number = selector(arg9); + var arg10Number = selector(arg10); + var arg11Number = selector(arg11); + var arg12Number = selector(arg12); + var arg13Number = selector(arg13); + var arg14Number = selector(arg14); + var arg15Number = selector(arg15); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number, + arg14, + arg14Number, + arg15, + arg15Number); + } + + /// + /// Gets the item that has the highest value, based on a selector. + /// + /// The type being compared. + /// The first argument to compare. + /// The second argument to compare. + /// The third argument to compare. + /// The forth argument to compare. + /// The fifth argument to compare. + /// The sixth argument to compare. + /// The seventh argument to compare. + /// The eighth argument to compare. + /// The ninth argument to compare. + /// The tenth argument to compare. + /// The eleventh argument to compare. + /// The twelfth argument to compare. + /// The thirteenth argument to compare. + /// The fourteenth argument to compare. + /// The fifteenth argument to compare. + /// The sixteenth argument to compare. + /// The function to use to get the value to compare on each argument. + /// The item with the highest value. + public static T ItemWithMax( + T arg1, + T arg2, + T arg3, + T arg4, + T arg5, + T arg6, + T arg7, + T arg8, + T arg9, + T arg10, + T arg11, + T arg12, + T arg13, + T arg14, + T arg15, + T arg16, + Func selector) + { + var arg1Number = selector(arg1); + var arg2Number = selector(arg2); + var arg3Number = selector(arg3); + var arg4Number = selector(arg4); + var arg5Number = selector(arg5); + var arg6Number = selector(arg6); + var arg7Number = selector(arg7); + var arg8Number = selector(arg8); + var arg9Number = selector(arg9); + var arg10Number = selector(arg10); + var arg11Number = selector(arg11); + var arg12Number = selector(arg12); + var arg13Number = selector(arg13); + var arg14Number = selector(arg14); + var arg15Number = selector(arg15); + var arg16Number = selector(arg16); + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number, + arg14, + arg14Number, + arg15, + arg15Number, + arg16, + arg16Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number) + { + return arg2Number > arg1Number + ? arg2 + : arg1; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number, + T arg7, + long arg7Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number, + T arg7, + long arg7Number, + T arg8, + long arg8Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number, + T arg7, + long arg7Number, + T arg8, + long arg8Number, + T arg9, + long arg9Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number, + T arg7, + long arg7Number, + T arg8, + long arg8Number, + T arg9, + long arg9Number, + T arg10, + long arg10Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number, + T arg7, + long arg7Number, + T arg8, + long arg8Number, + T arg9, + long arg9Number, + T arg10, + long arg10Number, + T arg11, + long arg11Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number, + T arg7, + long arg7Number, + T arg8, + long arg8Number, + T arg9, + long arg9Number, + T arg10, + long arg10Number, + T arg11, + long arg11Number, + T arg12, + long arg12Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number, + T arg7, + long arg7Number, + T arg8, + long arg8Number, + T arg9, + long arg9Number, + T arg10, + long arg10Number, + T arg11, + long arg11Number, + T arg12, + long arg12Number, + T arg13, + long arg13Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number, + T arg7, + long arg7Number, + T arg8, + long arg8Number, + T arg9, + long arg9Number, + T arg10, + long arg10Number, + T arg11, + long arg11Number, + T arg12, + long arg12Number, + T arg13, + long arg13Number, + T arg14, + long arg14Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number, + arg14, + arg14Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number, + arg14, + arg14Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number, + T arg7, + long arg7Number, + T arg8, + long arg8Number, + T arg9, + long arg9Number, + T arg10, + long arg10Number, + T arg11, + long arg11Number, + T arg12, + long arg12Number, + T arg13, + long arg13Number, + T arg14, + long arg14Number, + T arg15, + long arg15Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number, + arg14, + arg14Number, + arg15, + arg15Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number, + arg14, + arg14Number, + arg15, + arg15Number); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static T ItemWithMaxInternal( + T arg1, + long arg1Number, + T arg2, + long arg2Number, + T arg3, + long arg3Number, + T arg4, + long arg4Number, + T arg5, + long arg5Number, + T arg6, + long arg6Number, + T arg7, + long arg7Number, + T arg8, + long arg8Number, + T arg9, + long arg9Number, + T arg10, + long arg10Number, + T arg11, + long arg11Number, + T arg12, + long arg12Number, + T arg13, + long arg13Number, + T arg14, + long arg14Number, + T arg15, + long arg15Number, + T arg16, + long arg16Number) + { + if (arg2Number > arg1Number) + { + return ItemWithMaxInternal( + arg2, + arg2Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number, + arg14, + arg14Number, + arg15, + arg15Number, + arg16, + arg16Number); + } + + return ItemWithMaxInternal( + arg1, + arg1Number, + arg3, + arg3Number, + arg4, + arg4Number, + arg5, + arg5Number, + arg6, + arg6Number, + arg7, + arg7Number, + arg8, + arg8Number, + arg9, + arg9Number, + arg10, + arg10Number, + arg11, + arg11Number, + arg12, + arg12Number, + arg13, + arg13Number, + arg14, + arg14Number, + arg15, + arg15Number, + arg16, + arg16Number); + } + } +} diff --git a/src/Whipstaff.sln b/src/Whipstaff.sln index 257cc8b41..1486ac84c 100644 --- a/src/Whipstaff.sln +++ b/src/Whipstaff.sln @@ -49,6 +49,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Whipstaff.Couchbase", "Whip EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Whipstaff.NodaTime", "Whipstaff.NodaTime\Whipstaff.NodaTime.csproj", "{74CF7649-3848-4265-BC96-A5DCA8D176AE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Whipstaff.Nuget", "Whipstaff.Nuget\Whipstaff.Nuget.csproj", "{D5E1AC46-891E-4D02-B1F3-A169C4901875}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Whipstaff.Playwright", "Whipstaff.Playwright\Whipstaff.Playwright.csproj", "{6C010B59-155B-4E48-9FDF-DCCD549706A4}" EndProject Global @@ -145,6 +147,10 @@ Global {74CF7649-3848-4265-BC96-A5DCA8D176AE}.Debug|Any CPU.Build.0 = Debug|Any CPU {74CF7649-3848-4265-BC96-A5DCA8D176AE}.Release|Any CPU.ActiveCfg = Release|Any CPU {74CF7649-3848-4265-BC96-A5DCA8D176AE}.Release|Any CPU.Build.0 = Release|Any CPU + {D5E1AC46-891E-4D02-B1F3-A169C4901875}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5E1AC46-891E-4D02-B1F3-A169C4901875}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5E1AC46-891E-4D02-B1F3-A169C4901875}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5E1AC46-891E-4D02-B1F3-A169C4901875}.Release|Any CPU.Build.0 = Release|Any CPU {6C010B59-155B-4E48-9FDF-DCCD549706A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6C010B59-155B-4E48-9FDF-DCCD549706A4}.Debug|Any CPU.Build.0 = Debug|Any CPU {6C010B59-155B-4E48-9FDF-DCCD549706A4}.Release|Any CPU.ActiveCfg = Release|Any CPU