/[xmltv_parser]/trunk/libxmltv/Core/PropertyDictionary.cs
ViewVC logotype

Diff of /trunk/libxmltv/Core/PropertyDictionary.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 95 by william, Sun Mar 10 09:01:33 2013 UTC revision 128 by william, Wed Mar 13 13:45:05 2013 UTC
# Line 10  using System.Reflection; Line 10  using System.Reflection;
10    
11  namespace libxmltv.Core  namespace libxmltv.Core
12  {  {
13            [Serializable]
14      public class PropertyCollection<T> : IPropertyCollection<T>      internal class PropertyCollection<T> : IPropertyCollection<T>
15      {      {
16          private List<T> items = new List<T>();          private List<T> items = new List<T>();
17          public PropertyCollection() : this(new List<T>()) { }          public PropertyCollection() : this(new List<T>()) { }
18          public PropertyCollection(ICollection<T> collection) { foreach (var t in collection) { items.Add(t); } }          public PropertyCollection(ICollection<T> collection) { foreach (var t in collection) { items.Add(t); } }
19          public int PropertyCount { get { return items.Count; } }          public int PropertyCount { get { return items.Count; } }
20          public bool IsReadOnly { get { return (items as ICollection<T>).IsReadOnly; } }  
21            public bool IsReadOnly
22            {
23                get
24                {
25                    ICollection<T> collection = (items as ICollection<T>);
26                    if (collection == null)
27                    {
28                        throw new InvalidCastException(string.Format("Unable to cast: '{0}' to '{1}'", items.GetType().Name, typeof(ICollection<T>).Name));
29                    }
30                    return collection.IsReadOnly;
31                }
32            }
33    
34          public void AddProperty(T item) { items.Add(item); }          public void AddProperty(T item) { items.Add(item); }
35          public void ClearProperties() { items.Clear(); }          public void ClearProperties() { items.Clear(); }
36          public bool ContainsProperty(T item) { return items.Contains(item); }          public bool ContainsProperty(T item) { return items.Contains(item); }
37          public void CopyPropertiesTo(T[] array, int arrayIndex) { items.CopyTo(array, arrayIndex); }          public void CopyPropertiesTo(T[] array, int arrayIndex) { items.CopyTo(array, arrayIndex); }
38          public bool RemoveProperty(T item) { return items.Remove(item); }          public bool RemoveProperty(T item) { return items.Remove(item); }
39          public IEnumerator<T> GetEnumerator() { return items.GetEnumerator(); }          public IEnumerator<T> GetEnumerator() { return items.GetEnumerator(); }
40          System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return items.GetEnumerator(); }          System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {return this.GetEnumerator(); }
41    
42            public override string ToString()
43            {
44                return string.Format("Property Count: {0}", PropertyCount);
45            }
46      }      }
47      public class PropertyDictionary : PropertyDictionary<string, object>, IPropertyDictionary      [Serializable]
48        internal class PropertyDictionary : PropertyDictionary<string, object>, IPropertyDictionary
49      {      {
50          public PropertyDictionary() : base() { }          public PropertyDictionary() : base() { }
51          public PropertyDictionary(IPropertyDictionary dictionary) : base(dictionary) { }          public PropertyDictionary(IPropertyDictionary dictionary) : base(dictionary) { }
# Line 36  namespace libxmltv.Core Line 55  namespace libxmltv.Core
55          public PropertyDictionary(int capacity, IEqualityComparer<string> comparer) : base(capacity, comparer) { }          public PropertyDictionary(int capacity, IEqualityComparer<string> comparer) : base(capacity, comparer) { }
56          protected PropertyDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { }          protected PropertyDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { }
57      }      }
58      public class PropertyDictionary<TKey, TValue> : IPropertyDictionary<TKey, TValue>      [Serializable]
59        internal class PropertyDictionary<TKey, TValue> : IPropertyDictionary<TKey, TValue>
60      {      {
61          [StructLayout(LayoutKind.Sequential)]          [StructLayout(LayoutKind.Sequential)]
62          private struct Entry          private struct Entry
# Line 45  namespace libxmltv.Core Line 65  namespace libxmltv.Core
65              public int next;              public int next;
66              public TKey name;              public TKey name;
67              public TValue value;              public TValue value;
68                public override string ToString()
69                {
70                    return new PropertyValuePair<TKey, TValue>(name, value).ToString();
71                }
72          }          }
73          private Entry[] entries          private Entry[] entries
74          {          {
# Line 71  namespace libxmltv.Core Line 95  namespace libxmltv.Core
95              {              {
96                  Type t = typeof(Dictionary<TKey, TValue>);                  Type t = typeof(Dictionary<TKey, TValue>);
97                  var field = t.GetField("version", BindingFlags.NonPublic | BindingFlags.Instance);                  var field = t.GetField("version", BindingFlags.NonPublic | BindingFlags.Instance);
98                  var v = Convert.ToInt32(field.GetValue(properties));                  var v = Convert.ToInt32(field.GetValue(this.properties));
99                  return v;                  return v;
100              }              }
101          }          }
# Line 116  namespace libxmltv.Core Line 140  namespace libxmltv.Core
140          public bool RemoveProperty(TKey key) { return properties.Remove(key); }          public bool RemoveProperty(TKey key) { return properties.Remove(key); }
141          public bool TryGetPropertyValue(TKey key, out TValue value) { return properties.TryGetValue(key, out value); }          public bool TryGetPropertyValue(TKey key, out TValue value) { return properties.TryGetValue(key, out value); }
142          public int PropertyCount { get { return properties.Count; } }          public int PropertyCount { get { return properties.Count; } }
143          public bool IsReadOnly { get { return (properties as IPropertyCollection<TKey>).IsReadOnly; } }          public bool IsReadOnly
         public void AddProperty(PropertyValuePair<TKey, TValue> item) { AddProperty(item.Name, item.Value); }  
         public void ClearProperties() { properties.Clear(); }  
         public bool ContainsProperty(PropertyValuePair<TKey, TValue> item) { return ContainsProperty(item.Name); }  
         public void CopyPropertiesTo(PropertyValuePair<TKey, TValue>[] array, int arrayIndex)  
         {  
             var list = properties.ToList().Cast<PropertyValuePair<TKey, TValue>>().ToList();  
             list.CopyTo(array, arrayIndex);  
         }  
         public bool RemoveProperty(PropertyValuePair<TKey, TValue> item) { return RemoveProperty(item.Name); }  
         IEnumerator<PropertyValuePair<TKey, TValue>> IEnumerable<PropertyValuePair<TKey, TValue>>.GetEnumerator() { return new PropertyDictionaryEnumerator(this, 2); }  
         System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return properties.GetEnumerator(); }  
   
         #region enumerator support  
         public class PropertyDictionaryEnumerator: IEnumerator<PropertyValuePair<TKey,TValue>>, IDisposable  
