internal void ApplyMergeChanges(MergePolicy.OneMerge merge, bool dropSegment)
{
var mergedAway = new HashSet<SegmentCommitInfo>(merge.Segments);
bool inserted = false;
int newSegIdx = 0;
for (int segIdx = 0, cnt = segments.Count; segIdx < cnt; segIdx++)
{
Debug.Assert(segIdx >= newSegIdx);
SegmentCommitInfo info = segments[segIdx];
if (mergedAway.Contains(info))
{
if (!inserted && !dropSegment)
{
segments[segIdx] = merge.Info_Renamed;
inserted = true;
newSegIdx++;
}
}
else
{
segments[newSegIdx] = info;
newSegIdx++;
}
}
// the rest of the segments in list are duplicates, so don't remove from map, only list!
segments.SubList(newSegIdx, segments.Count).Clear();
// Either we found place to insert segment, or, we did
// not, but only because all segments we merged becamee
// deleted while we are merging, in which case it should
// be the case that the new segment is also all deleted,
// we insert it at the beginning if it should not be dropped:
if (!inserted && !dropSegment)
{
segments.Insert(0, merge.Info_Renamed);
}
}