blob: 58e829b67f1dc3b45c168d9f47d8f304b08ecf7a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace SarahEngine;
public static class NetExtensions
{
public static T FromBytes<T>(this Span<byte> span) where T : unmanaged => MemoryMarshal.Read<T>(span);
public static void ToBytes<T>(this T value, Span<byte> span) where T : unmanaged => MemoryMarshal.Write(span, value);
}
public abstract class RPCBase
{
protected abstract void FromBytes(Span<byte> span);
}
public class RPC<T>(Action<T> method) : RPCBase where T : unmanaged
{
readonly Action<T> Method = method;
readonly byte[] bytes = new byte[Unsafe.SizeOf<T>()];
public void SendRPC(T param)
{
param.ToBytes(bytes);
//Network it, baby
}
protected override void FromBytes(Span<byte> span)
{
T result = span.FromBytes<T>();
Method.Invoke(result);
}
}
public class RPC<T1, T2>(Action<T1, T2> method) : RPCBase
where T1 : unmanaged
where T2 : unmanaged
{
readonly Action<T1, T2> Method = method;
readonly byte[] bytes = new byte[Unsafe.SizeOf<T1>()+Unsafe.SizeOf<T2>()];
public void SendRPC(T1 param1, T2 param2)
{
Span<byte> span = bytes;
param1.ToBytes(span);
span = span[Unsafe.SizeOf<T1>()..];
param2.ToBytes(span);
//Network it, baby
}
protected override void FromBytes(Span<byte> span)
{
T1 result1 = span.FromBytes<T1>();
span = span[Unsafe.SizeOf<T1>()..];
T2 result2 = span.FromBytes<T2>();
Method.Invoke(result1, result2);
}
}
|