144          {          {
145              private PropertyDictionary<TKey, TValue> dictionary;              get
             private int index;  
             private PropertyValuePair<TKey, TValue> current;  
             private int getEnumeratorRetType;  
             internal const int DictEntry = 1;  
             internal const int KeyValuePair = 2;  
             private int version;  
             public PropertyDictionaryEnumerator(PropertyDictionary<TKey, TValue> dictionary, int getEnumeratorRetType)  
             {  
                 this.dictionary = dictionary;  
                 this.version = dictionary.version;  
                 this.index = 0;  
                 this.getEnumeratorRetType = getEnumeratorRetType;  
                 this.current = new PropertyValuePair<TKey, TValue>();  
             }  
   
             public PropertyValuePair<TKey, TValue> Current  
             {  
                 get { return this.current; }  
             }  
   
             public void Dispose()  
             {  
             }  
   
             object IEnumerator.Current  
146              {              {
147                  get                  IDictionary<TKey, TValue> collection = (properties as IDictionary<TKey, TValue>);
148                    if (collection == null)
149                  {                  {
150                      if ((this.index == 0) || (this.index == (this.dictionary.Count() + 1)))                      throw new InvalidCastException(string.Format("Unable to cast: '{0}' to '{1}'", properties.GetType().Name, typeof(IDictionary<TKey, TValue>).Name));
                     {  
                         throw new InvalidOperationException("Operation can't happen");  
                     }  
                     if (this.getEnumeratorRetType == 1)  
                     {  
                         return new DictionaryEntry(this.current.Name, this.current.Value);  
                     }  
                     return new PropertyValuePair<TKey, TValue>(this.current.Name, this.current.Value);  
151                  }                  }
152                    return collection.IsReadOnly;
153              }              }
154            }
155            public void AddProperty(IPropertyValuePair<TKey, TValue> item) { AddProperty(item.Name, item.Value); }
156            public void ClearProperties() { properties.Clear(); }
157            public bool ContainsProperty(IPropertyValuePair<TKey, TValue> item) { return ContainsProperty(item.Name); }
158            public void CopyPropertiesTo(IPropertyValuePair<TKey, TValue>[] array, int arrayIndex)
159            {
160                var list = properties.ToList().Cast<IPropertyValuePair<TKey, TValue>>().ToList();
161                list.CopyTo(array, arrayIndex);
162            }
163            public bool RemoveProperty(IPropertyValuePair<TKey, TValue> item) { return RemoveProperty(item.Name); }
164            public IEnumerator<IPropertyValuePair<TKey, TValue>> GetEnumerator()
165            {
166                //return new PropertyDictionaryEnumerator(this, 2);
167                List<IPropertyValuePair<TKey, TValue>> list = new List<IPropertyValuePair<TKey, TValue>>();
168                foreach (var k in properties) { list.Add(new PropertyValuePair<TKey, TValue>(k.Key, k.Value)); }            
169                return list.GetEnumerator();
170            }
171            IEnumerator IEnumerable.GetEnumerator() { return properties.GetEnumerator(); }
172    
173              public bool MoveNext()          public override string ToString()
174              {          {
175                  if (this.version != this.dictionary.version)              return string.Format("Property Count: {0}", PropertyCount);
                 {  
                     ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);  
                 }  
                 while (this.index < this.dictionary.Count())  
                 {  
                     if (this.dictionary.entries[this.index].hashCode >= 0)  
                     {  
                         this.current = new KeyValuePair<TKey, TValue>(this.dictionary.entries[this.index].name, this.dictionary.entries[this.index].value);  
                         this.index++;  
                         return true;  
                     }  
                     this.index++;  
                 }  
                 this.index = this.dictionary.Count() + 1;  
                 this.current = new PropertyValuePair<TKey, TValue>();  
                 return false;  
             }  
             public void Reset()  
             {  
                 if (this.version != this.dictionary.version)  
                 {  
                     ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);  
                 }  
                 this.index = 0;  
                 this.current = new KeyValuePair<TKey, TValue>();  
             }  
