in csharp/src/Containers/DataQueue.cs [414:515]
public void Put(Decimal64 data, DateTime time)
{
if (time == DefaultDateTime)
{
Put(data);
return;
}
if (queueType == QueueType.ManualControl)
throw new InvalidOperationException("DataQueue: Use Manual methods putLast, putFirst.");
if (!needDateTime)
throw new InvalidOperationException("DataQueue: Do not use both with and without DateTime method for one queue instance.");
if (queueType == QueueType.SingleElement)
{
if (calcStatistics)
stat.Init();
if (count > 0)
{
count = 0;
OnPop?.Invoke(singleElement, singleElementDate);
}
count = 1;
previousElementDate = singleElementDate;
previousElement = singleElement;
singleElement = data;
singleElementDate = time;
if (calcStatistics)
stat.Set(data);
OnPush?.Invoke(singleElement, singleElementDate);
}
else
{
int prevIndex = last == 0 ? queueDates.Length - 1 : last - 1;
if (count > 0 && time < queueDates[prevIndex])
throw new ArgumentOutOfRangeException("DataQueue: New element has time less then last element.");
if (queueType == QueueType.AutoDynamic)
{
// Lets delete outdated data
// if our queue not empty and if first element have to older date then drop it
while (count > 0 && queueDates[first] + period < time)
{
count--;
int tempIndex = first++;
if (first == queueDates.Length)
first = 0;
Decimal64 data2 = queueBuffer[tempIndex];
if (calcStatistics)
stat.Pop(data2);
OnPop?.Invoke(data2, queueDates[tempIndex]);
}
if (count > 0 && first == last)
Expand();
count++;
queueBuffer[last] = data;
queueDates[last++] = time;
if (last == queueBuffer.Length)
last = 0;
if (calcStatistics)
stat.Push(data);
}
else
{
if (count == queueBuffer.Length) // Need to drop something ?
{
count--;
int tempIndex = first++;
if (first == queueBuffer.Length)
first = 0;
Decimal64 data_ = queueBuffer[tempIndex];
if (calcStatistics)
stat.Pop(data_);
OnPop?.Invoke(data_, queueDates[tempIndex]);
}
count++;
queueBuffer[last] = data;
queueDates[last++] = time;
if (last == queueBuffer.Length)
last = 0;
if (calcStatistics)
stat.Push(data);
}
}
OnPush?.Invoke(data, time);
}