protected Barrier GenerateSubtreeBarrier(int startOffset = 0, BarrierFlags flags = BarrierFlags.None) { var result = new SlotDictionary(); var resultFlags = flags; for (var i = NodeIndex + startOffset; i < NextNodeIndex; i++) { Barrier barrier; if (!Result.TryGet(i, out barrier)) { continue; } foreach (var slot in barrier.Slots) { result[slot.Name] |= slot.Flags; } resultFlags |= barrier.Flags; } return(Barrier.New( NodeIndex, resultFlags, result )); }
protected void CreateBarrier(SlotDictionary slots, BarrierFlags flags = BarrierFlags.None) { Barrier existing; if (Result.TryGet(NodeIndex, out existing)) { Result.Remove(existing); foreach (var slot in existing.Slots) { slots[slot.Name] |= slot.Flags; } Result.Add(Barrier.New( NodeIndex, flags | existing.Flags, slots )); } else { Result.Add(Barrier.New( NodeIndex, flags, slots )); } }
public static Barrier New(int node, BarrierFlags flags, SlotDictionary slots) { return(new Barrier(node, flags, slots.ToArray())); }