/// <inheritdoc/> void IDictionaryPropertyBagVisitor.Visit <TDictionary, TKey, TValue>(IDictionaryPropertyBag <TDictionary, TKey, TValue> properties, ref TDictionary container) { foreach (var property in properties.GetProperties(ref container)) { ((IPropertyAccept <TDictionary>)property).Accept(this, ref container); } }
void IDictionaryPropertyBagVisitor.Visit <TDictionary, TKey, TValue>(IDictionaryPropertyBag <TDictionary, TKey, TValue> properties, ref TDictionary container) { m_Stream->Add(container.Count); foreach (var kvp in container) { WriteValue(kvp.Key); WriteValue(kvp.Value); } }
void IDictionaryPropertyBagVisitor.Visit <TDictionary, TKey, TValue>(IDictionaryPropertyBag <TDictionary, TKey, TValue> properties, ref TDictionary container) { var elements = m_Metadata.HasElements ? m_View.AsObjectView()[k_SerializedElementsKey] : m_View; container.Clear(); switch (elements.Type) { case TokenType.Array: { var arr = elements.AsArrayView(); foreach (var element in arr) { if (element.Type != TokenType.Object) { continue; } var obj = element.AsObjectView(); if (obj.TryGetValue("Key", out var kView) && obj.TryGetValue("Value", out var vView)) { var key = default(TKey); ReadValue(ref key, kView); var value = default(TValue); ReadValue(ref value, vView); container.Add(key, value); } } break; } case TokenType.Object: { var obj = elements.AsObjectView(); foreach (var member in obj) { var key = default(TKey); ReadValue(ref key, member.Key()); var value = default(TValue); ReadValue(ref value, member.Value()); container.Add(key, value); } break; } } }
void IDictionaryPropertyBagVisitor.Visit <TDictionary, TKey, TValue>(IDictionaryPropertyBag <TDictionary, TKey, TValue> properties, ref TDictionary container) { m_SerializedReferences?.AddDeserializedReference(container); container.Clear(); var count = m_Stream->ReadNext <int>(); for (var i = 0; i < count; i++) { container.Add(ReadValue <TKey>(), ReadValue <TValue>()); } }
/// <summary> /// Invoked by Unity.Properties for each dictionary container type. (i.e. IDictionary{TKey, TValue} type) /// </summary> /// <param name="properties">The property bag being visited.</param> /// <param name="srcContainer">The source dictionary being visited</param> /// <typeparam name="TDictionary">The dictionary type.</typeparam> /// <typeparam name="TKey">The key type.</typeparam> /// <typeparam name="TValue">The value type.</typeparam> void IDictionaryPropertyBagVisitor.Visit <TDictionary, TKey, TValue>(IDictionaryPropertyBag <TDictionary, TKey, TValue> properties, ref TDictionary srcContainer) { var dstContainer = (TDictionary)m_Stack; if (srcContainer.Count != dstContainer.Count) { m_Equals = false; return; } using (var srcContainerEnumerator = srcContainer.GetEnumerator()) using (var dstContainerEnumerator = dstContainer.GetEnumerator()) { for (;;) { var srcNext = srcContainerEnumerator.MoveNext(); var dstNext = dstContainerEnumerator.MoveNext(); if (srcNext != dstNext) { m_Equals = false; return; } if (!srcNext) { break; } var keysAreEqual = CompareEquality(srcContainerEnumerator.Current.Key, dstContainerEnumerator.Current.Key); var valuesAreEqual = CompareEquality(srcContainerEnumerator.Current.Key, dstContainerEnumerator.Current.Key); if (keysAreEqual && valuesAreEqual) { continue; } m_Equals = false; return; } } }
/// <summary> /// Invoked by Unity.Properties for each dictionary container type. (i.e. IDictionary{TKey, TValue} type) /// </summary> /// <param name="properties">The property bag being visited.</param> /// <param name="srcContainer">The source dictionary being visited</param> /// <typeparam name="TDictionary">The dictionary type.</typeparam> /// <typeparam name="TKey">The key type.</typeparam> /// <typeparam name="TValue">The value type.</typeparam> void IDictionaryPropertyBagVisitor.Visit <TDictionary, TKey, TValue>(IDictionaryPropertyBag <TDictionary, TKey, TValue> properties, ref TDictionary srcContainer) { // Unbox the current destination container being written to. var dstContainer = (TDictionary)m_Stack; dstContainer.Clear(); foreach (var kvp in srcContainer) { var key = default(TKey); var value = default(TValue); CloneValue(ref key, kvp.Key); CloneValue(ref value, kvp.Value); dstContainer.Add(key, value); } // Re-box the container. m_Stack = dstContainer; }