fna-workbench

fna-workbench Git Source Tree


Root/src/Content/ContentReaders/DictionaryReader.cs

#region License
/* FNA - XNA4 Reimplementation for Desktop Platforms
 * Copyright 2009-2016 Ethan Lee and the MonoGame Team
 *
 * Released under the Microsoft Public License.
 * See LICENSE for details.
 */
#endregion
 
#region Using Statements
using System;
using System.Collections.Generic;
#endregion
 
namespace Microsoft.Xna.Framework.Content
{
    internal class DictionaryReader<TKey, TValue> : ContentTypeReader<Dictionary<TKey, TValue>>
    {
        #region Public Properties
 
        public override bool CanDeserializeIntoExistingObject
        {
            get
            {
                return true;
            }
        }
 
        #endregion
 
        #region Private Variables
 
        ContentTypeReader keyReader;
        ContentTypeReader valueReader;
 
        Type keyType;
        Type valueType;
 
        #endregion
 
        #region Public Constructor
 
        public DictionaryReader()
        {
        }
 
        #endregion
 
        #region Protected Initialization Method
 
        protected internal override void Initialize(ContentTypeReaderManager manager)
        {
            keyType = typeof(TKey);
            valueType = typeof(TValue);
            keyReader = manager.GetTypeReader(keyType);
            valueReader = manager.GetTypeReader(valueType);
        }
 
        #endregion
 
        #region Protected Read Method
 
        protected internal override Dictionary<TKey, TValue> Read(ContentReader input, Dictionary<TKey, TValue> existingInstance)
        {
            int count = input.ReadInt32();
            Dictionary<TKey, TValue> dictionary = existingInstance;
            if (dictionary == null)
            {
                dictionary = new Dictionary<TKey, TValue>(count);
            }
            else
            {
                dictionary.Clear();
            }
 
            for (int i = 0; i < count; i += 1)
            {
                TKey key;
                TValue value;
                if (keyType.IsValueType)
                {
                    key = input.ReadObject<TKey>(keyReader);
                }
                else
                {
                    int readerType = input.Read7BitEncodedInt();
                    key = (readerType > 0) ? input.ReadObject<TKey>(input.TypeReaders[readerType - 1]) : default(TKey);
                }
                if (valueType.IsValueType)
                {
                    value = input.ReadObject<TValue>(valueReader);
                }
                else
                {
                    int readerType = input.Read7BitEncodedInt();
                    value = (readerType > 0) ? input.ReadObject<TValue>(input.TypeReaders[readerType - 1]) : default(TValue);
                }
                dictionary.Add(key, value);
            }
            return dictionary;
        }
 
        #endregion
    }
}

Archive Download this file

Branches

Number of commits:
Page rendered in 0.08398s using 11 queries.