Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/FeatureTests/DirtyList/DirtyList.cs @ 14801

Last change on this file since 14801 was 14777, checked in by pkimmesw, 8 years ago

#2665 simplifier, push solution results view, performance improvements, small bug fixes, ui fixes

File size: 3.3 KB
Line 
1using System;
2using System.Collections.Generic;
3
4namespace TestPooling.DirtyList {
5  using System.Collections;
6
7  [Serializable]
8  public class DirtyList<T> : IList<T>, IReadOnlyList<T> {
9    private readonly List<T> data;
10    private int topIndex;
11
12    public DirtyList(int capacity = 0) {
13      data = new List<T>(capacity);
14    }
15
16    public IEnumerator<T> GetEnumerator() {
17      return data.GetEnumerator();
18    }
19
20    IEnumerator IEnumerable.GetEnumerator() {
21      return GetEnumerator();
22    }
23
24    public void Add(T item) {
25      if (topIndex == data.Count) {
26        data.Add(item);
27      } else {
28        data[topIndex] = item;
29      }
30
31      topIndex++;
32    }
33
34    public void AddRange(IEnumerable<T> items) {
35      foreach (var item in items) {
36        Add(item);
37      }
38    }
39
40    public void RemoveRange(IEnumerable<T> items) {
41      foreach (var item in items) {
42        Remove(item);
43      }
44    }
45
46    public void Clear() {
47      topIndex = 0;
48    }
49
50    public bool Contains(T item) {
51      if (item == null) {
52        for (int i = 0; i < topIndex; i++)
53          if (data[i] == null)
54            return true;
55        return false;
56      } else {
57        var c = EqualityComparer<T>.Default;
58
59        for (int i = 0; i < topIndex; i++) {
60          if (c.Equals(data[i], item)) return true;
61        }
62        return false;
63      }
64    }
65
66    public void CopyTo(T[] array, int arrayIndex) {
67      data.CopyTo(0, array, arrayIndex, topIndex);
68    }
69
70    public bool Remove(T item) {
71      int index = IndexOf(item);
72      if (index >= 0) {
73        RemoveAt(index);
74        topIndex--;
75        return true;
76      }
77
78      return false;
79    }
80
81    int ICollection<T>.Count
82    {
83      get
84      {
85        return topIndex == 0 ? 0 : topIndex - 1;
86      }
87    }
88
89    public bool IsReadOnly
90    {
91      get
92      {
93        return ((ICollection<T>)data).IsReadOnly;
94      }
95    }
96
97    public int IndexOf(T item) {
98      for (var i = 0; i < topIndex; i++) {
99        if (data.Equals(data[i])) return i;
100      }
101
102      return -1;
103    }
104
105    public void Insert(int index, T item) {
106      // Note that insertions at the end are legal.
107      if ((uint)index > (uint)topIndex) {
108        throw new ArgumentOutOfRangeException("index");
109      }
110
111      data.Insert(index, item);
112    }
113
114    public void RemoveAt(int index) {
115      if ((uint)index > (uint)topIndex) {
116        throw new ArgumentOutOfRangeException("index");
117      }
118
119      data.RemoveAt(index);
120      topIndex--;
121    }
122
123    T IList<T>.this[int index]
124    {
125      get
126      {
127        if ((uint)index > (uint)topIndex) {
128          throw new ArgumentOutOfRangeException("index");
129        }
130
131        return data[index];
132      }
133      set
134      {
135        if ((uint)index > (uint)topIndex) {
136          throw new ArgumentOutOfRangeException("index");
137        }
138
139        data[index] = value;
140      }
141    }
142
143    int IReadOnlyCollection<T>.Count
144    {
145      get
146      {
147        return topIndex < 0 ? 0 : topIndex;
148      }
149    }
150
151    T IReadOnlyList<T>.this[int index]
152    {
153      get
154      {
155        if ((uint)index > (uint)topIndex) {
156          throw new ArgumentOutOfRangeException("index");
157        }
158
159        return data[index];
160      }
161    }
162  }
163}
Note: See TracBrowser for help on using the repository browser.