using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace SarahEngine; public static class NetExtensions { public static T FromBytes(this Span span) where T : unmanaged => MemoryMarshal.Read(span); public static void ToBytes(this T value, Span span) where T : unmanaged => MemoryMarshal.Write(span, value); } public abstract class RPCBase { protected abstract void FromBytes(Span span); } public class RPC(Action method) : RPCBase where T : unmanaged { readonly Action Method = method; readonly byte[] bytes = new byte[Unsafe.SizeOf()]; public void SendRPC(T param) { param.ToBytes(bytes); //Network it, baby } protected override void FromBytes(Span span) { T result = span.FromBytes(); Method.Invoke(result); } } public class RPC(Action method) : RPCBase where T1 : unmanaged where T2 : unmanaged { readonly Action Method = method; readonly byte[] bytes = new byte[Unsafe.SizeOf()+Unsafe.SizeOf()]; public void SendRPC(T1 param1, T2 param2) { Span span = bytes; param1.ToBytes(span); span = span[Unsafe.SizeOf()..]; param2.ToBytes(span); //Network it, baby } protected override void FromBytes(Span span) { T1 result1 = span.FromBytes(); span = span[Unsafe.SizeOf()..]; T2 result2 = span.FromBytes(); Method.Invoke(result1, result2); } }