using System; namespace Microsoft.CodeAnalysis.Syntax.InternalSyntax; internal class SyntaxListPool { private ArrayElement[] _freeList = new ArrayElement[10]; private int _freeIndex; internal SyntaxListPool() { } internal SyntaxListBuilder Allocate() { SyntaxListBuilder result; if (_freeIndex > 0) { _freeIndex--; result = _freeList[_freeIndex].Value; _freeList[_freeIndex].Value = null; } else { result = new SyntaxListBuilder(10); } return result; } internal SyntaxListBuilder Allocate() where TNode : GreenNode { return new SyntaxListBuilder(Allocate()); } internal SeparatedSyntaxListBuilder AllocateSeparated() where TNode : GreenNode { return new SeparatedSyntaxListBuilder(Allocate()); } internal void Free(in SeparatedSyntaxListBuilder item) where TNode : GreenNode { Free(item.UnderlyingBuilder); } internal void Free(SyntaxListBuilder? item) { if (item != null) { item.Clear(); if (_freeIndex >= _freeList.Length) { Grow(); } _freeList[_freeIndex].Value = item; _freeIndex++; } } private void Grow() { ArrayElement[] array = new ArrayElement[_freeList.Length * 2]; Array.Copy(_freeList, array, _freeList.Length); _freeList = array; } public SyntaxList ToListAndFree(SyntaxListBuilder item) where TNode : GreenNode { if (item.IsNull) { return default(SyntaxList); } SyntaxList result = item.ToList(); Free(item); return result; } public SeparatedSyntaxList ToListAndFree(in SeparatedSyntaxListBuilder item) where TNode : GreenNode { SeparatedSyntaxList result = item.ToList(); Free(in item); return result; } }