コード例 #1
0
 /// <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);
     }
 }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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;
            }
            }
        }
コード例 #4
0
        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>());
            }
        }
コード例 #5
0
        /// <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;
        }