/// <summary> /// Diffs the two passed in callstack infos and returns the difference. /// </summary> /// <param name="New"> Newer callstack info to subtract older from </param> /// <param name="Old"> Older callstack info to subtract from older </param> public static FCallStackAllocationInfo Diff(FCallStackAllocationInfo New, FCallStackAllocationInfo Old) { if (New.CallStackIndex != Old.CallStackIndex) { throw new InvalidDataException(); } FCallStackAllocationInfo DiffData = New.DeepCopy(); DiffData.UntaggedAllocationInfo -= Old.UntaggedAllocationInfo; if (Old.TaggedAllocationInfo != null) { DiffData.EnsureTaggedAllocationsAvailable(); foreach (var TaggedAllocationInfoPair in Old.TaggedAllocationInfo) { FCallStackTagsAllocationInfo CurrentTagsAllocationInfo; if (!DiffData.TaggedAllocationInfo.TryGetValue(TaggedAllocationInfoPair.Key, out CurrentTagsAllocationInfo)) { CurrentTagsAllocationInfo = new FCallStackTagsAllocationInfo(0, 0); } DiffData.TaggedAllocationInfo[TaggedAllocationInfoPair.Key] = CurrentTagsAllocationInfo - TaggedAllocationInfoPair.Value; } } return(DiffData); }
/// <summary> Constructor, initializing all member variables to passed in values. </summary> public FCallStackAllocationInfo(long InSize, int InCallStackIndex, int InCount, int InTagsIndex) { CallStackIndex = InCallStackIndex; UntaggedAllocationInfo = new FCallStackTagsAllocationInfo(0, 0); TaggedAllocationInfo = null; if (InTagsIndex == -1) { UntaggedAllocationInfo += new FCallStackTagsAllocationInfo(InSize, InCount); } else { EnsureTaggedAllocationsAvailable(); TaggedAllocationInfo.Add(InTagsIndex, new FCallStackTagsAllocationInfo(InSize, InCount)); } }
/// <summary> /// Adds the passed in size and count to this callstack info. /// </summary> /// <param name="SizeToAdd"> Size to add </param> /// <param name="CountToAdd"> Count to add </param> /// <param name="InTagsIndex"> Index of the tags associated with the allocation </param> public void Add(long SizeToAdd, int CountToAdd, int InTagsIndex) { if (InTagsIndex == -1) { UntaggedAllocationInfo += new FCallStackTagsAllocationInfo(SizeToAdd, CountToAdd); } else { EnsureTaggedAllocationsAvailable(); FCallStackTagsAllocationInfo CurrentTagsAllocationInfo; if (!TaggedAllocationInfo.TryGetValue(InTagsIndex, out CurrentTagsAllocationInfo)) { CurrentTagsAllocationInfo = new FCallStackTagsAllocationInfo(0, 0); } TaggedAllocationInfo[InTagsIndex] = CurrentTagsAllocationInfo + new FCallStackTagsAllocationInfo(SizeToAdd, CountToAdd); } }
/// <summary> /// Adds the passed callstack info to this callstack info. /// </summary> /// <param name="InOther"> Callstack info to add </param> public void Add(FCallStackAllocationInfo InOther) { if (CallStackIndex != InOther.CallStackIndex) { throw new InvalidDataException(); } UntaggedAllocationInfo += InOther.UntaggedAllocationInfo; if (InOther.TaggedAllocationInfo != null) { EnsureTaggedAllocationsAvailable(); foreach (var TaggedAllocationInfoPair in InOther.TaggedAllocationInfo) { FCallStackTagsAllocationInfo CurrentTagsAllocationInfo; if (!TaggedAllocationInfo.TryGetValue(TaggedAllocationInfoPair.Key, out CurrentTagsAllocationInfo)) { CurrentTagsAllocationInfo = new FCallStackTagsAllocationInfo(0, 0); } TaggedAllocationInfo[TaggedAllocationInfoPair.Key] = CurrentTagsAllocationInfo + TaggedAllocationInfoPair.Value; } } }
/// <summary> Private constructor used by DeepCopy. </summary> private FCallStackAllocationInfo(int InCallStackIndex, FCallStackTagsAllocationInfo InUntaggedAllocationInfo, Dictionary <int, FCallStackTagsAllocationInfo> InTaggedAllocationInfo) { CallStackIndex = InCallStackIndex; UntaggedAllocationInfo = InUntaggedAllocationInfo; TaggedAllocationInfo = InTaggedAllocationInfo; }