//---------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System.Collections;
using System.Collections.Generic;
namespace System.Data.Metadata.Edm
{
///
/// Class representing a read-only wrapper around MetadataCollection
///
/// The type of items in this collection
public class ReadOnlyMetadataCollection : System.Collections.ObjectModel.ReadOnlyCollection where T : MetadataItem
{
#region Constructors
///
/// The constructor for constructing a read-only metadata collection to wrap another MetadataCollection.
///
/// The metadata collection to wrap
/// Thrown if collection argument is null
internal ReadOnlyMetadataCollection(IList collection) : base(collection)
{
}
#endregion
#region InnerClasses
// On the surface, this Enumerator doesn't do anything but delegating to the underlying enumerator
///
/// The enumerator for MetadataCollection
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1815:OverrideEqualsAndOperatorEqualsOnValueTypes")]
public struct Enumerator : IEnumerator
{
///
/// Constructor for the enumerator
///
/// The collection that this enumerator should enumerate on
internal Enumerator(IList collection)
{
_parent = collection;
_nextIndex = 0;
_current = null;
}
private int _nextIndex;
private IList _parent;
private T _current;
///
/// Gets the member at the current position
///
public T Current
{
get
{
return _current;
}
}
///
/// Gets the member at the current position
///
object IEnumerator.Current
{
get
{
return this.Current;
}
}
///
/// Dispose this enumerator
///
public void Dispose()
{
}
///
/// Move to the next member in the collection
///
/// True if the enumerator is moved
public bool MoveNext()
{
if ((uint)_nextIndex < (uint)_parent.Count)
{
_current = _parent[_nextIndex];
_nextIndex++;
return true;
}
_current = null;
return false;
}
///
/// Sets the enumerator to the initial position before the first member
///
public void Reset()
{
_current = null;
_nextIndex = 0;
}
}
#endregion
#region Properties
///
/// Gets whether the collection is a readonly collection
///
public bool IsReadOnly
{
get
{
return true;
}
}
///
/// Gets an item from the collection with the given identity
///
/// The identity of the item to search for
/// An item from the collection
/// Thrown if identity argument passed in is null
/// Thrown if setter is called
public virtual T this[string identity]
{
get
{
return (((MetadataCollection)this.Items)[identity]);
}
}
///
/// Returns the metadata collection over which this collection is the view
///
internal MetadataCollection Source
{
get
{
return (MetadataCollection)this.Items;
}
}
#endregion
#region Methods
///
/// Gets an item from the collection with the given identity
///
/// The identity of the item to search for
/// Whether case is ignore in the search
/// An item from the collection
/// Thrown if identity argument passed in is null
/// Thrown if the Collection does not have an item with the given identity
public virtual T GetValue(string identity, bool ignoreCase)
{
return ((MetadataCollection)this.Items).GetValue(identity, ignoreCase);
}
///
/// Determines if this collection contains an item of the given identity
///
/// The identity of the item to check for
/// True if the collection contains the item with the given identity
/// Thrown if identity argument passed in is null
/// Thrown if identity argument passed in is empty string
public virtual bool Contains(string identity)
{
return ((MetadataCollection)this.Items).ContainsIdentity(identity);
}
///
/// Gets an item from the collection with the given identity
///
/// The identity of the item to search for
/// Whether case is ignored in the search
/// An item from the collection, null if the item is not found
/// True an item is retrieved
/// if identity argument is null
public virtual bool TryGetValue(string identity, bool ignoreCase, out T item)
{
return ((MetadataCollection)this.Items).TryGetValue(identity, ignoreCase, out item);
}
///
/// Gets the enumerator over this collection
///
///
public new Enumerator GetEnumerator()
{
return new Enumerator(this.Items);
}
///
/// Workaround for bug
///
///
///
public new virtual int IndexOf(T value)
{
return base.IndexOf(value);
}
#endregion
}
}