Skip to content

Commit 2b27cd6

Browse files
committed
Optimize merging updatefield data into protobuf structures (remove hidden Activator.CreateInstance)
1 parent dc01692 commit 2b27cd6

1 file changed

Lines changed: 24 additions & 31 deletions

File tree

WowPacketParser/Misc/Extensions.cs

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1+
using Google.Protobuf.Collections;
12
using System;
23
using System.Collections.Generic;
34
using System.Diagnostics.Contracts;
45
using System.Globalization;
56
using System.Linq;
67
using System.Threading;
7-
using Google.Protobuf.Collections;
88
using WowPacketParser.Enums;
99
using WowPacketParser.Proto;
1010
using WowPacketParser.Store.Objects.UpdateFields;
@@ -220,12 +220,6 @@ public static int BinarySearch<TKey, TValue>(this SortedList<TKey, TValue> sorte
220220
return ~lo;
221221
}
222222

223-
public static void Reserve<T>(this RepeatedField<T> field, int count) where T : new()
224-
{
225-
while (field.Count < count)
226-
field.Add(new T());
227-
}
228-
229223
public static void UpdateData(this UpdateValuesObjectDataFields fields, IObjectData data)
230224
{
231225
fields.EntryID = data.EntryID;
@@ -315,30 +309,29 @@ public static void UpdateData(this UpdateValuesObjectDataFields fields, IUnitDat
315309
unit.SummonedBy = data.SummonedBy;
316310
if (data.CreatedBy != null)
317311
unit.CreatedBy = data.CreatedBy;
318-
unit.NpcFlags.Reserve(data.NpcFlags.Length);
319-
for (int i = 0; i < data.NpcFlags.Length; ++i)
320-
unit.NpcFlags[i] = data.NpcFlags[i].ToProto();
321-
322-
unit.Power.Reserve(data.Power.Length);
323-
for (int i = 0; i < data.Power.Length; ++i)
324-
unit.Power[i] = data.Power[i].ToProto();
325-
326-
unit.MaxPower.Reserve(data.MaxPower.Length);
327-
for (int i = 0; i < data.MaxPower.Length; ++i)
328-
unit.MaxPower[i] = data.MaxPower[i].ToProto();
329-
330-
unit.AttackRoundBaseTime.Reserve(data.AttackRoundBaseTime.Length);
331-
for (int i = 0; i < data.AttackRoundBaseTime.Length; ++i)
332-
unit.AttackRoundBaseTime[i] = data.AttackRoundBaseTime[i].ToProto();
333-
334-
unit.Resistances.Reserve(data.Resistances.Length);
335-
for (int i = 0; i < data.Resistances.Length; ++i)
336-
unit.Resistances[i] = data.Resistances[i].ToProto();
337-
338-
unit.VirtualItems.Reserve(data.VirtualItems.Length);
339-
for (int i = 0; i < data.VirtualItems.Length; ++i)
340-
if (data.VirtualItems[i] != null)
341-
unit.VirtualItems[i] = data.VirtualItems[i].ToProto();
312+
313+
unit.NpcFlags.FillFrom(data.NpcFlags, ToProto);
314+
unit.Power.FillFrom(data.Power, ToProto);
315+
unit.MaxPower.FillFrom(data.MaxPower, ToProto);
316+
unit.AttackRoundBaseTime.FillFrom(data.AttackRoundBaseTime, ToProto);
317+
unit.Resistances.FillFrom(data.Resistances, ToProto);
318+
unit.VirtualItems.FillFrom(data.VirtualItems, item => item != null ? item.ToProto() : new VisibleItemFields());
319+
}
320+
321+
private static void FillFrom<TDest, TSource>(this RepeatedField<TDest> field, TSource[] source, Func<TSource, TDest> mappingFunc)
322+
{
323+
for (var i = 0; i < Math.Min(source.Length, field.Count); ++i)
324+
field[i] = mappingFunc(source[i]);
325+
326+
if (source.Length > field.Count)
327+
{
328+
field.Capacity = source.Length;
329+
for (var i = field.Count; i < source.Length; ++i)
330+
field.Add(mappingFunc(source[i]));
331+
}
332+
else
333+
while (source.Length < field.Count)
334+
field.RemoveAt(source.Length);
342335
}
343336

344337
public static UInt32ValueWrapper ToProto(this uint? value)

0 commit comments

Comments
 (0)