public T this[int index] { get { if (index >= _Count) { throw new ArgumentOutOfRangeException(); } if (index - _LastReadIndex != 1) { _LastReadSegment = _Segment[index / _UnitSize]; _LastSegmentReadIndex = index % _UnitSize; } else { _LastSegmentReadIndex++; if (_LastSegmentReadIndex >= _UnitSize) { _LastReadSegment = _Segment[index / _UnitSize]; _LastSegmentReadIndex = 0; } } _LastReadIndex = index; return(_LastReadSegment.Data[_LastSegmentReadIndex]); } }
public BlockedAppendList() { BlockedUnitAlloc <T> .Init(); _Count = 0; _LastSegmentLength = 0; _UnitSize = BlockedUnitAlloc <T> .UnitSize; }
public void Dispose() { foreach (BlockedUnitAlloc <T> .BlockedUnit unit in _Segment) { if (unit == null) { break; } BlockedUnitAlloc <T> .RetUnit(unit); } _Segment.Clear(); _Segment = null; }
public void Add(T value) { if (_LastSegmentLength == 0) { _LastSegment = BlockedUnitAlloc <T> .GetUnit(); _Segment.Add(_LastSegment); } _LastSegment.Data[_LastSegmentLength] = value; _Count++; if (++_LastSegmentLength == _UnitSize) { _LastSegmentLength = 0; } }