forked from nkast/MonoGame
-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
CurveKeyCollection.cs
199 lines (171 loc) · 6.01 KB
/
CurveKeyCollection.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
// MIT License - Copyright (C) The Mono.Xna Team
// This file is subject to the terms and conditions defined in
// file 'LICENSE.txt', which is part of this source code package.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace Microsoft.Xna.Framework
{
/// <summary>
/// The collection of the <see cref="CurveKey"/> elements and a part of the <see cref="Curve"/> class.
/// </summary>
// TODO : [TypeConverter(typeof(ExpandableObjectConverter))]
[DataContract]
public class CurveKeyCollection : ICollection<CurveKey>
{
#region Private Fields
private readonly List<CurveKey> _keys;
#endregion
#region Properties
/// <summary>
/// Indexer.
/// </summary>
/// <param name="index">The index of key in this collection.</param>
/// <returns><see cref="CurveKey"/> at <paramref name="index"/> position.</returns>
[DataMember(Name = "Items")]
public CurveKey this[int index]
{
get { return _keys[index]; }
set
{
if (value == null)
throw new ArgumentNullException();
if (index >= _keys.Count)
throw new IndexOutOfRangeException();
if (_keys[index].Position == value.Position)
_keys[index] = value;
else
{
_keys.RemoveAt(index);
_keys.Add(value);
}
}
}
/// <summary>
/// Returns the count of keys in this collection.
/// </summary>
[DataMember]
public int Count
{
get { return _keys.Count; }
}
/// <summary>
/// Returns false because it is not a read-only collection.
/// </summary>
[DataMember]
public bool IsReadOnly
{
get { return false; }
}
#endregion
#region Constructors
/// <summary>
/// Creates a new instance of <see cref="CurveKeyCollection"/> class.
/// </summary>
public CurveKeyCollection()
{
_keys = new List<CurveKey>();
}
#endregion
IEnumerator IEnumerable.GetEnumerator()
{
return _keys.GetEnumerator();
}
/// <summary>
/// Adds a key to this collection.
/// </summary>
/// <param name="item">New key for the collection.</param>
/// <exception cref="ArgumentNullException">Throws if <paramref name="item"/> is null.</exception>
/// <remarks>The new key would be added respectively to a position of that key and the position of other keys.</remarks>
public void Add(CurveKey item)
{
if (item == null)
throw new ArgumentNullException("item");
if (_keys.Count == 0)
{
this._keys.Add(item);
return;
}
for (int i = 0; i < this._keys.Count; i++)
{
if (item.Position < this._keys[i].Position)
{
this._keys.Insert(i, item);
return;
}
}
this._keys.Add(item);
}
/// <summary>
/// Removes all keys from this collection.
/// </summary>
public void Clear()
{
_keys.Clear();
}
/// <summary>
/// Creates a copy of this collection.
/// </summary>
/// <returns>A copy of this collection.</returns>
public CurveKeyCollection Clone()
{
CurveKeyCollection ckc = new CurveKeyCollection();
foreach (CurveKey key in this._keys)
ckc.Add(key);
return ckc;
}
/// <summary>
/// Determines whether this collection contains a specific key.
/// </summary>
/// <param name="item">The key to locate in this collection.</param>
/// <returns><c>true</c> if the key is found; <c>false</c> otherwise.</returns>
public bool Contains(CurveKey item)
{
return _keys.Contains(item);
}
/// <summary>
/// Copies the keys of this collection to an array, starting at the array index provided.
/// </summary>
/// <param name="array">Destination array where elements will be copied.</param>
/// <param name="arrayIndex">The zero-based index in the array to start copying from.</param>
public void CopyTo(CurveKey[] array, int arrayIndex)
{
_keys.CopyTo(array, arrayIndex);
}
/// <summary>
/// Returns an enumerator that iterates through the collection.
/// </summary>
/// <returns>An enumerator for the <see cref="CurveKeyCollection"/>.</returns>
public IEnumerator<CurveKey> GetEnumerator()
{
return _keys.GetEnumerator();
}
/// <summary>
/// Finds element in the collection and returns its index.
/// </summary>
/// <param name="item">Element for the search.</param>
/// <returns>Index of the element; or -1 if item is not found.</returns>
public int IndexOf(CurveKey item)
{
return _keys.IndexOf(item);
}
/// <summary>
/// Removes element at the specified index.
/// </summary>
/// <param name="index">The index which element will be removed.</param>
public void RemoveAt(int index)
{
_keys.RemoveAt(index);
}
/// <summary>
/// Removes specific element.
/// </summary>
/// <param name="item">The element</param>
/// <returns><c>true</c> if item is successfully removed; <c>false</c> otherwise. This method also returns <c>false</c> if item was not found.</returns>
public bool Remove(CurveKey item)
{
return _keys.Remove(item);
}
}
}