Created
May 2, 2013 03:25
-
-
Save jacobstanley/5499969 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public sealed class ImmutableList<T> : IList<T>, IList | |
{ | |
private readonly T[] m_Items; | |
public ImmutableList(IEnumerable<T> source) | |
{ | |
m_Items = source.ToArray(); | |
} | |
public T[] ToArray() | |
{ | |
T[] newArray = new T[m_Items.Length]; | |
m_Items.CopyTo(newArray, 0); | |
return newArray; | |
} | |
private static void ThrowNotSupported() | |
{ | |
throw new NotSupportedException("The attempted operation was not supported as the collection is read-only."); | |
} | |
#region IList<T> Members | |
int IList.Add(object value) | |
{ | |
ThrowNotSupported(); | |
return -1; | |
} | |
void IList.Clear() | |
{ | |
ThrowNotSupported(); | |
} | |
void IList<T>.Insert(int index, T item) | |
{ | |
ThrowNotSupported(); | |
} | |
void IList.Insert(int index, object value) | |
{ | |
ThrowNotSupported(); | |
} | |
void IList.Remove(object value) | |
{ | |
ThrowNotSupported(); | |
} | |
void IList.RemoveAt(int index) | |
{ | |
ThrowNotSupported(); | |
} | |
void IList<T>.RemoveAt(int index) | |
{ | |
ThrowNotSupported(); | |
} | |
T IList<T>.this[int index] | |
{ | |
get | |
{ | |
return m_Items[index]; | |
} | |
set | |
{ | |
ThrowNotSupported(); | |
} | |
} | |
object IList.this[int index] | |
{ | |
get | |
{ | |
return m_Items[index]; | |
} | |
set | |
{ | |
ThrowNotSupported(); | |
} | |
} | |
public T this[int index] | |
{ | |
get | |
{ | |
return m_Items[index]; | |
} | |
} | |
bool IList.Contains(object value) | |
{ | |
return Array.IndexOf(m_Items, value) != -1; | |
} | |
int IList.IndexOf(object value) | |
{ | |
return Array.IndexOf(m_Items, value); | |
} | |
public int IndexOf(T item) | |
{ | |
return Array.IndexOf(m_Items, item); | |
} | |
bool IList.IsFixedSize | |
{ | |
get | |
{ | |
return true; | |
} | |
} | |
#endregion | |
#region ICollection<T> Members | |
void ICollection<T>.Add(T item) | |
{ | |
ThrowNotSupported(); | |
} | |
void ICollection<T>.Clear() | |
{ | |
ThrowNotSupported(); | |
} | |
bool ICollection<T>.Remove(T item) | |
{ | |
ThrowNotSupported(); | |
return false; | |
} | |
object ICollection.SyncRoot | |
{ | |
get | |
{ | |
return m_Items; | |
} | |
} | |
bool ICollection.IsSynchronized | |
{ | |
get | |
{ | |
return true; | |
} | |
} | |
public bool Contains(T item) | |
{ | |
return IndexOf(item) != -1; | |
} | |
public void CopyTo(T[] array, int arrayIndex) | |
{ | |
m_Items.CopyTo(array, arrayIndex); | |
} | |
void ICollection.CopyTo(Array array, int index) | |
{ | |
m_Items.CopyTo(array, index); | |
} | |
public int Count | |
{ | |
get | |
{ | |
return m_Items.Length; | |
} | |
} | |
public bool IsReadOnly | |
{ | |
get | |
{ | |
return true; | |
} | |
} | |
#endregion | |
#region IEnumerable<T> Members | |
public IEnumerator<T> GetEnumerator() | |
{ | |
return ((IEnumerable<T>)m_Items).GetEnumerator(); | |
} | |
IEnumerator IEnumerable.GetEnumerator() | |
{ | |
return m_Items.GetEnumerator(); | |
} | |
#endregion | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment