public void Shift()

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);
						}
					}
				}
			}
		}