private bool EnsureCapacityNoLock()

in rd-net/Lifetimes/Lifetimes/LifetimedList.cs [158:209]


    private bool EnsureCapacityNoLock(bool priority, out ValueLifetimed<T>[] items, out int marker, out int size)
    {
      myItems ??= new ValueLifetimed<T>[1];

      marker = MarkerMutexSlice[myState];
      
      if (mySize < myItems.Length && !priority)
      {
        items = myItems;
        size = mySize;
        return false;
      }
     
      var newSize = 0;
      for (var i = 0; i < mySize; i++)
      {
        if (myItems[i].Lifetime.IsAlive) 
          newSize++;
      }

      if (newSize == 0) newSize = 1;
      else newSize *= 2;

      // we have to make new array ALWAYS at this point, because this method could be called during enumeration and we want enumeration to work in a snapshot fashion      
      var countAfterCleaning = 0;
      var markerDecrement = 0;
      var newItems = new ValueLifetimed<T>[newSize];
      
      for (var i = 0; i < marker; i++)
      {
        ref var item = ref myItems[i];
        if (item.Lifetime.IsAlive)
          newItems[countAfterCleaning++] = item;
        else
          markerDecrement++;
      }

      var offset = priority ? 1 : 0; // reserve place for new priority item
      for (var i = marker; i < mySize; i++)
      {
        ref var item = ref myItems[i];
        if (item.Lifetime.IsAlive)
          newItems[countAfterCleaning++ + offset] = item;
        else if (i < marker)
          markerDecrement++;
      }

      marker -= markerDecrement;
      size = countAfterCleaning;
      items = newItems;
      return true;
    }