using System.Runtime.CompilerServices; namespace Craftimizer.Solver.Crafty; public sealed class ArenaNode where T : struct { public T State; public ArenaBuffer Children; public NodeScoresBuffer ChildScores; public (int arrayIdx, int subIdx) ChildIdx; public readonly ArenaNode? Parent; public NodeScoresBuffer? ParentScores => Parent?.ChildScores; public ArenaNode(T state, ArenaNode? parent = null) { State = state; Children = new(); ChildScores = new(); Parent = parent; } public ArenaNode ChildAt((int arrayIdx, int subIdx) at) => Children.Data[at.arrayIdx][at.subIdx]; [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArenaNode AddConcurrent(T state) { var node = new ArenaNode(state, this); Children.AddConcurrent(node); ChildScores.AddConcurrent(); return node; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArenaNode Add(T state) { var node = new ArenaNode(state, this); Children.Add(node); ChildScores.Add(); return node; } }