using System;
using Jint.Native;
namespace Jint.Pooling
{
///
/// Cache reusable array instances as we allocate them a lot.
///
internal sealed class JsValueArrayPool
{
private const int PoolSize = 15;
private readonly ObjectPool _poolArray1;
private readonly ObjectPool _poolArray2;
private readonly ObjectPool _poolArray3;
public JsValueArrayPool()
{
_poolArray1 = new ObjectPool(Factory1, PoolSize);
_poolArray2 = new ObjectPool(Factory2, PoolSize);
_poolArray3 = new ObjectPool(Factory3, PoolSize);
}
private static JsValue[] Factory1()
{
return new JsValue[1];
}
private static JsValue[] Factory2()
{
return new JsValue[2];
}
private static JsValue[] Factory3()
{
return new JsValue[3];
}
public JsValue[] RentArray(int size)
{
switch (size)
{
case 0:
return Array.Empty();
case 1:
return _poolArray1.Allocate();
case 2:
return _poolArray2.Allocate();
case 3:
return _poolArray3.Allocate();
}
return new JsValue[size];
}
public void ReturnArray(JsValue[] array)
{
switch (array.Length)
{
case 1:
_poolArray1.Free(array);
break;
case 2:
_poolArray2.Free(array);
break;
case 3:
_poolArray3.Free(array);
break;
}
}
}
}