#region License
#endregion
#region Using Statements
using
System;
using
System.Collections;
using
System.Collections.Generic;
#endregion
namespace
Microsoft.Xna.Framework
{
/// <summary>
/// The collection of the <see cref="CurveKey"/> elements and a part of the <see cref="Curve"/> class.
/// </summary>
public
class
CurveKeyCollection : ICollection<CurveKey>, IEnumerable<CurveKey>, IEnumerable
{
#region Public Properties
/// <summary>
/// Returns the count of keys in this collection.
/// </summary>
public
int
Count
{
get
{
return
innerlist.Count;
}
}
/// <summary>
/// Returns false because it is not a read-only collection.
/// </summary>
public
bool
IsReadOnly
{
get
{
return
this
.isReadOnly;
}
}
/// <summary>
/// Indexer.
/// </summary>
/// <param name="index">The index of key in this collection.</param>
/// <returns><see cref="CurveKey"/> at <paramref name="index"/> position.</returns>
public
CurveKey
this
[
int
index]
{
get
{
return
innerlist[index];
}
set
{
if
(value ==
null
)
{
throw
new
ArgumentNullException(
"value"
);
}
if
(index >= innerlist.Count)
{
throw
new
IndexOutOfRangeException();
}
if
(MathHelper.WithinEpsilon(innerlist[index].Position, value.Position))
{
innerlist[index] = value;
}
else
{
innerlist.RemoveAt(index);
innerlist.Add(value);
}
}
}
#endregion
#region Private Fields
private
bool
isReadOnly =
false
;
private
List<CurveKey> innerlist;
#endregion
#region Public Constructors
/// <summary>
/// Creates a new instance of <see cref="CurveKeyCollection"/> class.
/// </summary>
public
CurveKeyCollection()
{
innerlist =
new
List<CurveKey>();
}
#endregion
#region Public Methods
/// <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
(innerlist.Count == 0)
{
this
.innerlist.Add(item);
return
;
}
for
(
int
i = 0; i <
this
.innerlist.Count; i += 1)
{
if
(item.Position <
this
.innerlist[i].Position)
{
this
.innerlist.Insert(i, item);
return
;
}
}
this
.innerlist.Add(item);
}
/// <summary>
/// Removes all keys from this collection.
/// </summary>
public
void
Clear()
{
innerlist.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
.innerlist)
{
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
innerlist.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)
{
innerlist.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
innerlist.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
innerlist.IndexOf(item);
}
/// <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
innerlist.Remove(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)
{
innerlist.RemoveAt(index);
}
IEnumerator IEnumerable.GetEnumerator()
{
return
innerlist.GetEnumerator();
}
#endregion
}
}