public RangedLinkedList(Range bounds) { _bounds = bounds; int maxMetas = Math.Min(bounds.Size, MainSplit); int offset = bounds.Offset; int size = bounds.Size / maxMetas; _metas = new RLLMeta <T> [maxMetas]; for (int n = 0; n < maxMetas; n++) { _metas[n] = new RLLMeta <T>(new Range(offset, size)); offset += size; } }
private RLLEntry <T> Find(int index) { RLLMeta <T> meta = this.FindMeta(index); RLLEntry <T> e = meta.Target; while (e != null) { if (e.Range.Extents < index) { continue; } if (e.Range.Offset > index) { break; } Debug.Assert(e.Range.Contains(index) == true); return(e); } return(null); }
public void Add(Range range, T value) { RLLEntry <T> e = new RLLEntry <T>(range, value); if (_head != null) { if (_head.Range.Offset > range.Offset) { e.Next = _head; _head.Previous = e; _head = e; } } else { _head = e; } int metaIndex = (range.Offset / _metas.Length); int metaRange = Math.Max(1, e.Range.Size / _metas[0].Range.Size); for (int n = metaIndex; n < metaIndex + metaRange; n++) { RLLMeta <T> meta = _metas[n]; if (meta.Range.Extents < range.Offset) { continue; } if (meta.Range.Offset > range.Extents) { break; } if (meta.Target != null) { if (meta.Target.Range.Offset > range.Offset) { meta.Target = e; } } else { meta.Target = e; } } if (_head != e) { RLLEntry <T> ee = _head; while (ee != null) { if (ee.Range.Offset > range.Offset) { e.Next = ee; e.Previous = ee.Previous; ee.Previous = e; if (e.Previous != null) { e.Previous.Next = e; } break; } if (ee.Next == null) { e.Previous = ee; ee.Next = e; break; } ee = ee.Next; } } }