in FixAntenna/NetCore/Message/Rg/RepeatingGroupStorage.cs [617:709]
public void Shift(int index, int offset, int parentEntryIndex, int updatedEntry,
bool shouldUpdatedHided)
{
int[] entry;
for (var entryIndex = 0;
entryIndex < _entries.Length && (entry = _entries[entryIndex]) != null;
entryIndex++)
{
if (_entriesArray.GetLastTagIndexInFixMessage(entry) >= index)
{
//Shift the only ones right
if (!IsNeedUpdate(parentEntryIndex, entryIndex))
{
continue;
}
var entryEnd = _entriesArray.GetArrayEnd(entry);
var updated = false;
for (var j = EntriesHeaderSize; j < entryEnd; j += EntriesEntrySize)
{
if (_entriesArray.GetEntryLink(entry, j) >= index &&
_entriesArray.GetEntryType(entry, j) == LinkTypeTag)
{
_entriesArray.ShiftEntryLink(entry, j, offset);
if (_entriesArray.GetLastTagIndexInFixMessage(entry) < _entriesArray.GetEntryLink(entry, j))
{
//Update last link if needed
_entriesArray.SetLastTagIndexInFixMessage(entry, _entriesArray.GetEntryLink(entry, j));
updated = true;
}
}
}
//Not updated but last tag index > index means that there is nested repeating group that affects last tag index, so index should be updated
if (!updated && _entriesArray.GetLastTagIndexInFixMessage(entry) > index)
{
_entriesArray.ShiftLastTagIndexInFixMessage(entry, offset);
}
}
}
//update repeating group tags link
for (var rgIndex = 0; rgIndex < _rgArray.Length; rgIndex++)
{
var rg = _rgArray[rgIndex];
if (rg != null && _rgArrayManager.GetRgId(rg) != -1)
{
if (_rgArrayManager.GetRgLeadingTagIndexInFixMsg(rg) >= index)
{
_rgArrayManager.AddRgLeadingTagIndexInFixMsg(rg, offset);
}
}
}
if (shouldUpdatedHided)
{
if (offset > 0)
{
for (var indexInHidedRg = HidedHeaderSize;
indexInHidedRg < _hiddenLeadingTagsArray.ArrayEnd;
indexInHidedRg += HidedEntrySize)
{
var needUpdate = true;
var entryIndex = _hiddenLeadingTagsArray.GetEntryLink(indexInHidedRg);
//if hidden group is nested
if (entryIndex != -1)
{
//There is no need to update hidden leading tag index if hidden leading tag belongs to updated entry (or to any parent of updated entry)
//It's because we don't support addRepeatingGroupAtIndex in Entry. So group should stay at place, where it was added
needUpdate = IsNeedUpdateHidedTags(entryIndex, updatedEntry);
}
if (_hiddenLeadingTagsArray.GetTagLink(indexInHidedRg) >= index &&
_hiddenLeadingTagsArray.GetEntryLink(indexInHidedRg) != updatedEntry && needUpdate)
{
_hiddenLeadingTagsArray.ShiftHidedTagLink(indexInHidedRg, offset);
}
}
}
else
{
for (var indexInHidedRg = HidedHeaderSize;
indexInHidedRg < _hiddenLeadingTagsArray.ArrayEnd;
indexInHidedRg += HidedEntrySize)
{
if (_hiddenLeadingTagsArray.GetTagLink(indexInHidedRg) > index)
{
_hiddenLeadingTagsArray.ShiftHidedTagLink(indexInHidedRg, offset);
}
}
}
}
}