Files
QWERTYkez.Mensura/QWERTYkez.Mensura.Generator/ComplexUnitGenerator.cs
Fantom TM 7c0f89ebbb
All checks were successful
Publish NuGet packages / publish (push) Successful in 1m15s
EFcoreExtension
2026-06-13 20:25:29 +07:00

1704 lines
141 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
namespace G;
[Generator]
public class ComplexUnitGenerator : IIncrementalGenerator
{
private const string AttributeName = "ComplexUnitGenerator";
public void Initialize(IncrementalGeneratorInitializationContext context)
{
// 1. Генерируем определение атрибута
context.RegisterPostInitializationOutput(ctx =>
{
string attributeSource = @"
namespace QWERTYkez.Mensura
{
[System.AttributeUsage(System.AttributeTargets.Struct, AllowMultiple = false)]
internal sealed class ComplexUnitGeneratorAttribute : System.Attribute
{
public string TypeNameA { get; }
public string TypeNameB { get; }
public string TypeNameZ { get; }
public ComplexUnitGeneratorAttribute(string typeNameA, string typeNameB, string typeNameZ)
{
TypeNameA = typeNameA;
TypeNameB = typeNameB;
TypeNameZ = typeNameZ;
}
}
}";
ctx.AddSource(".ComplexUnitGeneratorAttribute.g.cs", SourceText.From(attributeSource, Encoding.UTF8));
});
// 2. Ищем все readonly partial record struct с этим атрибутом
var structsProvider = context.SyntaxProvider
.CreateSyntaxProvider(
predicate: static (node, _) => IsTargetStruct(node),
transform: static (ctx, _) => GetStructInfo(ctx))
.Where(info => info.HasValue)
.Select((info, _) => info!.Value)
.Collect();
// 3. Регистрируем вывод для каждой найденной структуры
context.RegisterSourceOutput(structsProvider, (spc, structs) =>
{
// Ваш оригинальный цикл генерации комплексных структур
foreach (var structInfo in structs)
{
string generatedCode = GeneratePartial(structInfo.TypeName, structInfo.Namespace,
structInfo.TypeNameA, structInfo.TypeNameB, structInfo.TypeNameZ);
spc.AddSource($"{structInfo.TypeName}.g.cs", SourceText.From(generatedCode, Encoding.UTF8));
}
// --- ТОТ САМЫЙ КОД УСЛОВНОЙ ГЕНЕРАЦИИ БИНДЕРА ---
bool isMainAssembly = false;
var firstStruct = structs.FirstOrDefault();
if (firstStruct.TypeNameZ != null)
{
// Если пространство имен содержит "Tests", флаг останется false
if (firstStruct.Namespace.StartsWith("QWERTYkez.Mensura") && !firstStruct.Namespace.Contains("Tests"))
{
isMainAssembly = true;
}
}
// Генерируем файл ТОЛЬКО для основного проекта
if (isMainAssembly)
{
var sb = new StringBuilder();
sb.AppendLine("namespace QWERTYkez.Mensura;");
sb.AppendLine("internal static partial class MensuraBinder");
sb.AppendLine("{");
sb.AppendLine(" [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]");
sb.AppendLine(" static partial void AddGeneratedComplexConverters(System.Collections.IList converters)");
sb.AppendLine(" {");
foreach (var structInfo in structs)
{
sb.AppendLine($" converters.Add(new QWERTYkez.Mensura.MensuraBinder.NewtonsoftRegistrar.NewtonsoftUnitConverter<QWERTYkez.Mensura.Units.{structInfo.TypeNameZ}>());");
}
sb.AppendLine(" }");
sb.AppendLine("}");
spc.AddSource(".ComplexUnits.MensuraBinder.g.cs", SourceText.From(sb.ToString(), Encoding.UTF8));
sb = new StringBuilder();
sb.AppendLine("using Microsoft.EntityFrameworkCore;");
sb.AppendLine("namespace QWERTYkez.Mensura.Extensions;");
sb.AppendLine("public static partial class EFCoreExtension");
sb.AppendLine("{");
sb.AppendLine(" [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]");
sb.AppendLine(" internal static void AddGeneratedComplexConverters(ModelConfigurationBuilder configurationBuilder)");
sb.AppendLine(" {");
foreach (var structInfo in structs)
{
sb.AppendLine($" configurationBuilder.Properties<{structInfo.TypeName}>().HaveConversion<MensuraUnitConverter<{structInfo.TypeName}>>();");
}
sb.AppendLine(" }");
sb.AppendLine("}");
spc.AddSource(".ComplexUnits.EFCoreExtension.g.cs", SourceText.From(sb.ToString(), Encoding.UTF8));
}
});
}
private static bool IsTargetStruct(SyntaxNode node)
{
if (node is not RecordDeclarationSyntax record)
return false;
// Должен быть record struct с модификаторами readonly и partial
if (!record.Modifiers.Any(SyntaxKind.ReadOnlyKeyword) ||
!record.Modifiers.Any(SyntaxKind.PartialKeyword) ||
!record.Keyword.IsKind(SyntaxKind.RecordKeyword) ||
!record.ClassOrStructKeyword.IsKind(SyntaxKind.StructKeyword))
return false;
// Проверяем наличие атрибута [ComplexUnitGenerator] или [ComplexUnitGeneratorAttribute]
foreach (var attrList in record.AttributeLists)
foreach (var attr in attrList.Attributes)
{
string name = attr.Name.ToString();
if (name == AttributeName || name == AttributeName + "Attribute")
return true;
}
return false;
}
private static StructInfo? GetStructInfo(GeneratorSyntaxContext context)
{
var record = (RecordDeclarationSyntax)context.Node;
var semanticModel = context.SemanticModel;
if (semanticModel.GetDeclaredSymbol(record) is not INamedTypeSymbol typeSymbol)
return null;
string namespaceName = typeSymbol.ContainingNamespace?.ToString() ?? "";
if (string.IsNullOrEmpty(namespaceName))
return null;
// Извлекаем аргументы атрибута
string typeNameA = null;
string typeNameB = null;
string typeNameZ = null;
foreach (var attrList in record.AttributeLists)
foreach (var attr in attrList.Attributes)
{
string name = attr.Name.ToString();
if (name == AttributeName || name == AttributeName + "Attribute")
{
// Ищем аргументы конструктора
var args = attr.ArgumentList?.Arguments;
if (args.HasValue && args.Value.Count >= 3)
{
typeNameA = GetStringFromExpression(args.Value[0].Expression, semanticModel);
typeNameB = GetStringFromExpression(args.Value[1].Expression, semanticModel);
typeNameZ = GetStringFromExpression(args.Value[2].Expression, semanticModel);
}
break;
}
}
if (typeNameA == null || typeNameB == null || typeNameZ == null)
return null;
return new StructInfo(namespaceName, typeSymbol.Name, typeNameA, typeNameB, typeNameZ);
}
private static string GetStringFromExpression(ExpressionSyntax expr, SemanticModel semanticModel)
{
// Поддерживаем строковые литералы и константы
if (expr is LiteralExpressionSyntax literal && literal.IsKind(SyntaxKind.StringLiteralExpression))
return literal.Token.ValueText;
// Если это доступ к константе, пытаемся вычислить через семантику
var constantValue = semanticModel.GetConstantValue(expr);
if (constantValue.HasValue && constantValue.Value is string s)
return s;
return null;
}
private static string GeneratePartial(string typeName, string ns, string typeNameA, string typeNameB, string typeNameZ)
{
// Шаблон, который вы вставите сами.
// В нём используйте {typeName}, {ns}, {typeNameA}, {typeNameB}, {typeNameZ}
// Например:
string template = @"
global using {typeNameZ}Extensions = QWERTYkez.Mensura.Units.{typeNameZ}Extensions;
global using {typeNameZ} = QWERTYkez.Mensura.Units.{typeNameZ};
using System.Globalization;
using System.Runtime.Serialization;
namespace QWERTYkez.Mensura.Units;
[JsonConverter(typeof(UnitJsonConverter<{typeNameZ}>))]
public readonly partial record struct {typeNameZ} : IMensuraUnit<{typeNameZ}>, IEquatable<{typeNameZ}>, IMensuraUnit
{
[JsonInclude, DataMember, JsonPropertyName(""v""), Obsolete] // для JSON / EF на случай сбоев, если пробелма с _Value
internal double Value { get => _Value; init => _Value = value; }
internal readonly double _Value;
internal {typeNameZ}(double value) => _Value = value;
[NotMapped, JsonIgnore, IgnoreDataMember] internal {typeNameA} PerValue
{ get => ({typeNameA})_Value; init => _Value = (double)value; }
public static explicit operator {typeNameZ}(double val) => Unsafe.As<double, {typeNameZ}>(ref val);
public static explicit operator double({typeNameZ} unit) => unit._Value;
[JsonIgnore, IgnoreDataMember] public bool IsPositive => _Value >= 0;
[JsonIgnore, IgnoreDataMember] public bool IsGreaterThanZero => _Value > 0;
[JsonIgnore, IgnoreDataMember] public bool IsNegative => double.IsNegative(_Value);
[JsonIgnore, IgnoreDataMember] public bool IsZero => _Value == 0;
[JsonIgnore, IgnoreDataMember] public bool IsNaN => double.IsNaN(_Value);
[JsonIgnore, IgnoreDataMember] public bool IsFinite => double.IsFinite(_Value);
[JsonIgnore, IgnoreDataMember] public bool IsInfinity => double.IsInfinity(_Value);
[JsonIgnore, IgnoreDataMember] public bool IsPositiveInfinity => double.IsPositiveInfinity(_Value);
[JsonIgnore, IgnoreDataMember] public bool IsNegativeInfinity => double.IsNegativeInfinity(_Value);
public static {typeNameZ} Zero { get; } = new(0d);
public static {typeNameZ} Min { get; } = new(double.MinValue);
public static {typeNameZ} Max { get; } = new(double.MaxValue);
public static {typeNameZ} NegativeInfinity { get; } = new(double.NegativeInfinity);
public static {typeNameZ} PositiveInfinity { get; } = new(double.PositiveInfinity);
public static bool operator ==({typeNameZ}? T1, {typeNameZ}? T2) => T1.Protected() == T2.Protected();
public static bool operator !=({typeNameZ}? T1, {typeNameZ}? T2) => T1.Protected() != T2.Protected();
public static bool operator <({typeNameZ}? T1, {typeNameZ}? T2) => T1.Protected() < T2.Protected();
public static bool operator <=({typeNameZ}? T1, {typeNameZ}? T2) => T1.Protected() <= T2.Protected();
public static bool operator >({typeNameZ}? T1, {typeNameZ}? T2) => T1.Protected() > T2.Protected();
public static bool operator >=({typeNameZ}? T1, {typeNameZ}? T2) => T1.Protected() >= T2.Protected();
public static {typeNameZ} operator +({typeNameZ} T2) => new(+T2._Value);
public static {typeNameZ} operator +({typeNameZ} T1, {typeNameZ} T2) => new(T1._Value + T2._Value);
public static {typeNameZ} operator -({typeNameZ} T2) => new(-T2._Value);
public static {typeNameZ} operator -({typeNameZ} T1, {typeNameZ} T2) => new(T1._Value - T2._Value);
// double
public static {typeNameZ} operator *({typeNameZ} T1, double T2) => new(T1._Value * T2);
public static {typeNameZ} operator *({typeNameZ} T1, double? T2) => T1 * (T2 ?? 0d);
public static {typeNameZ} operator *(double T1, {typeNameZ} T2) => new(T1 * T2._Value);
public static {typeNameZ} operator *(double? T1, {typeNameZ} T2) => (T1 ?? 0d) * T2;
public static {typeNameZ} operator /({typeNameZ} T1, double T2) => new(T1._Value / T2);
public static {typeNameZ} operator /({typeNameZ} T1, double? T2) => T1 / (T2 ?? 0d);
public static double operator /({typeNameZ} T1, {typeNameZ} T2) => T1._Value / T2._Value;
// sbyte
public static {typeNameZ} operator *({typeNameZ} T1, sbyte T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, sbyte? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(sbyte T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(sbyte? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, sbyte T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, sbyte? T2) => T1 / T2.ToDouble();
// short
public static {typeNameZ} operator *({typeNameZ} T1, short T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, short? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(short T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(short? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, short T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, short? T2) => T1 / T2.ToDouble();
// int
public static {typeNameZ} operator *({typeNameZ} T1, int T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, int? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(int T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(int? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, int T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, int? T2) => T1 / T2.ToDouble();
// long
public static {typeNameZ} operator *({typeNameZ} T1, long T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, long? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(long T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(long? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, long T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, long? T2) => T1 / T2.ToDouble();
// byte
public static {typeNameZ} operator *({typeNameZ} T1, byte T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, byte? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(byte T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(byte? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, byte T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, byte? T2) => T1 / T2.ToDouble();
// ushort
public static {typeNameZ} operator *({typeNameZ} T1, ushort T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, ushort? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(ushort T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(ushort? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, ushort T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, ushort? T2) => T1 / T2.ToDouble();
// uint
public static {typeNameZ} operator *({typeNameZ} T1, uint T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, uint? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(uint T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(uint? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, uint T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, uint? T2) => T1 / T2.ToDouble();
// ulong
public static {typeNameZ} operator *({typeNameZ} T1, ulong T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, ulong? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(ulong T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(ulong? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, ulong T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, ulong? T2) => T1 / T2.ToDouble();
// nint
public static {typeNameZ} operator *({typeNameZ} T1, nint T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, nint? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(nint T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(nint? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, nint T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, nint? T2) => T1 / T2.ToDouble();
// nuint
public static {typeNameZ} operator *({typeNameZ} T1, nuint T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, nuint? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(nuint T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(nuint? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, nuint T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, nuint? T2) => T1 / T2.ToDouble();
// Half
public static {typeNameZ} operator *({typeNameZ} T1, Half T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, Half? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(Half T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(Half? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, Half T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, Half? T2) => T1 / T2.ToDouble();
// float
public static {typeNameZ} operator *({typeNameZ} T1, float T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, float? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(float T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(float? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, float T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, float? T2) => T1 / T2.ToDouble();
// decimal
public static {typeNameZ} operator *({typeNameZ} T1, decimal T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, decimal? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(decimal T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(decimal? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, decimal T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, decimal? T2) => T1 / T2.ToDouble();
#if NET7_0_OR_GREATER
// Int128
public static {typeNameZ} operator *({typeNameZ} T1, Int128 T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, Int128? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(Int128 T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(Int128? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, Int128 T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, Int128? T2) => T1 / T2.ToDouble();
// UInt128
public static {typeNameZ} operator *({typeNameZ} T1, UInt128 T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *({typeNameZ} T1, UInt128? T2) => T1 * T2.ToDouble();
public static {typeNameZ} operator *(UInt128 T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator *(UInt128? T1, {typeNameZ} T2) => T1.ToDouble() * T2;
public static {typeNameZ} operator /({typeNameZ} T1, UInt128 T2) => T1 / T2.ToDouble();
public static {typeNameZ} operator /({typeNameZ} T1, UInt128? T2) => T1 / T2.ToDouble();
#endif
public static {typeNameA} operator *({typeNameZ} left, {typeNameB} right) => new(left._Value * right._Value);
public static {typeNameA} operator *({typeNameZ}? left, {typeNameB} right) => new(left.Protected() * right._Value);
public static {typeNameA} operator *({typeNameZ} left, {typeNameB}? right) => new(left._Value * right.Protected());
public static {typeNameA} operator *({typeNameZ}? left, {typeNameB}? right) => new(left.Protected() * right.Protected());
public static {typeNameA} operator *({typeNameB} left, {typeNameZ} right) => new(right._Value * left._Value);
public static {typeNameA} operator *({typeNameB}? left, {typeNameZ} right) => new(right._Value * left.Protected());
public static {typeNameA} operator *({typeNameB} left, {typeNameZ}? right) => new(right.Protected() * left._Value);
public static {typeNameA} operator *({typeNameB}? left, {typeNameZ}? right) => new(right.Protected() * left.Protected());
public static {typeNameB} operator /({typeNameA} left, {typeNameZ} right) => new(left._Value / right._Value);
public static {typeNameB} operator /({typeNameA}? left, {typeNameZ} right) => new(left.Protected() / right._Value);
public static {typeNameB} operator /({typeNameA} left, {typeNameZ}? right) => new(left._Value / right.Protected());
public static {typeNameB} operator /({typeNameA}? left, {typeNameZ}? right) => new(left.Protected() / right.Protected());
// === Array ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}[] operator
*({typeNameB}[] units, {typeNameZ} multiplicator) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}?[] operator
*({typeNameB}?[] units, {typeNameZ} multiplicator) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}[] operator
*({typeNameZ} multiplicator, {typeNameB}[] units) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}?[] operator
*({typeNameZ} multiplicator, {typeNameB}?[] units) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}[] operator *({typeNameB}[] units, {typeNameZ}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new {typeNameA}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}?[] operator *({typeNameB}?[] units, {typeNameZ}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new {typeNameA}?[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}[] operator *({typeNameZ}? multiplicator, {typeNameB}[] units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new {typeNameA}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}?[] operator *({typeNameZ}? multiplicator, {typeNameB}?[] units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new {typeNameA}?[units.Length]);
// === List<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}> operator
*(List<{typeNameB}> units, {typeNameZ} multiplicator) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}?> operator
*(List<{typeNameB}?> units, {typeNameZ} multiplicator) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}> operator
*({typeNameZ} multiplicator, List<{typeNameB}> units) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}?> operator
*({typeNameZ} multiplicator, List<{typeNameB}?> units) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}> operator *(List<{typeNameB}> units, {typeNameZ}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new List<{typeNameA}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}?> operator *(List<{typeNameB}?> units, {typeNameZ}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new List<{typeNameA}?>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}> operator *({typeNameZ}? multiplicator, List<{typeNameB}> units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new List<{typeNameA}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}?> operator *({typeNameZ}? multiplicator, List<{typeNameB}?> units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new List<{typeNameA}?>(units.Count));
// === IEnumerable<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}> operator
*(IEnumerable<{typeNameB}> units, {typeNameZ} multiplicator) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}?> operator
*(IEnumerable<{typeNameB}?> units, {typeNameZ} multiplicator) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}> operator
*({typeNameZ} multiplicator, IEnumerable<{typeNameB}> units) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}?> operator
*({typeNameZ} multiplicator, IEnumerable<{typeNameB}?> units) => units.Mul<{typeNameB}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}> operator *(IEnumerable<{typeNameB}> units, {typeNameZ}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : units.Select(u => new {typeNameA}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}?> operator *(IEnumerable<{typeNameB}?> units, {typeNameZ}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameA}?)null : new {typeNameA}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}> operator *({typeNameZ}? multiplicator, IEnumerable<{typeNameB}> units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : units.Select(u => new {typeNameA}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}?> operator *({typeNameZ}? multiplicator, IEnumerable<{typeNameB}?> units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameA}?)null : new {typeNameA}(0d)));
// === Array ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}[] operator
/({typeNameA}[] units, {typeNameZ} divisor) => units.Div<{typeNameA}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}?[] operator
/({typeNameA}?[] units, {typeNameZ} divisor) => units.Div<{typeNameA}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}[] operator
/({typeNameZ} dividend, {typeNameA}[] units) => dividend._Value.Div<{typeNameA}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}?[] operator
/({typeNameZ} dividend, {typeNameA}?[] units) => dividend._Value.Div<{typeNameA}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}[] operator /({typeNameA}[] units, {typeNameZ}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new {typeNameB}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}?[] operator /({typeNameA}?[] units, {typeNameZ}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new {typeNameB}?[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}[] operator /({typeNameZ}? dividend, {typeNameA}[] units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new {typeNameB}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}?[] operator /({typeNameZ}? dividend, {typeNameA}?[] units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new {typeNameB}?[units.Length]);
// === List<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}> operator
/(List<{typeNameA}> units, {typeNameZ} divisor) => units.Div<{typeNameA}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}?> operator
/(List<{typeNameA}?> units, {typeNameZ} divisor) => units.Div<{typeNameA}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}> operator
/({typeNameZ} dividend, List<{typeNameA}> units) => dividend._Value.Div<{typeNameA}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}?> operator
/({typeNameZ} dividend, List<{typeNameA}?> units) => dividend._Value.Div<{typeNameA}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}> operator /(List<{typeNameA}> units, {typeNameZ}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new List<{typeNameB}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}?> operator /(List<{typeNameA}?> units, {typeNameZ}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new List<{typeNameB}?>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}> operator /({typeNameZ}? dividend, List<{typeNameA}> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new List<{typeNameB}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}?> operator /({typeNameZ}? dividend, List<{typeNameA}?> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new List<{typeNameB}?>(units.Count));
// === IEnumerable<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}> operator
/(IEnumerable<{typeNameA}> units, {typeNameZ} divisor) => units.Div<{typeNameA}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}?> operator
/(IEnumerable<{typeNameA}?> units, {typeNameZ} divisor) => units.Div<{typeNameA}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}> operator
/({typeNameZ} dividend, IEnumerable<{typeNameA}> units) => dividend._Value.Div<{typeNameA}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}?> operator
/({typeNameZ} dividend, IEnumerable<{typeNameA}?> units) => dividend._Value.Div<{typeNameA}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}> operator /(IEnumerable<{typeNameA}> units, {typeNameZ}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : units.Select(u => new {typeNameB}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}?> operator /(IEnumerable<{typeNameA}?> units, {typeNameZ}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameB}?)null : new {typeNameB}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}> operator /({typeNameZ}? dividend, IEnumerable<{typeNameA}> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : units.Select(u => new {typeNameB}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}?> operator /({typeNameZ}? dividend, IEnumerable<{typeNameA}?> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameB}?)null : new {typeNameB}(0d)));
public static {typeNameZ}[] operator +({typeNameZ}[] T1, {typeNameZ} T2) => T1.Plus(T2._Value);
public static {typeNameZ}?[] operator +({typeNameZ}?[] T1, {typeNameZ} T2) => T1.Plus(T2._Value);
public static {typeNameZ}[] operator +({typeNameZ} T1, {typeNameZ}[] T2) => T1._Value.Plus(T2);
public static {typeNameZ}?[] operator +({typeNameZ} T1, {typeNameZ}?[] T2) => T1._Value.Plus(T2);
public static {typeNameZ}[] operator +({typeNameZ}[] T1, {typeNameZ}? T2) => T1.Plus(T2.Protected());
public static {typeNameZ}?[] operator +({typeNameZ}?[] T1, {typeNameZ}? T2) => T1.Plus(T2.Protected());
public static {typeNameZ}[] operator +({typeNameZ}? T1, {typeNameZ}[] T2) => T1.Protected().Plus(T2);
public static {typeNameZ}?[] operator +({typeNameZ}? T1, {typeNameZ}?[] T2) => T1.Protected().Plus(T2);
public static {typeNameZ}[] operator -({typeNameZ}[] T1, {typeNameZ} T2) => T1.Minus(T2._Value);
public static {typeNameZ}?[] operator -({typeNameZ}?[] T1, {typeNameZ} T2) => T1.Minus(T2._Value);
public static {typeNameZ}[] operator -({typeNameZ} T1, {typeNameZ}[] T2) => T1._Value.Minus(T2);
public static {typeNameZ}?[] operator -({typeNameZ} T1, {typeNameZ}?[] T2) => T1._Value.Minus(T2);
public static {typeNameZ}[] operator -({typeNameZ}[] T1, {typeNameZ}? T2) => T1.Minus(T2.Protected());
public static {typeNameZ}?[] operator -({typeNameZ}?[] T1, {typeNameZ}? T2) => T1.Minus(T2.Protected());
public static {typeNameZ}[] operator -({typeNameZ}? T1, {typeNameZ}[] T2) => T1.Protected().Minus(T2);
public static {typeNameZ}?[] operator -({typeNameZ}? T1, {typeNameZ}?[] T2) => T1.Protected().Minus(T2);
public static double[] operator /({typeNameZ} T1, {typeNameZ}[] T2) => T1.Div(T2);
public static double?[] operator /({typeNameZ} T1, {typeNameZ}?[] T2) => T1.Div(T2);
public static double[] operator /({typeNameZ}[] T1, {typeNameZ} T2) => T1.Div(T2);
public static double?[] operator /({typeNameZ}?[] T1, {typeNameZ} T2) => T1.Div(T2);
public static double[] operator /({typeNameZ}? T1, {typeNameZ}[] T2) => T1.ProtectedU().Div(T2);
public static double?[] operator /({typeNameZ}? T1, {typeNameZ}?[] T2) => T1.ProtectedU().Div(T2);
public static double[] operator /({typeNameZ}[] T1, {typeNameZ}? T2) => T1.Div(T2.ProtectedU());
public static double?[] operator /({typeNameZ}?[] T1, {typeNameZ}? T2) => T1.Div(T2.ProtectedU());
// double
public static {typeNameZ}[] operator *({typeNameZ} T1, double[] T2) => T1.Mul(T2);
public static {typeNameZ}?[] operator *({typeNameZ} T1, double?[] T2) => T1.Mul(T2);
public static {typeNameZ}[] operator *({typeNameZ}? T1, double[] T2) => T1.ProtectedU().Mul(T2);
public static {typeNameZ}?[] operator *({typeNameZ}? T1, double?[] T2) => T1.ProtectedU().Mul(T2);
public static {typeNameZ}[] operator *(double[] T1, {typeNameZ} T2) => T1.Mul(T2);
public static {typeNameZ}?[] operator *(double?[] T1, {typeNameZ} T2) => T1.Mul(T2);
public static {typeNameZ}[] operator *(double[] T1, {typeNameZ}? T2) => T1.Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(double?[] T1, {typeNameZ}? T2) => T1.Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, double[] T2) => T1.Div(T2);
public static {typeNameZ}?[] operator /({typeNameZ} T1, double?[] T2) => T1.Div(T2);
public static {typeNameZ}[] operator /({typeNameZ}? T1, double[] T2) => T1.ProtectedU().Div(T2);
public static {typeNameZ}?[] operator /({typeNameZ}? T1, double?[] T2) => T1.ProtectedU().Div(T2);
// sbyte
public static {typeNameZ}[] operator *({typeNameZ} T1, sbyte[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, sbyte?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, sbyte[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, sbyte?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(sbyte[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(sbyte?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(sbyte[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(sbyte?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, sbyte[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, sbyte?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, sbyte[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, sbyte?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// short
public static {typeNameZ}[] operator *({typeNameZ} T1, short[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, short?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, short[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, short?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(short[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(short?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(short[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(short?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, short[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, short?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, short[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, short?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// int
public static {typeNameZ}[] operator *({typeNameZ} T1, int[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, int?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, int[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, int?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(int[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(int?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(int[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(int?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, int[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, int?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, int[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, int?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// long
public static {typeNameZ}[] operator *({typeNameZ} T1, long[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, long?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, long[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, long?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(long[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(long?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(long[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(long?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, long[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, long?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, long[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, long?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// byte
public static {typeNameZ}[] operator *({typeNameZ} T1, byte[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, byte?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, byte[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, byte?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(byte[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(byte?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(byte[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(byte?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, byte[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, byte?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, byte[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, byte?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// ushort
public static {typeNameZ}[] operator *({typeNameZ} T1, ushort[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, ushort?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, ushort[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, ushort?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(ushort[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(ushort?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(ushort[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(ushort?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, ushort[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, ushort?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, ushort[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, ushort?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// uint
public static {typeNameZ}[] operator *({typeNameZ} T1, uint[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, uint?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, uint[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, uint?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(uint[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(uint?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(uint[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(uint?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, uint[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, uint?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, uint[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, uint?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// ulong
public static {typeNameZ}[] operator *({typeNameZ} T1, ulong[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, ulong?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, ulong[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, ulong?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(ulong[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(ulong?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(ulong[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(ulong?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, ulong[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, ulong?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, ulong[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, ulong?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// nint
public static {typeNameZ}[] operator *({typeNameZ} T1, nint[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, nint?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, nint[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, nint?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(nint[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(nint?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(nint[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(nint?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, nint[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, nint?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, nint[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, nint?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// nuint
public static {typeNameZ}[] operator *({typeNameZ} T1, nuint[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, nuint?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, nuint[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, nuint?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(nuint[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(nuint?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(nuint[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(nuint?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, nuint[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, nuint?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, nuint[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, nuint?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// Half
public static {typeNameZ}[] operator *({typeNameZ} T1, Half[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, Half?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, Half[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, Half?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(Half[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(Half?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(Half[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(Half?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, Half[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, Half?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, Half[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, Half?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// float
public static {typeNameZ}[] operator *({typeNameZ} T1, float[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, float?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, float[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, float?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(float[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(float?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(float[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(float?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, float[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, float?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, float[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, float?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// decimal
public static {typeNameZ}[] operator *({typeNameZ} T1, decimal[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, decimal?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, decimal[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, decimal?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(decimal[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(decimal?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(decimal[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(decimal?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, decimal[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, decimal?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, decimal[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, decimal?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
#if NET7_0_OR_GREATER
// Int128
public static {typeNameZ}[] operator *({typeNameZ} T1, Int128[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, Int128?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, Int128[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, Int128?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(Int128[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(Int128?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(Int128[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(Int128?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, Int128[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, Int128?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, Int128[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, Int128?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
// UInt128
public static {typeNameZ}[] operator *({typeNameZ} T1, UInt128[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ} T1, UInt128?[] T2) => T1.Mul(T2.ToDouble());
public static {typeNameZ}[] operator *({typeNameZ}? T1, UInt128[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}?[] operator *({typeNameZ}? T1, UInt128?[] T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static {typeNameZ}[] operator *(UInt128[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}?[] operator *(UInt128?[] T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static {typeNameZ}[] operator *(UInt128[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}?[] operator *(UInt128?[] T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static {typeNameZ}[] operator /({typeNameZ} T1, UInt128[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ} T1, UInt128?[] T2) => T1.Div(T2.ToDouble());
public static {typeNameZ}[] operator /({typeNameZ}? T1, UInt128[] T2) => T1.ProtectedU().Div(T2.ToDouble());
public static {typeNameZ}?[] operator /({typeNameZ}? T1, UInt128?[] T2) => T1.ProtectedU().Div(T2.ToDouble());
#endif
public static List<{typeNameZ}> operator +(List<{typeNameZ}> T1, {typeNameZ} T2) => T1.Plus(T2._Value);
public static List<{typeNameZ}?> operator +(List<{typeNameZ}?> T1, {typeNameZ} T2) => T1.Plus(T2._Value);
public static List<{typeNameZ}> operator +({typeNameZ} T1, List<{typeNameZ}> T2) => T1._Value.Plus(T2);
public static List<{typeNameZ}?> operator +({typeNameZ} T1, List<{typeNameZ}?> T2) => T1._Value.Plus(T2);
public static List<{typeNameZ}> operator +(List<{typeNameZ}> T1, {typeNameZ}? T2) => T1.Plus(T2.Protected());
public static List<{typeNameZ}?> operator +(List<{typeNameZ}?> T1, {typeNameZ}? T2) => T1.Plus(T2.Protected());
public static List<{typeNameZ}> operator +({typeNameZ}? T1, List<{typeNameZ}> T2) => T1.Protected().Plus(T2);
public static List<{typeNameZ}?> operator +({typeNameZ}? T1, List<{typeNameZ}?> T2) => T1.Protected().Plus(T2);
public static List<{typeNameZ}> operator -(List<{typeNameZ}> T1, {typeNameZ} T2) => T1.Minus(T2._Value);
public static List<{typeNameZ}?> operator -(List<{typeNameZ}?> T1, {typeNameZ} T2) => T1.Minus(T2._Value);
public static List<{typeNameZ}> operator -({typeNameZ} T1, List<{typeNameZ}> T2) => T1._Value.Minus(T2);
public static List<{typeNameZ}?> operator -({typeNameZ} T1, List<{typeNameZ}?> T2) => T1._Value.Minus(T2);
public static List<{typeNameZ}> operator -(List<{typeNameZ}> T1, {typeNameZ}? T2) => T1.Minus(T2.Protected());
public static List<{typeNameZ}?> operator -(List<{typeNameZ}?> T1, {typeNameZ}? T2) => T1.Minus(T2.Protected());
public static List<{typeNameZ}> operator -({typeNameZ}? T1, List<{typeNameZ}> T2) => T1.Protected().Minus(T2);
public static List<{typeNameZ}?> operator -({typeNameZ}? T1, List<{typeNameZ}?> T2) => T1.Protected().Minus(T2);
public static List<double> operator /({typeNameZ} T1, List<{typeNameZ}> T2) => T1.Div(T2);
public static List<double?> operator /({typeNameZ} T1, List<{typeNameZ}?> T2) => T1.Div(T2);
public static List<double> operator /(List<{typeNameZ}> T1, {typeNameZ} T2) => T1.Div(T2);
public static List<double?> operator /(List<{typeNameZ}?> T1, {typeNameZ} T2) => T1.Div(T2);
public static List<double> operator /({typeNameZ}? T1, List<{typeNameZ}> T2) => T1.ProtectedU().Div(T2);
public static List<double?> operator /({typeNameZ}? T1, List<{typeNameZ}?> T2) => T1.ProtectedU().Div(T2);
public static List<double> operator /(List<{typeNameZ}> T1, {typeNameZ}? T2) => T1.Div(T2.ProtectedU());
public static List<double?> operator /(List<{typeNameZ}?> T1, {typeNameZ}? T2) => T1.Div(T2.ProtectedU());
// double
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<double> T2) => T1.Mul(T2);
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<double?> T2) => T1.Mul(T2);
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<double> T2) => T1.ProtectedU().Mul(T2);
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<double?> T2) => T1.ProtectedU().Mul(T2);
public static List<{typeNameZ}> operator *(List<double> T1, {typeNameZ} T2) => T1.Mul(T2);
public static List<{typeNameZ}?> operator *(List<double?> T1, {typeNameZ} T2) => T1.Mul(T2);
public static List<{typeNameZ}> operator *(List<double> T1, {typeNameZ}? T2) => T1.Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<double?> T1, {typeNameZ}? T2) => T1.Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<double> T2) => T1.Div(T2);
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<double?> T2) => T1.Div(T2);
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<double> T2) => T1.ProtectedU().Div(T2);
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<double?> T2) => T1.ProtectedU().Div(T2);
// sbyte
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<sbyte> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<sbyte?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<sbyte> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<sbyte?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<sbyte> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<sbyte?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<sbyte> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<sbyte?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<sbyte> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<sbyte?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<sbyte> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<sbyte?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// short
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<short> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<short?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<short> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<short?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<short> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<short?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<short> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<short?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<short> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<short?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<short> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<short?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// int
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<int> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<int?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<int> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<int?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<int> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<int?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<int> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<int?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<int> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<int?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<int> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<int?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// long
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<long> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<long?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<long> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<long?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<long> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<long?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<long> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<long?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<long> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<long?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<long> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<long?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// byte
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<byte> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<byte?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<byte> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<byte?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<byte> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<byte?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<byte> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<byte?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<byte> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<byte?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<byte> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<byte?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// ushort
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<ushort> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<ushort?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<ushort> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<ushort?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<ushort> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<ushort?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<ushort> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<ushort?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<ushort> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<ushort?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<ushort> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<ushort?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// uint
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<uint> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<uint?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<uint> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<uint?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<uint> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<uint?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<uint> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<uint?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<uint> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<uint?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<uint> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<uint?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// ulong
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<ulong> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<ulong?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<ulong> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<ulong?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<ulong> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<ulong?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<ulong> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<ulong?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<ulong> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<ulong?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<ulong> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<ulong?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// nint
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<nint> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<nint?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<nint> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<nint?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<nint> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<nint?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<nint> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<nint?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<nint> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<nint?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<nint> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<nint?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// nuint
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<nuint> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<nuint?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<nuint> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<nuint?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<nuint> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<nuint?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<nuint> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<nuint?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<nuint> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<nuint?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<nuint> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<nuint?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// float
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<float> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<float?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<float> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<float?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<float> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<float?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<float> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<float?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<float> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<float?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<float> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<float?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// decimal
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<decimal> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<decimal?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<decimal> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<decimal?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<decimal> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<decimal?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<decimal> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<decimal?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<decimal> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<decimal?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<decimal> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<decimal?> T2) => T1.ProtectedU().Div(T2.ToDouble());
#if NET7_0_OR_GREATER
// Int128
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<Int128> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<Int128?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<Int128> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<Int128?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<Int128> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<Int128?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<Int128> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<Int128?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<Int128> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<Int128?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<Int128> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<Int128?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// UInt128
public static List<{typeNameZ}> operator *({typeNameZ} T1, List<UInt128> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ} T1, List<UInt128?> T2) => T1.Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *({typeNameZ}? T1, List<UInt128> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}?> operator *({typeNameZ}? T1, List<UInt128?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static List<{typeNameZ}> operator *(List<UInt128> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}?> operator *(List<UInt128?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static List<{typeNameZ}> operator *(List<UInt128> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}?> operator *(List<UInt128?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static List<{typeNameZ}> operator /({typeNameZ} T1, List<UInt128> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ} T1, List<UInt128?> T2) => T1.Div(T2.ToDouble());
public static List<{typeNameZ}> operator /({typeNameZ}? T1, List<UInt128> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static List<{typeNameZ}?> operator /({typeNameZ}? T1, List<UInt128?> T2) => T1.ProtectedU().Div(T2.ToDouble());
#endif
public static IEnumerable<{typeNameZ}> operator +(IEnumerable<{typeNameZ}> T1, {typeNameZ} T2) => T1.Plus(T2._Value);
public static IEnumerable<{typeNameZ}?> operator +(IEnumerable<{typeNameZ}?> T1, {typeNameZ} T2) => T1.Plus(T2._Value);
public static IEnumerable<{typeNameZ}> operator +({typeNameZ} T1, IEnumerable<{typeNameZ}> T2) => T1._Value.Plus(T2);
public static IEnumerable<{typeNameZ}?> operator +({typeNameZ} T1, IEnumerable<{typeNameZ}?> T2) => T1._Value.Plus(T2);
public static IEnumerable<{typeNameZ}> operator +(IEnumerable<{typeNameZ}> T1, {typeNameZ}? T2) => T1.Plus(T2.Protected());
public static IEnumerable<{typeNameZ}?> operator +(IEnumerable<{typeNameZ}?> T1, {typeNameZ}? T2) => T1.Plus(T2.Protected());
public static IEnumerable<{typeNameZ}> operator +({typeNameZ}? T1, IEnumerable<{typeNameZ}> T2) => T1.Protected().Plus(T2);
public static IEnumerable<{typeNameZ}?> operator +({typeNameZ}? T1, IEnumerable<{typeNameZ}?> T2) => T1.Protected().Plus(T2);
public static IEnumerable<{typeNameZ}> operator -(IEnumerable<{typeNameZ}> T1, {typeNameZ} T2) => T1.Minus(T2._Value);
public static IEnumerable<{typeNameZ}?> operator -(IEnumerable<{typeNameZ}?> T1, {typeNameZ} T2) => T1.Minus(T2._Value);
public static IEnumerable<{typeNameZ}> operator -({typeNameZ} T1, IEnumerable<{typeNameZ}> T2) => T1._Value.Minus(T2);
public static IEnumerable<{typeNameZ}?> operator -({typeNameZ} T1, IEnumerable<{typeNameZ}?> T2) => T1._Value.Minus(T2);
public static IEnumerable<{typeNameZ}> operator -(IEnumerable<{typeNameZ}> T1, {typeNameZ}? T2) => T1.Minus(T2.Protected());
public static IEnumerable<{typeNameZ}?> operator -(IEnumerable<{typeNameZ}?> T1, {typeNameZ}? T2) => T1.Minus(T2.Protected());
public static IEnumerable<{typeNameZ}> operator -({typeNameZ}? T1, IEnumerable<{typeNameZ}> T2) => T1.Protected().Minus(T2);
public static IEnumerable<{typeNameZ}?> operator -({typeNameZ}? T1, IEnumerable<{typeNameZ}?> T2) => T1.Protected().Minus(T2);
public static IEnumerable<double> operator /({typeNameZ} T1, IEnumerable<{typeNameZ}> T2) => T1.Div(T2);
public static IEnumerable<double?> operator /({typeNameZ} T1, IEnumerable<{typeNameZ}?> T2) => T1.Div(T2);
public static IEnumerable<double> operator /(IEnumerable<{typeNameZ}> T1, {typeNameZ} T2) => T1.Div(T2);
public static IEnumerable<double?> operator /(IEnumerable<{typeNameZ}?> T1, {typeNameZ} T2) => T1.Div(T2);
public static IEnumerable<double> operator /({typeNameZ}? T1, IEnumerable<{typeNameZ}> T2) => T1.ProtectedU().Div(T2);
public static IEnumerable<double?> operator /({typeNameZ}? T1, IEnumerable<{typeNameZ}?> T2) => T1.ProtectedU().Div(T2);
public static IEnumerable<double> operator /(IEnumerable<{typeNameZ}> T1, {typeNameZ}? T2) => T1.Div(T2.ProtectedU());
public static IEnumerable<double?> operator /(IEnumerable<{typeNameZ}?> T1, {typeNameZ}? T2) => T1.Div(T2.ProtectedU());
// double
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<double> T2) => T1.Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<double?> T2) => T1.Mul(T2);
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<double> T2) => T1.ProtectedU().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<double?> T2) => T1.ProtectedU().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<double> T1, {typeNameZ} T2) => T1.Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<double?> T1, {typeNameZ} T2) => T1.Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<double> T1, {typeNameZ}? T2) => T1.Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<double?> T1, {typeNameZ}? T2) => T1.Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<double> T2) => T1.Div(T2);
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<double?> T2) => T1.Div(T2);
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<double> T2) => T1.ProtectedU().Div(T2);
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<double?> T2) => T1.ProtectedU().Div(T2);
// sbyte
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<sbyte> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<sbyte?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<sbyte> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<sbyte?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<sbyte> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<sbyte?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<sbyte> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<sbyte?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<sbyte> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<sbyte?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<sbyte> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<sbyte?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// short
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<short> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<short?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<short> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<short?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<short> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<short?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<short> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<short?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<short> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<short?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<short> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<short?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// int
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<int> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<int?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<int> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<int?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<int> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<int?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<int> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<int?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<int> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<int?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<int> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<int?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// long
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<long> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<long?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<long> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<long?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<long> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<long?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<long> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<long?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<long> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<long?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<long> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<long?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// byte
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<byte> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<byte?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<byte> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<byte?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<byte> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<byte?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<byte> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<byte?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<byte> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<byte?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<byte> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<byte?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// ushort
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<ushort> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<ushort?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<ushort> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<ushort?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<ushort> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<ushort?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<ushort> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<ushort?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<ushort> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<ushort?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<ushort> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<ushort?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// uint
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<uint> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<uint?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<uint> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<uint?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<uint> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<uint?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<uint> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<uint?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<uint> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<uint?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<uint> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<uint?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// ulong
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<ulong> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<ulong?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<ulong> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<ulong?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<ulong> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<ulong?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<ulong> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<ulong?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<ulong> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<ulong?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<ulong> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<ulong?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// nint
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<nint> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<nint?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<nint> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<nint?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<nint> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<nint?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<nint> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<nint?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<nint> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<nint?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<nint> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<nint?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// nuint
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<nuint> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<nuint?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<nuint> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<nuint?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<nuint> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<nuint?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<nuint> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<nuint?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<nuint> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<nuint?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<nuint> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<nuint?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// float
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<float> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<float?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<float> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<float?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<float> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<float?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<float> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<float?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<float> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<float?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<float> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<float?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// decimal
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<decimal> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<decimal?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<decimal> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<decimal?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<decimal> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<decimal?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<decimal> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<decimal?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<decimal> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<decimal?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<decimal> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<decimal?> T2) => T1.ProtectedU().Div(T2.ToDouble());
#if NET7_0_OR_GREATER
// Int128
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<Int128> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<Int128?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<Int128> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<Int128?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<Int128> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<Int128?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<Int128> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<Int128?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<Int128> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<Int128?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<Int128> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<Int128?> T2) => T1.ProtectedU().Div(T2.ToDouble());
// UInt128
public static IEnumerable<{typeNameZ}> operator *({typeNameZ} T1, IEnumerable<UInt128> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ} T1, IEnumerable<UInt128?> T2) => T1.Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *({typeNameZ}? T1, IEnumerable<UInt128> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator *({typeNameZ}? T1, IEnumerable<UInt128?> T2) => T1.ProtectedU().Mul(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<UInt128> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<UInt128?> T1, {typeNameZ} T2) => T1.ToDouble().Mul(T2);
public static IEnumerable<{typeNameZ}> operator *(IEnumerable<UInt128> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}?> operator *(IEnumerable<UInt128?> T1, {typeNameZ}? T2) => T1.ToDouble().Mul(T2.ProtectedU());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ} T1, IEnumerable<UInt128> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ} T1, IEnumerable<UInt128?> T2) => T1.Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}> operator /({typeNameZ}? T1, IEnumerable<UInt128> T2) => T1.ProtectedU().Div(T2.ToDouble());
public static IEnumerable<{typeNameZ}?> operator /({typeNameZ}? T1, IEnumerable<UInt128?> T2) => T1.ProtectedU().Div(T2.ToDouble());
#endif
}
public static class {typeNameZ}Extensions
{
// === ReadOnlySpan
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Div(this ReadOnlySpan<{typeNameZ}> units,
double divisor, Span<{typeNameZ}> destination) => units.Div<{typeNameZ}>(divisor, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Div(this ReadOnlySpan<{typeNameZ}?> units,
double divisor, Span<{typeNameZ}?> destination) => units.Div<{typeNameZ}>(divisor, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Div(this double dividend,
ReadOnlySpan<{typeNameZ}> units, Span<{typeNameZ}> destination) => dividend.Div<{typeNameZ}>(units, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Div(this double dividend,
ReadOnlySpan<{typeNameZ}?> units, Span<{typeNameZ}?> destination) => dividend.Div<{typeNameZ}>(units, destination);
// === Array ===
[MethodImpl(MethodImplOptions.AggressiveInlining)]public static {typeNameZ}[] Div(
this {typeNameZ}[] units, double divisor) => units.Div<{typeNameZ}>(divisor);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] Div(
this {typeNameZ}?[] units, double divisor) => units.Div<{typeNameZ}>(divisor);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}[] Div(
this double dividend, {typeNameZ}[] units) => dividend.Div<{typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] Div(
this double dividend, {typeNameZ}?[] units) => dividend.Div<{typeNameZ}>(units);
// === List<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> Div(
this List<{typeNameZ}> units, double divisor) => units.Div<{typeNameZ}>(divisor);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> Div(
this List<{typeNameZ}?> units, double divisor) => units.Div<{typeNameZ}>(divisor);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> Div(
this double dividend, List<{typeNameZ}> units) => dividend.Div<{typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> Div(
this double dividend, List<{typeNameZ}?> units) => dividend.Div<{typeNameZ}>(units);
// === IReadOnlyCollection<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)]public static void Div(this IReadOnlyCollection<{typeNameZ}> units,
double divisor, Span<{typeNameZ}> destination) => units.Div<{typeNameZ}>(divisor, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)]public static void Div(this IReadOnlyCollection<{typeNameZ}?> units,
double divisor, Span<{typeNameZ}?> destination) => units.Div<{typeNameZ}>(divisor, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Div(this double dividend,
IReadOnlyCollection<{typeNameZ}> units, Span<{typeNameZ}> destination) => dividend.Div<{typeNameZ}>(units, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Div(this double dividend,
IReadOnlyCollection<{typeNameZ}?> units, Span<{typeNameZ}?> destination) => dividend.Div<{typeNameZ}>(units, destination);
// === IEnumerable<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> Div(
this IEnumerable<{typeNameZ}> units, double divisor) => units.Div<{typeNameZ}>(divisor);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> Div(
this IEnumerable<{typeNameZ}?> units, double divisor) => units.Div<{typeNameZ}>(divisor);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> Div(
this double dividend, IEnumerable<{typeNameZ}> units) => dividend.Div<{typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> Div(
this double dividend, IEnumerable<{typeNameZ}?> units) => dividend.Div<{typeNameZ}>(units);
// === ReadOnlySpan
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Mul(this ReadOnlySpan<{typeNameZ}> units,
double multiplicator, Span<{typeNameZ}> destination) => units.Mul<{typeNameZ}>(multiplicator, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Mul(this ReadOnlySpan<{typeNameZ}?> units,
double multiplicator, Span<{typeNameZ}?> destination) => units.Mul<{typeNameZ}>(multiplicator, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Mul(this double multiplicator,
ReadOnlySpan<{typeNameZ}> units, Span<{typeNameZ}> destination) => units.Mul<{typeNameZ}>(multiplicator, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Mul(this double multiplicator,
ReadOnlySpan<{typeNameZ}?> units, Span<{typeNameZ}?> destination) => units.Mul<{typeNameZ}>(multiplicator, destination);
// === Array ===
[MethodImpl(MethodImplOptions.AggressiveInlining)]public static {typeNameZ}[] Mul(
this {typeNameZ}[] units, double multiplicator) => units.Mul<{typeNameZ}>(multiplicator);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] Mul(
this {typeNameZ}?[] units, double multiplicator) => units.Mul<{typeNameZ}>(multiplicator);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}[] Mul(
this double multiplicator, {typeNameZ}[] units) => units.Mul<{typeNameZ}>(multiplicator);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] Mul(
this double multiplicator, {typeNameZ}?[] units) => units.Mul<{typeNameZ}>(multiplicator);
// === List<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> Mul(
this List<{typeNameZ}> units, double multiplicator) => units.Mul<{typeNameZ}>(multiplicator);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> Mul(
this List<{typeNameZ}?> units, double multiplicator) => units.Mul<{typeNameZ}>(multiplicator);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> Mul(
this double multiplicator, List<{typeNameZ}> units) => units.Mul<{typeNameZ}>(multiplicator);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> Mul(
this double multiplicator, List<{typeNameZ}?> units) => units.Mul<{typeNameZ}>(multiplicator);
// === IReadOnlyCollection<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)]public static void Mul(this IReadOnlyCollection<{typeNameZ}> units,
double multiplicator, Span<{typeNameZ}> destination) => units.Mul<{typeNameZ}>(multiplicator, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)]public static void Mul(this IReadOnlyCollection<{typeNameZ}?> units,
double multiplicator, Span<{typeNameZ}?> destination) => units.Mul<{typeNameZ}>(multiplicator, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Mul(this double multiplicator,
IReadOnlyCollection<{typeNameZ}> units, Span<{typeNameZ}> destination) => units.Mul<{typeNameZ}>(multiplicator, destination);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Mul(this double multiplicator,
IReadOnlyCollection<{typeNameZ}?> units, Span<{typeNameZ}?> destination) => units.Mul<{typeNameZ}>(multiplicator, destination);
// === IEnumerable<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> Mul(
this IEnumerable<{typeNameZ}> units, double multiplicator) => units.Mul<{typeNameZ}>(multiplicator);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> Mul(
this IEnumerable<{typeNameZ}?> units, double multiplicator) => units.Mul<{typeNameZ}>(multiplicator);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> Mul(
this double multiplicator, IEnumerable<{typeNameZ}> units) => units.Mul<{typeNameZ}>(multiplicator);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> Mul(
this double multiplicator, IEnumerable<{typeNameZ}?> units) => units.Mul<{typeNameZ}>(multiplicator);
// Sum Avg Max Min (не nullable) ==========================================
// === ReadOnlySpan === SIMD
public static {typeNameZ} Sum(this ReadOnlySpan<{typeNameZ}> units) => AggregateUnitExtensions.Sum(units);
public static {typeNameZ} Avg(this ReadOnlySpan<{typeNameZ}> units) => AggregateUnitExtensions.Avg(units);
public static {typeNameZ} Max(this ReadOnlySpan<{typeNameZ}> units) => AggregateUnitExtensions.Max(units);
public static {typeNameZ} Min(this ReadOnlySpan<{typeNameZ}> units) => AggregateUnitExtensions.Min(units);
// === List<T> ===
public static {typeNameZ} Sum(this List<{typeNameZ}> list) => AggregateUnitExtensions.Sum(list);
public static {typeNameZ} Avg(this List<{typeNameZ}> list) => AggregateUnitExtensions.Avg(list);
public static {typeNameZ} Max(this List<{typeNameZ}> list) => AggregateUnitExtensions.Max(list);
public static {typeNameZ} Min(this List<{typeNameZ}> list) => AggregateUnitExtensions.Min(list);
// === IReadOnlyCollection<T> ===
public static {typeNameZ} Sum(this IReadOnlyCollection<{typeNameZ}> collection) => AggregateUnitExtensions.Sum(collection);
public static {typeNameZ} Avg(this IReadOnlyCollection<{typeNameZ}> collection) => AggregateUnitExtensions.Avg(collection);
public static {typeNameZ} Max(this IReadOnlyCollection<{typeNameZ}> collection) => AggregateUnitExtensions.Max(collection);
public static {typeNameZ} Min(this IReadOnlyCollection<{typeNameZ}> collection) => AggregateUnitExtensions.Min(collection);
// === IEnumerable<T> ===
public static {typeNameZ} Sum(this IEnumerable<{typeNameZ}> collection) => AggregateUnitExtensions.Sum(collection);
public static {typeNameZ} Avg(this IEnumerable<{typeNameZ}> collection) => AggregateUnitExtensions.Avg(collection);
public static {typeNameZ} Max(this IEnumerable<{typeNameZ}> collection) => AggregateUnitExtensions.Max(collection);
public static {typeNameZ} Min(this IEnumerable<{typeNameZ}> collection) => AggregateUnitExtensions.Min(collection);
// Sum Avg Max Min (nullable) ==========================================
// === ReadOnlySpan ===
public static {typeNameZ} Sum(this ReadOnlySpan<{typeNameZ}?> units) => AggregateUnitExtensions.Sum(units);
public static {typeNameZ} Avg(this ReadOnlySpan<{typeNameZ}?> units) => AggregateUnitExtensions.Avg(units);
public static {typeNameZ} Max(this ReadOnlySpan<{typeNameZ}?> units) => AggregateUnitExtensions.Max(units);
public static {typeNameZ} Min(this ReadOnlySpan<{typeNameZ}?> units) => AggregateUnitExtensions.Min(units);
// === List<T> ===
public static {typeNameZ} Sum(this List<{typeNameZ}?> list) => AggregateUnitExtensions.Sum(list);
public static {typeNameZ} Avg(this List<{typeNameZ}?> list) => AggregateUnitExtensions.Avg(list);
public static {typeNameZ} Max(this List<{typeNameZ}?> list) => AggregateUnitExtensions.Max(list);
public static {typeNameZ} Min(this List<{typeNameZ}?> list) => AggregateUnitExtensions.Min(list);
// === IReadOnlyCollection<T> ===
public static {typeNameZ} Sum(this IReadOnlyCollection<{typeNameZ}?> collection) => AggregateUnitExtensions.Sum(collection);
public static {typeNameZ} Avg(this IReadOnlyCollection<{typeNameZ}?> collection) => AggregateUnitExtensions.Avg(collection);
public static {typeNameZ} Max(this IReadOnlyCollection<{typeNameZ}?> collection) => AggregateUnitExtensions.Max(collection);
public static {typeNameZ} Min(this IReadOnlyCollection<{typeNameZ}?> collection) => AggregateUnitExtensions.Min(collection);
// === IEnumerable<T> ===
public static {typeNameZ} Sum(this IEnumerable<{typeNameZ}?> collection) => AggregateUnitExtensions.Sum(collection);
public static {typeNameZ} Avg(this IEnumerable<{typeNameZ}?> collection) => AggregateUnitExtensions.Avg(collection);
public static {typeNameZ} Max(this IEnumerable<{typeNameZ}?> collection) => AggregateUnitExtensions.Max(collection);
public static {typeNameZ} Min(this IEnumerable<{typeNameZ}?> collection) => AggregateUnitExtensions.Min(collection);
}
public readonly partial record struct {typeNameA}
{
// === Array ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}[] operator
/({typeNameZ}[] units, {typeNameA} divisor) => units.Div<{typeNameZ}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}?[] operator
/({typeNameZ}?[] units, {typeNameA} divisor) => units.Div<{typeNameZ}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}[] operator
/({typeNameA} dividend, {typeNameZ}[] units) => dividend._Value.Div<{typeNameZ}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}?[] operator
/({typeNameA} dividend, {typeNameZ}?[] units) => dividend._Value.Div<{typeNameZ}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}[] operator /({typeNameZ}[] units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new {typeNameB}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}?[] operator /({typeNameZ}?[] units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new {typeNameB}?[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}[] operator /({typeNameA}? dividend, {typeNameZ}[] units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new {typeNameB}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameB}?[] operator /({typeNameA}? dividend, {typeNameZ}?[] units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new {typeNameB}?[units.Length]);
// === List<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}> operator
/(List<{typeNameZ}> units, {typeNameA} divisor) => units.Div<{typeNameZ}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}?> operator
/(List<{typeNameZ}?> units, {typeNameA} divisor) => units.Div<{typeNameZ}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}> operator
/({typeNameA} dividend, List<{typeNameZ}> units) => dividend._Value.Div<{typeNameZ}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}?> operator
/({typeNameA} dividend, List<{typeNameZ}?> units) => dividend._Value.Div<{typeNameZ}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}> operator /(List<{typeNameZ}> units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new List<{typeNameB}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}?> operator /(List<{typeNameZ}?> units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new List<{typeNameB}?>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}> operator /({typeNameA}? dividend, List<{typeNameZ}> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new List<{typeNameB}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameB}?> operator /({typeNameA}? dividend, List<{typeNameZ}?> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new List<{typeNameB}?>(units.Count));
// === IEnumerable<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}> operator
/(IEnumerable<{typeNameZ}> units, {typeNameA} divisor) => units.Div<{typeNameZ}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}?> operator
/(IEnumerable<{typeNameZ}?> units, {typeNameA} divisor) => units.Div<{typeNameZ}, {typeNameB}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}> operator
/({typeNameA} dividend, IEnumerable<{typeNameZ}> units) => dividend._Value.Div<{typeNameZ}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}?> operator
/({typeNameA} dividend, IEnumerable<{typeNameZ}?> units) => dividend._Value.Div<{typeNameZ}, {typeNameB}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}> operator /(IEnumerable<{typeNameZ}> units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : units.Select(u => new {typeNameB}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}?> operator /(IEnumerable<{typeNameZ}?> units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameB}?)null : new {typeNameB}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}> operator /({typeNameA}? dividend, IEnumerable<{typeNameZ}> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : units.Select(u => new {typeNameB}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameB}?> operator /({typeNameA}? dividend, IEnumerable<{typeNameZ}?> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameB}?)null : new {typeNameB}(0d)));
// === Array ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}[] operator
/({typeNameB}[] units, {typeNameA} divisor) => units.Div<{typeNameB}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] operator
/({typeNameB}?[] units, {typeNameA} divisor) => units.Div<{typeNameB}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}[] operator
/({typeNameA} dividend, {typeNameB}[] units) => dividend._Value.Div<{typeNameB}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] operator
/({typeNameA} dividend, {typeNameB}?[] units) => dividend._Value.Div<{typeNameB}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}[] operator /({typeNameB}[] units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new {typeNameZ}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] operator /({typeNameB}?[] units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new {typeNameZ}?[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}[] operator /({typeNameA}? dividend, {typeNameB}[] units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new {typeNameZ}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] operator /({typeNameA}? dividend, {typeNameB}?[] units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new {typeNameZ}?[units.Length]);
// === List<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> operator
/(List<{typeNameB}> units, {typeNameA} divisor) => units.Div<{typeNameB}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> operator
/(List<{typeNameB}?> units, {typeNameA} divisor) => units.Div<{typeNameB}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> operator
/({typeNameA} dividend, List<{typeNameB}> units) => dividend._Value.Div<{typeNameB}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> operator
/({typeNameA} dividend, List<{typeNameB}?> units) => dividend._Value.Div<{typeNameB}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> operator /(List<{typeNameB}> units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new List<{typeNameZ}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> operator /(List<{typeNameB}?> units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new List<{typeNameZ}?>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> operator /({typeNameA}? dividend, List<{typeNameB}> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new List<{typeNameZ}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> operator /({typeNameA}? dividend, List<{typeNameB}?> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new List<{typeNameZ}?>(units.Count));
// === IEnumerable<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> operator
/(IEnumerable<{typeNameB}> units, {typeNameA} divisor) => units.Div<{typeNameB}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> operator
/(IEnumerable<{typeNameB}?> units, {typeNameA} divisor) => units.Div<{typeNameB}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> operator
/({typeNameA} dividend, IEnumerable<{typeNameB}> units) => dividend._Value.Div<{typeNameB}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> operator
/({typeNameA} dividend, IEnumerable<{typeNameB}?> units) => dividend._Value.Div<{typeNameB}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> operator /(IEnumerable<{typeNameB}> units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : units.Select(u => new {typeNameZ}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> operator /(IEnumerable<{typeNameB}?> units, {typeNameA}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameZ}?)null : new {typeNameZ}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> operator /({typeNameA}? dividend, IEnumerable<{typeNameB}> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : units.Select(u => new {typeNameZ}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> operator /({typeNameA}? dividend, IEnumerable<{typeNameB}?> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameZ}?)null : new {typeNameZ}(0d)));
}
public readonly partial record struct {typeNameB}
{
public static {typeNameZ} operator /({typeNameA} left, {typeNameB} right) => new(left._Value / right._Value);
public static {typeNameZ} operator /({typeNameA}? left, {typeNameB} right) => new(left.Protected() / right._Value);
public static {typeNameZ} operator /({typeNameA} left, {typeNameB}? right) => new(left._Value / right.Protected());
public static {typeNameZ} operator /({typeNameA}? left, {typeNameB}? right) => new(left.Protected() / right.Protected());
// === Array ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}[] operator
*({typeNameZ}[] units, {typeNameB} multiplicator) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}?[] operator
*({typeNameZ}?[] units, {typeNameB} multiplicator) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}[] operator
*({typeNameB} multiplicator, {typeNameZ}[] units) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}?[] operator
*({typeNameB} multiplicator, {typeNameZ}?[] units) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}[] operator *({typeNameZ}[] units, {typeNameB}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new {typeNameA}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}?[] operator *({typeNameZ}?[] units, {typeNameB}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new {typeNameA}?[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}[] operator *({typeNameB}? multiplicator, {typeNameZ}[] units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new {typeNameA}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameA}?[] operator *({typeNameB}? multiplicator, {typeNameZ}?[] units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new {typeNameA}?[units.Length]);
// === List<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}> operator
*(List<{typeNameZ}> units, {typeNameB} multiplicator) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}?> operator
*(List<{typeNameZ}?> units, {typeNameB} multiplicator) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}> operator
*({typeNameB} multiplicator, List<{typeNameZ}> units) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}?> operator
*({typeNameB} multiplicator, List<{typeNameZ}?> units) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}> operator *(List<{typeNameZ}> units, {typeNameB}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new List<{typeNameA}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}?> operator *(List<{typeNameZ}?> units, {typeNameB}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new List<{typeNameA}?>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}> operator *({typeNameB}? multiplicator, List<{typeNameZ}> units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new List<{typeNameA}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameA}?> operator *({typeNameB}? multiplicator, List<{typeNameZ}?> units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : new List<{typeNameA}?>(units.Count));
// === IEnumerable<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}> operator
*(IEnumerable<{typeNameZ}> units, {typeNameB} multiplicator) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}?> operator
*(IEnumerable<{typeNameZ}?> units, {typeNameB} multiplicator) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}> operator
*({typeNameB} multiplicator, IEnumerable<{typeNameZ}> units) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}?> operator
*({typeNameB} multiplicator, IEnumerable<{typeNameZ}?> units) => units.Mul<{typeNameZ}, {typeNameA}>(multiplicator._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}> operator *(IEnumerable<{typeNameZ}> units, {typeNameB}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : units.Select(u => new {typeNameA}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}?> operator *(IEnumerable<{typeNameZ}?> units, {typeNameB}? multiplicator) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameA}?)null : new {typeNameA}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}> operator *({typeNameB}? multiplicator, IEnumerable<{typeNameZ}> units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : units.Select(u => new {typeNameA}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameA}?> operator *({typeNameB}? multiplicator, IEnumerable<{typeNameZ}?> units) =>
multiplicator.HasValue ? units * multiplicator.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameA}?)null : new {typeNameA}(0d)));
// === Array ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}[] operator
/({typeNameA}[] units, {typeNameB} divisor) => units.Div<{typeNameA}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] operator
/({typeNameA}?[] units, {typeNameB} divisor) => units.Div<{typeNameA}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}[] operator
/({typeNameB} dividend, {typeNameA}[] units) => dividend._Value.Div<{typeNameA}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] operator
/({typeNameB} dividend, {typeNameA}?[] units) => dividend._Value.Div<{typeNameA}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}[] operator /({typeNameA}[] units, {typeNameB}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new {typeNameZ}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] operator /({typeNameA}?[] units, {typeNameB}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new {typeNameZ}?[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}[] operator /({typeNameB}? dividend, {typeNameA}[] units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new {typeNameZ}[units.Length]);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static {typeNameZ}?[] operator /({typeNameB}? dividend, {typeNameA}?[] units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new {typeNameZ}?[units.Length]);
// === List<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> operator
/(List<{typeNameA}> units, {typeNameB} divisor) => units.Div<{typeNameA}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> operator
/(List<{typeNameA}?> units, {typeNameB} divisor) => units.Div<{typeNameA}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> operator
/({typeNameB} dividend, List<{typeNameA}> units) => dividend._Value.Div<{typeNameA}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> operator
/({typeNameB} dividend, List<{typeNameA}?> units) => dividend._Value.Div<{typeNameA}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> operator /(List<{typeNameA}> units, {typeNameB}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new List<{typeNameZ}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> operator /(List<{typeNameA}?> units, {typeNameB}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : new List<{typeNameZ}?>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}> operator /({typeNameB}? dividend, List<{typeNameA}> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new List<{typeNameZ}>(units.Count));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<{typeNameZ}?> operator /({typeNameB}? dividend, List<{typeNameA}?> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : new List<{typeNameZ}?>(units.Count));
// === IEnumerable<T> ===
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> operator
/(IEnumerable<{typeNameA}> units, {typeNameB} divisor) => units.Div<{typeNameA}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> operator
/(IEnumerable<{typeNameA}?> units, {typeNameB} divisor) => units.Div<{typeNameA}, {typeNameZ}>(divisor._Value);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> operator
/({typeNameB} dividend, IEnumerable<{typeNameA}> units) => dividend._Value.Div<{typeNameA}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> operator
/({typeNameB} dividend, IEnumerable<{typeNameA}?> units) => dividend._Value.Div<{typeNameA}, {typeNameZ}>(units);
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> operator /(IEnumerable<{typeNameA}> units, {typeNameB}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : units.Select(u => new {typeNameZ}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> operator /(IEnumerable<{typeNameA}?> units, {typeNameB}? divisor) =>
divisor.HasValue ? units / divisor.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameZ}?)null : new {typeNameZ}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}> operator /({typeNameB}? dividend, IEnumerable<{typeNameA}> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : units.Select(u => new {typeNameZ}(0d)));
[MethodImpl(MethodImplOptions.AggressiveInlining)] public static IEnumerable<{typeNameZ}?> operator /({typeNameB}? dividend, IEnumerable<{typeNameA}?> units) =>
dividend.HasValue ? units / dividend.Value : (units is null ? null! : units.Select(u => u is null ? ({typeNameZ}?)null : new {typeNameZ}(0d)));
}
";
return template
.Replace("{ns}", ns)
.Replace("{typeName}", typeName)
.Replace("{typeNameA}", typeNameA)
.Replace("{typeNameB}", typeNameB)
.Replace("{typeNameZ}", typeNameZ);
}
private readonly struct StructInfo(string ns, string name, string a, string b, string z)
{
public string Namespace { get; } = ns;
public string TypeName { get; } = name;
public string TypeNameA { get; } = a;
public string TypeNameB { get; } = b;
public string TypeNameZ { get; } = z;
}
}