Skip to content

Commit cb8f10e

Browse files
committed
Added boxing write & reads for generics
1 parent 500626d commit cb8f10e

File tree

5 files changed

+86
-36
lines changed

5 files changed

+86
-36
lines changed

MLAPI/Data/NetworkedCollections/NetworkedDictionary.cs

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -84,20 +84,23 @@ public void ReadDelta(BitReader reader)
8484
switch (eventType)
8585
{
8686
case NetworkedDictionaryEvent<TKey, TValue>.NetworkedListEventType.Add:
87-
{
88-
//TODO: readKey
89-
//TODO: readVal
90-
}
87+
{
88+
TKey key = reader.ReadValueTypeOrString<TKey>();
89+
TValue value = reader.ReadValueTypeOrString<TValue>();
90+
dictionary.Add(key, value);
91+
}
9192
break;
9293
case NetworkedDictionaryEvent<TKey, TValue>.NetworkedListEventType.Remove:
9394
{
94-
//TODO: readKey
95+
TKey key = reader.ReadValueTypeOrString<TKey>();
96+
dictionary.Remove(key);
9597
}
9698
break;
9799
case NetworkedDictionaryEvent<TKey, TValue>.NetworkedListEventType.RemovePair:
98100
{
99-
//TODO: readKey
100-
//TODO: readVal
101+
TKey key = reader.ReadValueTypeOrString<TKey>();
102+
TValue value = reader.ReadValueTypeOrString<TValue>();
103+
dictionary.Remove(new KeyValuePair<TKey, TValue>(key, value));
101104
}
102105
break;
103106
case NetworkedDictionaryEvent<TKey, TValue>.NetworkedListEventType.Clear:
@@ -108,8 +111,10 @@ public void ReadDelta(BitReader reader)
108111
break;
109112
case NetworkedDictionaryEvent<TKey, TValue>.NetworkedListEventType.Value:
110113
{
111-
//TODO: readKey
112-
//TODO: readVal
114+
TKey key = reader.ReadValueTypeOrString<TKey>();
115+
TValue value = reader.ReadValueTypeOrString<TValue>();
116+
if (dictionary.ContainsKey(key))
117+
dictionary[key] = value;
113118
}
114119
break;
115120
default:
@@ -121,12 +126,13 @@ public void ReadDelta(BitReader reader)
121126
/// <inheritdoc />
122127
public void ReadField(BitReader reader)
123128
{
129+
dictionary.Clear();
124130
ushort entryCount = reader.ReadUShort();
125-
126131
for (int i = 0; i < entryCount; i++)
127132
{
128-
//TODO: readKey
129-
//TODO: readVal
133+
TKey key = reader.ReadValueTypeOrString<TKey>();
134+
TValue value = reader.ReadValueTypeOrString<TValue>();
135+
dictionary.Add(key, value);
130136
}
131137
}
132138

@@ -153,19 +159,19 @@ public void WriteDelta(BitWriter writer)
153159
{
154160
case NetworkedDictionaryEvent<TKey, TValue>.NetworkedListEventType.Add:
155161
{
156-
//TODO: writeKey
157-
//TODO: writeVal
162+
writer.WriteValueTypeOrString(dirtyEvents[i].key);
163+
writer.WriteValueTypeOrString(dirtyEvents[i].value);
158164
}
159165
break;
160166
case NetworkedDictionaryEvent<TKey, TValue>.NetworkedListEventType.Remove:
161167
{
162-
//TODO: writeKey
168+
writer.WriteValueTypeOrString(dirtyEvents[i].key);
163169
}
164170
break;
165171
case NetworkedDictionaryEvent<TKey, TValue>.NetworkedListEventType.RemovePair:
166172
{
167-
//TODO: writeKey
168-
//TODO: writeVal
173+
writer.WriteValueTypeOrString(dirtyEvents[i].key);
174+
writer.WriteValueTypeOrString(dirtyEvents[i].value);
169175
}
170176
break;
171177
case NetworkedDictionaryEvent<TKey, TValue>.NetworkedListEventType.Clear:
@@ -175,8 +181,8 @@ public void WriteDelta(BitWriter writer)
175181
break;
176182
case NetworkedDictionaryEvent<TKey, TValue>.NetworkedListEventType.Value:
177183
{
178-
//TODO: writeKey
179-
//TODO: writeVal
184+
writer.WriteValueTypeOrString(dirtyEvents[i].key);
185+
writer.WriteValueTypeOrString(dirtyEvents[i].value);
180186
}
181187
break;
182188
default:
@@ -189,10 +195,10 @@ public void WriteDelta(BitWriter writer)
189195
public void WriteField(BitWriter writer)
190196
{
191197
writer.WriteUShort((ushort)dictionary.Count);
192-
for (int i = 0; i < dictionary.Count; i++)
198+
foreach (KeyValuePair<TKey, TValue> pair in dictionary)
193199
{
194-
//TODO: writeKey
195-
//TODO: writeVal
200+
writer.WriteValueTypeOrString(pair.Key);
201+
writer.WriteValueTypeOrString(pair.Value);
196202
}
197203
}
198204

MLAPI/Data/NetworkedCollections/NetworkedList.cs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -137,18 +137,18 @@ public void WriteDelta(BitWriter writer)
137137
//Fuck me these signatures are proper aids
138138
case NetworkedList<T>.NetworkedListEvent<T>.NetworkedListEventType.Add:
139139
{
140-
//TODO: Write dirtyEvents[i].value
140+
writer.WriteValueTypeOrString(dirtyEvents[i].value);
141141
}
142142
break;
143143
case NetworkedList<T>.NetworkedListEvent<T>.NetworkedListEventType.Insert:
144144
{
145145
writer.WriteInt(dirtyEvents[i].index);
146-
//TODO: Write dirtyEvents[i].value
146+
writer.WriteValueTypeOrString(dirtyEvents[i].value);
147147
}
148148
break;
149149
case NetworkedList<T>.NetworkedListEvent<T>.NetworkedListEventType.Remove:
150150
{
151-
//TODO: Write dirtyEvents[i].value
151+
writer.WriteValueTypeOrString(dirtyEvents[i].value);
152152
}
153153
break;
154154
case NetworkedList<T>.NetworkedListEvent<T>.NetworkedListEventType.RemoveAt:
@@ -159,7 +159,7 @@ public void WriteDelta(BitWriter writer)
159159
case NetworkedList<T>.NetworkedListEvent<T>.NetworkedListEventType.Value:
160160
{
161161
writer.WriteInt(dirtyEvents[i].index);
162-
//TODO: Write dirtyEvents[i].value
162+
writer.WriteValueTypeOrString(dirtyEvents[i].value);
163163
}
164164

165165
break;
@@ -178,17 +178,18 @@ public void WriteField(BitWriter writer)
178178
writer.WriteUShort((ushort)list.Count);
179179
for (int i = 0; i < list.Count; i++)
180180
{
181-
//TODO: Write the fieldValue
181+
writer.WriteValueTypeOrString(list[i]);
182182
}
183183
}
184184

185185
/// <inheritdoc />
186186
public void ReadField(BitReader reader)
187187
{
188+
list.Clear();
188189
ushort count = reader.ReadUShort();
189190
for (int i = 0; i < count; i++)
190191
{
191-
//TODO: Read element
192+
list.Add(reader.ReadValueTypeOrString<T>());
192193
}
193194
}
194195

@@ -203,18 +204,18 @@ public void ReadDelta(BitReader reader)
203204
{
204205
case NetworkedListEvent<T>.NetworkedListEventType.Add:
205206
{
206-
//TODO: list.Add(readValue);
207+
list.Add(reader.ReadValueTypeOrString<T>());
207208
}
208209
break;
209210
case NetworkedList<T>.NetworkedListEvent<T>.NetworkedListEventType.Insert:
210211
{
211212
int index = reader.ReadInt();
212-
//TODO: list.Insert(index, readValue);
213+
list.Insert(index, reader.ReadValueTypeOrString<T>());
213214
}
214215
break;
215216
case NetworkedList<T>.NetworkedListEvent<T>.NetworkedListEventType.Remove:
216217
{
217-
//TODO: list.Remove(readValue);
218+
list.Remove(reader.ReadValueTypeOrString<T>());
218219
}
219220
break;
220221
case NetworkedList<T>.NetworkedListEvent<T>.NetworkedListEventType.RemoveAt:
@@ -226,7 +227,7 @@ public void ReadDelta(BitReader reader)
226227
case NetworkedList<T>.NetworkedListEvent<T>.NetworkedListEventType.Value:
227228
{
228229
int index = reader.ReadInt();
229-
//TODO: list[index] = readValue
230+
if (index < list.Count) list[index] = reader.ReadValueTypeOrString<T>();
230231
}
231232
break;
232233
case NetworkedList<T>.NetworkedListEvent<T>.NetworkedListEventType.Clear:

MLAPI/Data/NetworkedVar.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,17 +152,16 @@ public void SetNetworkedBehaviour(NetworkedBehaviour behaviour)
152152
/// <inheritdoc />
153153
public void ReadField(BitReader reader)
154154
{
155-
// TODO TwoTen - Boxing sucks
156155
T previousValue = InternalValue;
157-
InternalValue = (T)FieldTypeHelper.ReadFieldType(reader, typeof(T), (object)InternalValue);
156+
InternalValue = reader.ReadValueTypeOrString<T>();
158157
if (OnValueChanged != null)
159158
OnValueChanged(previousValue, InternalValue);
160159
}
161160

162161
/// <inheritdoc />
163162
public void WriteField(BitWriter writer)
164163
{
165-
//TODO: Write field
164+
writer.WriteValueTypeOrString(InternalValue);
166165
}
167166

168167
/// <inheritdoc />

MLAPI/NetworkingManagerComponents/Binary/BitReader.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,49 @@ public static BitReader Get(byte[] readFrom)
6464
}
6565
}
6666

