internal static bool DetectAndMerge(Collections.Generic.ISortedDictionary <long, long> store, long dataAddress, long dataSize, int segmentSize = DataBlock.DataBlockDriver.MaxSegmentSize, RegionLogic region = null) { if (store.Count == 0) { if (dataSize > segmentSize) { return(false); } store.Add(dataAddress, dataSize); return(true); } if (store.Search(dataAddress)) { long currSize = store.CurrentValue; if (currSize < dataSize) { store.CurrentValue = dataSize; } return(true); } //** Detect and merge contiguous deleted blocks short passCount = 0; if (!store.MovePrevious()) { store.MoveFirst(); } while (true) { KeyValuePair <long, long>?item = store.CurrentEntry; long k2 = item.Value.Key; long i = 0; long cv = store.CurrentValue; i = cv; if (region != null) { if (region.Equals(dataAddress, dataSize, k2, i) || region.FirstWithinSecond(dataAddress, dataSize, k2, i)) { return(true); } if (region.FirstWithinSecond(k2, i, dataAddress, dataSize)) { store.Remove(k2); store.Add(dataAddress, dataSize); return(true); } } if (dataAddress + dataSize == k2) { long newSize = i + dataSize; if (newSize <= segmentSize) { store.Remove(item.Value.Key); store.Add(dataAddress, newSize); return(true); } return(false); } if (k2 + i == dataAddress) { if (i + dataSize <= segmentSize) { store.CurrentValue = i + dataSize; return(true); } return(false); } if (++passCount >= 2) { break; } if (!store.MoveNext()) { break; } } return(false); }