summaryrefslogtreecommitdiff
path: root/Net.cs
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);
    }
}