Пример #1
0
        public void InsertRun(DataRun existingRun, DataRun newRun)
        {
            int idx = DataRuns.IndexOf(existingRun);

            if (idx < 0)
            {
                throw new ArgumentException("Attempt to replace non-existant run", nameof(existingRun));
            }

            DataRuns.Insert(idx + 1, newRun);
        }
Пример #2
0
        public void ReplaceRun(DataRun oldRun, DataRun newRun)
        {
            int idx = DataRuns.IndexOf(oldRun);

            if (idx < 0)
            {
                throw new ArgumentException("Attempt to replace non-existant run", nameof(oldRun));
            }

            DataRuns[idx] = newRun;
        }
Пример #3
0
        public int RemoveRun(DataRun run)
        {
            int idx = DataRuns.IndexOf(run);

            if (idx < 0)
            {
                throw new ArgumentException("Attempt to remove non-existant run", nameof(run));
            }

            DataRuns.RemoveAt(idx);
            return(idx);
        }
Пример #4
0
        public AttributeRecord Split(int suggestedSplitIdx)
        {
            int splitIdx;

            if (suggestedSplitIdx <= 0 || suggestedSplitIdx >= DataRuns.Count)
            {
                splitIdx = DataRuns.Count / 2;
            }
            else
            {
                splitIdx = suggestedSplitIdx;
            }

            long splitVcn = (long)_startingVCN;
            long splitLcn = 0;

            for (int i = 0; i < splitIdx; ++i)
            {
                splitVcn += DataRuns[i].RunLength;
                splitLcn += DataRuns[i].RunOffset;
            }

            List <DataRun> newRecordRuns = new List <DataRun>();

            while (DataRuns.Count > splitIdx)
            {
                DataRun run = DataRuns[splitIdx];

                DataRuns.RemoveAt(splitIdx);
                newRecordRuns.Add(run);
            }

            // Each extent has implicit start LCN=0, so have to make stored runs match reality.
            // However, take care not to stomp on 'sparse' runs that may be at the start of the
            // new extent (indicated by Zero run offset).
            for (int i = 0; i < newRecordRuns.Count; ++i)
            {
                if (!newRecordRuns[i].IsSparse)
                {
                    newRecordRuns[i].RunOffset += splitLcn;
                    break;
                }
            }

            _lastVCN = (ulong)splitVcn - 1;

            return(new NonResidentAttributeRecord(_type, _name, 0, _flags, splitVcn, newRecordRuns));
        }
Пример #5
0
 public void InsertRun(int index, DataRun newRun)
 {
     DataRuns.Insert(index, newRun);
 }