4 using System.Collections;
5 using System.Collections.Generic;
8 namespace SiliconStudio.Core.Collections
20 private struct Grouping : IGrouping<TKey, TValue>
22 public IEnumerator<TValue> GetEnumerator() {
return enumerable.GetEnumerator(); }
23 IEnumerator IEnumerable.GetEnumerator() {
return enumerable.GetEnumerator(); }
24 public TKey Key {
get {
return key; } }
25 public Grouping(TKey key,
IEnumerable<TValue> values) { this.key = key; enumerable = values; }
26 private readonly TKey key;
30 private struct GroupingEnumerator : IEnumerator<IGrouping<TKey, TValue>>
32 public void Dispose() { keys.Dispose(); }
33 public bool MoveNext() {
return keys.MoveNext(); }
34 public void Reset() { keys.Reset(); }
35 public IGrouping<TKey, TValue> Current {
get {
return new Grouping(keys.Current, list[keys.Current]); } }
36 object IEnumerator.Current {
get {
return new Grouping(keys.Current, list[keys.Current]); } }
38 readonly IEnumerator<TKey> keys;
42 private readonly List<KeyValuePair<TKey, TValue>> list =
new List<KeyValuePair<TKey, TValue>>();
43 private readonly List<TKey> keys =
new List<TKey>();
54 TKey distinctKey =
default(TKey);
55 return keys.Where(x =>
57 bool result = first || !distinctKey.Equals(x);
64 private int KeyToIndex(
object key)
66 return keys.BinarySearch((TKey)key);
71 return new GroupingEnumerator(
this);
77 return list.GetEnumerator();
80 IEnumerator IEnumerable.GetEnumerator()
82 return list.GetEnumerator();
85 public void Add(KeyValuePair<TKey, TValue> item)
88 int greater = list.Count;
89 int current = (lower + greater) >> 1;
90 while (greater - lower > 1)
92 if (keys[current].CompareTo(item.Key) < 0)
100 current = (lower + greater) >> 1;
102 list.Insert(greater, item);
103 keys.Insert(greater, item.Key);
108 return KeyToIndex(key) >= 0;
111 public void Add(
object key,
object value)
113 Add(
new KeyValuePair<TKey, TValue>((TKey)key, (TValue)value));
122 public bool Contains(KeyValuePair<TKey, TValue> item)
124 return KeyToIndex(item.Key) >= 0;
127 public void CopyTo(KeyValuePair<TKey, TValue>[] array,
int arrayIndex)
129 list.CopyTo(array, arrayIndex);
132 public bool Remove(KeyValuePair<TKey, TValue> item)
134 bool removed =
false;
135 for (
int i = KeyToIndex(item.Key); i >= 0; i = KeyToIndex(item.Key))
144 public void CopyTo(Array array,
int index)
151 return KeyToIndex(key) >= 0;
154 public int Count {
get {
return list.Count; } }
156 public IEnumerable<TValue> this[TKey key] {
get {
return list.Skip(KeyToIndex(key)).TakeWhile(x => x.Key.Equals(key)).Select(x => x.Value); } }
158 int ICollection.Count {
get {
return list.Count; } }
160 public object SyncRoot {
get {
return ((
ICollection)list).SyncRoot; } }
162 public bool IsSynchronized {
get {
return ((
ICollection)list).IsSynchronized; } }
166 public bool IsFixedSize {
get {
return false; } }
172 return KeyToIndex(key) >= 0;
175 public void Add(TKey key, TValue value)
177 Add(
new KeyValuePair<TKey, TValue>(key, value));
182 bool removed =
false;
183 for (
int i = KeyToIndex(key); i >= 0; i = KeyToIndex(key))
bool Remove(KeyValuePair< TKey, TValue > item)
bool ContainsKey(TKey key)
void CopyTo(Array array, int index)
SiliconStudio.Paradox.Input.Keys Keys
void CopyTo(KeyValuePair< TKey, TValue >[] array, int arrayIndex)
System.Collections.ICollection ICollection
bool Contains(object key)
Represents a priority queue, where keys are sorted and each key might have mlutiple values...
bool Contains(KeyValuePair< TKey, TValue > item)
void Add(TKey key, TValue value)
IEnumerator< IGrouping< TKey, TValue > > GetEnumerator()
void Add(KeyValuePair< TKey, TValue > item)
void Add(object key, object value)