mirror of
https://github.com/AssetRipper/AssetRipper.Bindings.LibTorchSharp.git
synced 2026-11-13 04:26:21 -10:00
68 lines
2.5 KiB
C#
68 lines
2.5 KiB
C#
using AssetRipper.Text.SourceGeneration;
|
|
using Microsoft.CodeAnalysis;
|
|
using System;
|
|
using System.CodeDom.Compiler;
|
|
using System.IO;
|
|
|
|
namespace AssetRipper.Bindings.LibTorchSharp.SourceGenerator;
|
|
|
|
public partial class BindingsSourceGenerator
|
|
{
|
|
private static void GenerateTensorScalarOperators(IncrementalGeneratorPostInitializationContext context)
|
|
{
|
|
ReadOnlySpan<string> types = ["byte", "sbyte", "short", "int", "long", "bool", "BFloat16", "Half", "float", "double", "Complex32", "Complex"];
|
|
ReadOnlySpan<string> operators = ["+", "-", "*", "/", "%", "<", "<=", ">", ">=", "==", "!="];
|
|
|
|
StringWriter stringWriter = new();
|
|
IndentedTextWriter writer = IndentedTextWriterFactory.Create(stringWriter);
|
|
|
|
writer.WriteUsing("System.Numerics");
|
|
writer.WriteLineNoTabs();
|
|
writer.WriteFileScopedNamespace("AssetRipper.Bindings.LibTorchSharp");
|
|
writer.WriteLineNoTabs();
|
|
writer.WriteLine("public readonly partial struct Tensor :");
|
|
using (new Indented(writer))
|
|
{
|
|
foreach (string type in types)
|
|
{
|
|
writer.WriteLine($"IAdditionOperators<Tensor, {type}, Tensor>,");
|
|
writer.WriteLine($"ISubtractionOperators<Tensor, {type}, Tensor>,");
|
|
writer.WriteLine($"IMultiplyOperators<Tensor, {type}, Tensor>,");
|
|
writer.WriteLine($"IDivisionOperators<Tensor, {type}, Tensor>,");
|
|
writer.WriteLine($"IModulusOperators<Tensor, {type}, Tensor>,");
|
|
writer.WriteLine($"IComparisonOperators<Tensor, {type}, Tensor>,");
|
|
writer.WriteLine($"IEqualityOperators<Tensor, {type}, Tensor>,");
|
|
}
|
|
|
|
// Trailing comma not allowed
|
|
writer.WriteLine("IAdditionOperators<Tensor, Tensor, Tensor>");
|
|
}
|
|
using (new CurlyBrackets(writer))
|
|
{
|
|
foreach (string type in types)
|
|
{
|
|
writer.WriteComment(type);
|
|
foreach (string @operator in operators)
|
|
{
|
|
writer.WriteLine($"public static Tensor operator {@operator}(Tensor left, {type} right)");
|
|
using (new CurlyBrackets(writer))
|
|
{
|
|
writer.WriteLine("using Scalar scalar = (Scalar)right;");
|
|
writer.WriteLine($"return left {@operator} scalar;");
|
|
}
|
|
writer.WriteLine($"public static Tensor operator {@operator}({type} left, Tensor right)");
|
|
using (new CurlyBrackets(writer))
|
|
{
|
|
writer.WriteLine("using Scalar scalar = (Scalar)left;");
|
|
writer.WriteLine($"return scalar {@operator} right;");
|
|
}
|
|
}
|
|
writer.WriteLine($"public static explicit operator Tensor({type} value) => new Tensor(value);");
|
|
writer.WriteLineNoTabs();
|
|
}
|
|
}
|
|
|
|
context.AddSource("Tensor.Operators.cs", stringWriter.ToString());
|
|
}
|
|
}
|