Pool
Provides a pool of used / recycled resources.
using AngleSharp.Dom.Css;
using AngleSharp.Parser.Css;
using AngleSharp.Services;
using System.Collections.Generic;
using System.Text;
namespace AngleSharp
{
internal static class Pool
{
private static readonly Stack<StringBuilder> _builder = new Stack<StringBuilder>();
private static readonly Stack<CssSelectorConstructor> _selector = new Stack<CssSelectorConstructor>();
private static readonly Stack<CssValueBuilder> _value = new Stack<CssValueBuilder>();
private static readonly object _lock = new object();
public static StringBuilder NewStringBuilder()
{
lock (_lock) {
if (_builder.Count != 0)
return _builder.Pop().Clear();
return new StringBuilder(1024);
}
}
public static CssSelectorConstructor NewSelectorConstructor(IAttributeSelectorFactory attributeSelector, IPseudoClassSelectorFactory pseudoClassSelector, IPseudoElementSelectorFactory pseudoElementSelector)
{
lock (_lock) {
if (_selector.Count != 0)
return _selector.Pop().Reset(attributeSelector, pseudoClassSelector, pseudoElementSelector);
return new CssSelectorConstructor(attributeSelector, pseudoClassSelector, pseudoElementSelector);
}
}
public static CssValueBuilder NewValueBuilder()
{
lock (_lock) {
if (_value.Count != 0)
return _value.Pop().Reset();
return new CssValueBuilder();
}
}
public static string ToPool(this StringBuilder sb)
{
string result = sb.ToString();
lock (_lock) {
_builder.Push(sb);
return result;
}
}
public static ISelector ToPool(this CssSelectorConstructor ctor)
{
ISelector result = ctor.GetResult();
lock (_lock) {
_selector.Push(ctor);
return result;
}
}
public static CssValue ToPool(this CssValueBuilder vb)
{
CssValue result = vb.GetResult();
lock (_lock) {
_value.Push(vb);
return result;
}
}
}
}