176          }          }
177            #region enumerator support
178            //public class PropertyDictionaryEnumerator : IEnumerator<IPropertyValuePair<TKey, TValue>>, IDisposable
179            //{
180            //    private PropertyDictionary<TKey, TValue> dictionary;
181            //    private int index;
182            //    private IPropertyValuePair<TKey, TValue> current;
183            //    private int getEnumeratorRetType;
184            //    internal const int DictEntry = 1;
185            //    internal const int KeyValuePair = 2;
186            //    private int version;
187            //    public PropertyDictionaryEnumerator(PropertyDictionary<TKey, TValue> dictionary, int getEnumeratorRetType)
188            //    {
189            //        this.dictionary = dictionary;
190            //        //this.version = dictionary.version;
191            //        this.index = 0;
192            //        this.getEnumeratorRetType = getEnumeratorRetType;
193            //        this.current = new PropertyValuePair<TKey, TValue>();
194            //    }
195            //    public IPropertyValuePair<TKey, TValue> Current
196            //    {
197            //        get { return this.current; }
198            //    }
199            //    public void Dispose()
200            //    {
201            //    }
202            //    object IEnumerator.Current
203            //    {
204            //        get
205            //        {
206            //            if ((this.index == 0) || (this.index == (this.dictionary.Count() + 1)))
207            //            {
208            //                throw new InvalidOperationException("Operation can't happen");
209            //            }
210            //            if (this.getEnumeratorRetType == 1)
211            //            {
212            //                return new DictionaryEntry(this.current.Name, this.current.Value);
213            //            }
214            //            return new PropertyValuePair<TKey, TValue>(this.current.Name, this.current.Value);
215            //        }
216            //    }
217            //    public bool MoveNext()
218            //    {
219            //        //if (this.version != this.dictionary.version)
220            //        //{
221            //        //    ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
222            //        //}
223            //        while (this.index < this.dictionary.Count())
224            //        {
225            //            if (this.dictionary.entries[this.index].hashCode >= 0)
226            //            {
227            //                this.current =(IPropertyValuePair<TKey,TValue>)(PropertyValuePair<TKey,TValue>)new KeyValuePair<TKey, TValue>(this.dictionary.entries[this.index].name, this.dictionary.entries[this.index].value);
228            //                this.index++;
229            //                return true;
230            //            }
231            //            this.index++;
232            //        }
233            //        this.index = this.dictionary.Count() + 1;
234            //        this.current = new PropertyValuePair<TKey, TValue>();
235            //        return false;
236            //    }
237            //    public void Reset()
238            //    {
239            //        //if (this.version != this.dictionary.version)
240            //        //{
241            //        //    ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
242            //        //}
243            //        this.index = 0;
244            //        this.current = (IPropertyValuePair<TKey, TValue>)(PropertyValuePair<TKey, TValue>)new KeyValuePair<TKey, TValue>();
245            //    }
246            //}
247          #endregion            #endregion  
248      }      }
249    

Legend:
Removed from v.95  
changed lines
  Added in v.128

  ViewVC Help
Powered by ViewVC 1.1.22