-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIndexedCollection.cs
101 lines (86 loc) · 2.53 KB
/
IndexedCollection.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using System;
using System.Collections;
using System.Collections.Generic;
namespace IndexedCollection
{
public partial class IndexedCollection<TItem> : IEnumerable<IndexedCollection<TItem>.Entry>
{
private readonly Buffer<Entry> _values = new Buffer<Entry>();
private readonly Buffer<IIndex> _indexers = new Buffer<IIndex>();
public IndexedCollection() {}
public Entry Add(TItem item)
{
int index = _values.Count;
var entry = new Entry()
{
Item = item,
Index = index
};
_values.Add(entry);
foreach(var indexer in _indexers)
{
indexer.Add(entry);
}
return entry;
}
public void Remove(Entry entry)
{
var index = entry.Index;
foreach(var indexer in _indexers)
{
indexer.Remove(entry);
}
_values.RemoveAndMixOrder(index);
if(_values.Count > 0 && index < _values.Count)
{
_values.Array[index].Index = index;
}
}
public void Rebuild(Entry entry)
{
Remove(entry);
Add(entry.Item);
}
public IndexByKey<TKey> CreateIndexByKey<TKey>(Func<TItem, TKey> selector)
{
var index = new IndexByKey<TKey>(selector, this);
_indexers.Add(index);
((IIndex)index).Rebuild();
return index;
}
public IndexOneToOne<TKey> CreateIndexOneToOne<TKey>(Func<TItem, TKey> selector)
{
var index = new IndexOneToOne<TKey>(selector, this);
_indexers.Add(index);
((IIndex)index).Rebuild();
return index;
}
public IndexByType CreateIndexByType(Func<TItem, Type> selector)
{
var index = new IndexByType(selector, this);
_indexers.Add(index);
((IIndex)index).Rebuild();
return index;
}
public void Clear()
{
foreach(var indexer in _indexers)
{
indexer.Clear();
}
}
public class Entry
{
public int Index = -1;
public TItem Item;
}
public IEnumerator<Entry> GetEnumerator()
{
return _values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}