FixAntenna/NetCore/Message/Rg/EntriesArray.cs (147 lines of code) (raw):
// Copyright (c) 2021 EPAM Systems
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
namespace Epam.FixAntenna.NetCore.Message.Rg
{
using static RepeatingGroupStorage;
internal class EntriesArray
{
private int[][] _entries;
public EntriesArray(int[][] entries)
{
_entries = entries;
}
public virtual void SetEntries(int[][] entries)
{
_entries = entries;
}
public virtual int GetArrayEnd(int entryIndex)
{
return _entries[entryIndex][EntriesLastTagPointerIndex];
}
public virtual void AddEntry(int[] entry, int tag, int link, int type)
{
var entryArrayEnd = entry[EntriesLastTagPointerIndex];
entry[entryArrayEnd + EntriesTag] = tag;
entry[entryArrayEnd + EntriesLink] = link;
entry[entryArrayEnd + EntriesType] = type;
entry[EntriesLastTagPointerIndex] += EntriesEntrySize;
}
public virtual void AddEntryAtIndex(int[] entry, int index, int tag, int link, int type)
{
var startPos = index;
var destPos = index + EntriesEntrySize;
var size = GetArrayEnd(entry) - index;
Array.Copy(entry, startPos, entry, destPos, size);
entry[index + EntriesTag] = tag;
entry[index + EntriesLink] = link;
entry[index + EntriesType] = type;
entry[EntriesLastTagPointerIndex] += EntriesEntrySize;
}
public virtual bool IsEmpty(int[] entry)
{
return entry[EntriesLastTagPointerIndex] == EntriesHeaderSize;
}
public virtual bool IsEmpty(int entryIndex)
{
return _entries[entryIndex][EntriesLastTagPointerIndex] == EntriesHeaderSize;
}
public virtual int GetArrayEnd(int[] entry)
{
return entry[EntriesLastTagPointerIndex];
}
public virtual bool HasParent(int[] entry)
{
return entry[EntriesParentEntryLink] != -1;
}
public virtual int GetLastTagIndexInFixMessage(int entryIndex)
{
return GetLastTagIndexInFixMessage(GetEntry(entryIndex));
}
public virtual int GetLastTagIndexInFixMessage(int[] entry)
{
return entry[EntriesLastTagLinkIndex];
}
public virtual void IncrementLastTagIndexInFixMessage(int[] entry)
{
entry[EntriesLastTagLinkIndex]++;
}
public virtual void SetLastTagIndexInFixMessage(int[] entry, int value)
{
entry[EntriesLastTagLinkIndex] = value;
}
public virtual int GetParentEntryLink(int[] entry)
{
return entry[EntriesParentEntryLink];
}
public virtual void SetParentEntryLink(int[] entry, int value)
{
entry[EntriesParentEntryLink] = value;
}
public virtual int GetEntryTag(int[] entry, int index)
{
return entry[index + EntriesTag];
}
public virtual void SetEntryTag(int[] entry, int index, int value)
{
entry[index + EntriesTag] = value;
}
public virtual int GetEntryLink(int[] entry, int index)
{
return entry[index + EntriesLink];
}
public virtual void SetEntryLink(int[] entry, int index, int value)
{
entry[index + EntriesLink] = value;
}
public virtual int GetEntryType(int[] entry, int index)
{
return entry[index + EntriesType];
}
public virtual void SetEntryType(int[] entry, int index, int value)
{
entry[index + EntriesType] = value;
}
public virtual void SetZeroSize(int[] entry)
{
entry[EntriesLastTagPointerIndex] = EntriesHeaderSize;
}
public virtual int[] GetParentEntry(int[] entry)
{
if (entry[EntriesParentEntryLink] == -1)
{
return null;
}
return _entries[entry[EntriesParentEntryLink]];
}
public virtual int GetTagAtIndex(int[] entry, int index)
{
return entry[EntriesHeaderSize + index * EntriesEntrySize + EntriesTag];
}
public virtual int GetTagLinkAtIndex(int[] entry, int index)
{
return entry[EntriesHeaderSize + index * EntriesEntrySize + EntriesLink];
}
public virtual int GetTagTypeAtIndex(int[] entry, int index)
{
return entry[EntriesHeaderSize + index * EntriesEntrySize + EntriesType];
}
public virtual void ShiftLastTagIndexInFixMessage(int[] entry, int offset)
{
entry[EntriesLastTagLinkIndex] += offset;
}
public virtual void ShiftEntryLink(int[] entry, int index, int offset)
{
entry[index + EntriesLink] += offset;
}
public virtual void RemoveTagAtIndex(int[] entry, int index)
{
var size = GetArrayEnd(entry) - index;
Array.Copy(entry, index + EntriesEntrySize, entry, index, size);
entry[EntriesLastTagPointerIndex] -= EntriesEntrySize;
}
public virtual int[] GetEntry(int entryIndex)
{
return _entries[entryIndex];
}
}
}