Use to Grow an Array in a Generic List
using System;
using System.Collections.Generic;
using Microsoft.VisualBasic.Devices;
public class SizeHelper<T>
{
private static readonly FixedIntXPrimality bp = new FixedIntXPrimality(64);
private readonly int AllocatedSizeLimit;
public int[] Curve;
private int Resizes;
public SizeHelper()
{
var measure = new MeasureSize<T>();
var sizeOfOne = measure.GetByteSize();
var am = new ComputerInfo().AvailablePhysicalMemory;
AllocatedSizeLimit = (int) ((long) am / sizeOfOne);
}
public int GetNewSize(int currentSize)
{
Resizes++;
var minS = currentSize * 2;
if (Curve == null)
BuildCurve(minS);
foreach (var v in Curve)
if (v > minS)
return v;
var nv = GetNextValue(minS);
return nv != -1 ? nv : int.MaxValue;
}
private int GetNextValue(int currentValue)
{
for (var value = currentValue | 1; value < AllocatedSizeLimit; value += 16384 )
{
if (value < 0)
break;
if (bp.IsPrime(value))
return value + 1;
}
return -1;
}
private void BuildCurve(int Size)
{
int Sizer(int oldSize)
{
try
{
oldSize = (int) (uint) oldSize;
var log = Math.Log(oldSize);
var inv = 1.0 / log * 4;
var newSize = oldSize * (1.0 + inv);
return (int) (uint) newSize;
}
catch
{
return AllocatedSizeLimit;
}
}
var curlst = new List<int>();
var value = Size | 1;
do
{
value = Sizer(value);
if (value < 0)
break;
if (value < AllocatedSizeLimit)
curlst.Add(value);
} while (value < AllocatedSizeLimit);
Curve = curlst.ToArray();
var dl = new List<int>();
var last = 0;
for (var i = 0; i < Curve.Length; ++i)
{
if (i > 0)
last = Curve[i - 1];
var v = Curve[i];
dl.Add(v - last);
}
var str = "";
foreach (var v in dl)
str += $"{v},";
}
}
using System;
using System.Collections.Generic;
using Microsoft.VisualBasic.Devices;
public class SizeHelper<T>
{
private static readonly FixedIntXPrimality bp = new FixedIntXPrimality(64);
private readonly int AllocatedSizeLimit;
public int[] Curve;
private int Resizes;
public SizeHelper()
{
var measure = new MeasureSize<T>();
var sizeOfOne = measure.GetByteSize();
var am = new ComputerInfo().AvailablePhysicalMemory;
AllocatedSizeLimit = (int) ((long) am / sizeOfOne);
}
public int GetNewSize(int currentSize)
{
Resizes++;
var minS = currentSize * 2;
if (Curve == null)
BuildCurve(minS);
foreach (var v in Curve)
if (v > minS)
return v;
var nv = GetNextValue(minS);
return nv != -1 ? nv : int.MaxValue;
}
private int GetNextValue(int currentValue)
{
for (var value = currentValue | 1; value < AllocatedSizeLimit; value += 16384 )
{
if (value < 0)
break;
if (bp.IsPrime(value))
return value + 1;
}
return -1;
}
private void BuildCurve(int Size)
{
int Sizer(int oldSize)
{
try
{
oldSize = (int) (uint) oldSize;
var log = Math.Log(oldSize);
var inv = 1.0 / log * 4;
var newSize = oldSize * (1.0 + inv);
return (int) (uint) newSize;
}
catch
{
return AllocatedSizeLimit;
}
}
var curlst = new List<int>();
var value = Size | 1;
do
{
value = Sizer(value);
if (value < 0)
break;
if (value < AllocatedSizeLimit)
curlst.Add(value);
} while (value < AllocatedSizeLimit);
Curve = curlst.ToArray();
var dl = new List<int>();
var last = 0;
for (var i = 0; i < Curve.Length; ++i)
{
if (i > 0)
last = Curve[i - 1];
var v = Curve[i];
dl.Add(v - last);
}
var str = "";
foreach (var v in dl)
str += $"{v},";
}
}
using System; using System.Collections.Generic; using Microsoft.VisualBasic.Devices; public class SizeHelper<T> { private static readonly FixedIntXPrimality bp = new FixedIntXPrimality(64); private readonly int AllocatedSizeLimit; public int[] Curve; private int Resizes; public SizeHelper() { var measure = new MeasureSize<T>(); var sizeOfOne = measure.GetByteSize(); var am = new ComputerInfo().AvailablePhysicalMemory; AllocatedSizeLimit = (int) ((long) am / sizeOfOne); } public int GetNewSize(int currentSize) { Resizes++; var minS = currentSize * 2; if (Curve == null) BuildCurve(minS); foreach (var v in Curve) if (v > minS) return v; var nv = GetNextValue(minS); return nv != -1 ? nv : int.MaxValue; } private int GetNextValue(int currentValue) { for (var value = currentValue | 1; value < AllocatedSizeLimit; value += 16384 ) { if (value < 0) break; if (bp.IsPrime(value)) return value + 1; } return -1; } private void BuildCurve(int Size) { int Sizer(int oldSize) { try { oldSize = (int) (uint) oldSize; var log = Math.Log(oldSize); var inv = 1.0 / log * 4; var newSize = oldSize * (1.0 + inv); return (int) (uint) newSize; } catch { return AllocatedSizeLimit; } } var curlst = new List<int>(); var value = Size | 1; do { value = Sizer(value); if (value < 0) break; if (value < AllocatedSizeLimit) curlst.Add(value); } while (value < AllocatedSizeLimit); Curve = curlst.ToArray(); var dl = new List<int>(); var last = 0; for (var i = 0; i < Curve.Length; ++i) { if (i > 0) last = Curve[i - 1]; var v = Curve[i]; dl.Add(v - last); } var str = ""; foreach (var v in dl) str += $"{v},"; } }