67+
public ValueType ReadValueType<T>()
68+
{
69+
if (typeof(T) == typeof(float))
70+
return ReadFloat();
71+
else if (typeof(T) == typeof(double))
72+
return ReadDouble();
73+
else if (typeof(T) == typeof(byte))
74+
return ReadByte();
75+
else if (typeof(T) == typeof(sbyte))
76+
return ReadSByte();
77+
else if (typeof(T) == typeof(short))
78+
return ReadShort();
79+
else if (typeof(T) == typeof(ushort))
80+
return ReadUShort();
81+
else if (typeof(T) == typeof(int))
82+
return ReadInt();
83+
else if (typeof(T) == typeof(uint))
84+
return ReadUInt();
85+
else if (typeof(T) == typeof(long))
86+
return ReadLong();
87+
else if (typeof(T) == typeof(ulong))
88+
return ReadULong();
89+
90+
return default(ValueType);
91+
}
92+
93+
public T ReadValueTypeOrString<T>()
94+
{
95+
if (typeof(T) == typeof(string))
96+
{
97+
return (T)(object)ReadString(); //BOX
98+
}
99+
else if (typeof(T).IsValueType)
100+
{
101+
ValueType type = ReadValueType<T>();
102+
return (T)(object)type; //BOX
103+
}
104+
else
105+
{
106+
return default(T);
107+
}
108+
}
109+
67110
public bool ReadBool()
68111
{
69112
bool result = (readFrom[bitCount / 8] & (byte)(1 << (int)(bitCount % 8))) != 0;

MLAPI/NetworkingManagerComponents/Binary/BitWriter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ private void Push<T>(T b)
102102
if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("The type \"" + b.GetType() + "\" is not supported by the Binary Serializer. It will be ignored");
103103
}
104104

105-
105+
public void WriteValueTypeOrString<T>(T t) => Push(t);
106+
public void WriteValueType(ValueType v) => Push(v);
106107
public void WriteBool(bool b) => Push(b);
107108
public void WriteFloat(float f) => Push(f);
108109
public void WriteDouble(double d) => Push(d);

0 commit comments

Comments
 (0)