Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Core / System / Windows / Media / Animation / WeakRefEnumerator.cs / 1 / WeakRefEnumerator.cs
//------------------------------------------------------------------------------
// Microsoft Windows Client Platform
// Copyright (c) Microsoft Corporation, 2003
//
// File: WeakRefEnumerator.cs
//-----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace System.Windows.Media.Animation
{
///
/// An enumerator for collections of weak references.
///
///
/// The enumerator returns only live objects and removes dead
/// references from the list as it walks.
///
internal struct WeakRefEnumerator
{
#region Internal implementation
#region Construction
///
/// Creates an enumerator for the given list.
///
///
/// The list to enumerate.
///
internal WeakRefEnumerator(List list)
{
_list = list;
_readIndex = 0;
_writeIndex = 0;
_current = default(T);
#if DEBUG
_valid = false;
#endif // DEBUG
}
#endregion // Construction
#region Properties
///
/// Gets the current element in the collection.
///
///
/// The current element in the collection.
///
internal T Current
{
get
{
#if DEBUG
Debug.Assert(_valid);
#endif // DEBUG
return _current;
}
}
///
/// Gets the index of the current element in the collection.
///
///
/// The index of the current element in the collection.
///
internal int CurrentIndex
{
get
{
#if DEBUG
Debug.Assert(_valid);
#endif // DEBUG
return _writeIndex - 1;
}
}
#endregion // Properties
#region Methods
///
/// This method must be called when the enumerator is no longer
/// in use, if the last call to MoveNext returned true. The
/// enumerator is no longer valid after this call.
///
///
/// When MoveNext returns false, the collection being enumerated is
/// left in a good, known state, so nothing additional needs to be
/// done. However, before MoveNext returns false the collection is
/// in an intermediate state, so if the enumerator isn't advanced
/// all the way to the end then this method must be called to clean
/// up the collection and make sure that it ends in a known state.
/// Calling this method in the case where MoveNext has returned
/// false is OK. In that case, the method is a no-op.
///
internal void Dispose()
{
// Remove only those elements that we've previously seen.
// This means removing the range between the read and write
// indices, as that's dead space in the collection.
if (_readIndex != _writeIndex)
{
_list.RemoveRange(_writeIndex, _readIndex - _writeIndex);
_readIndex = _writeIndex = _list.Count;
}
_current = default(T);
#if DEBUG
_valid = false;
#endif // DEBUG
}
///
/// Advances the enumerator to the next element of the collection.
///
///
/// true if the enumerator was successfully advanced to the next
/// element; false if the enumerator has passed the end of the
/// collection.
///
///
/// Elements that have been GC'ed are removed from the list.
///
internal bool MoveNext()
{
// Get a reference to the next element that has not yet been
// garbage-collected
while (_readIndex < _list.Count)
{
WeakReference currentRef = _list[_readIndex];
_current = (T)currentRef.Target;
if ( (object)_current != null)
{
// Found a live object. First compress the list, which
// is necessary if we've previously seen GC'ed objects.
if (_writeIndex != _readIndex)
{
_list[_writeIndex] = currentRef;
}
// Update internal state and return the found element
_readIndex++;
_writeIndex++;
#if DEBUG
_valid = true;
#endif // DEBUG
return true;
}
else
{
// This object was garbage-collected, so keep looking
_readIndex++;
}
}
// If we get here we didn't have any more live elements in the
// collection, so we should return false. This is also a good
// opportunity to clean up the list as necessary.
Dispose();
return false;
}
#endregion // Methods
#region Data
private List _list;
private T _current;
private int _readIndex;
private int _writeIndex;
#if DEBUG
private bool _valid;
#endif // DEBUG
#endregion // Data
#endregion // Internal implementation
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- InvalidPrinterException.cs
- DataContractJsonSerializer.cs
- InlinedAggregationOperatorEnumerator.cs
- Int64Storage.cs
- RowUpdatedEventArgs.cs
- BulletedList.cs
- XPathExpr.cs
- _SpnDictionary.cs
- ImageField.cs
- CatalogPartChrome.cs
- SqlDataSourceSelectingEventArgs.cs
- WebServiceHostFactory.cs
- RouteCollection.cs
- EventPrivateKey.cs
- Utils.cs
- ScrollProviderWrapper.cs
- FlowLayout.cs
- ServiceOperation.cs
- TextBox.cs
- DisposableCollectionWrapper.cs
- RemotingConfiguration.cs
- XmlEntityReference.cs
- HwndHostAutomationPeer.cs
- SiteMapProvider.cs
- ScrollableControlDesigner.cs
- EncryptedPackage.cs
- JournalEntryListConverter.cs
- SortedDictionary.cs
- Expr.cs
- SingleQueryOperator.cs
- ColorMatrix.cs
- LocalizabilityAttribute.cs
- TransactionScope.cs
- StructuredTypeEmitter.cs
- CachedFontFace.cs
- XmlReflectionMember.cs
- GetIndexBinder.cs
- SByte.cs
- ToolStripItemDesigner.cs
- ChildTable.cs
- EventPropertyMap.cs
- NameScopePropertyAttribute.cs
- TextServicesManager.cs
- DoubleMinMaxAggregationOperator.cs
- XmlElementCollection.cs
- NavigationHelper.cs
- WebPartTransformerCollection.cs
- FormClosedEvent.cs
- Crypto.cs
- SplitterEvent.cs
- DesignerToolboxInfo.cs
- DataBoundLiteralControl.cs
- RubberbandSelector.cs
- StringValidatorAttribute.cs
- X509SecurityTokenProvider.cs
- ForwardPositionQuery.cs
- SafeProcessHandle.cs
- Sentence.cs
- AuthorizationSection.cs
- BaseInfoTable.cs
- WebDescriptionAttribute.cs
- BitmapMetadataEnumerator.cs
- CalculatedColumn.cs
- RowVisual.cs
- Soap.cs
- DataGridRowAutomationPeer.cs
- PathData.cs
- ArraySet.cs
- ContainerTracking.cs
- KeyValueSerializer.cs
- LoadWorkflowCommand.cs
- TargetConverter.cs
- XamlTreeBuilder.cs
- DocumentSchemaValidator.cs
- Repeater.cs
- DockProviderWrapper.cs
- VisualStyleRenderer.cs
- DataContractAttribute.cs
- StringAttributeCollection.cs
- SrgsDocument.cs
- ArrangedElementCollection.cs
- AlgoModule.cs
- CryptoHandle.cs
- WSSecureConversationFeb2005.cs
- Site.cs
- PbrsForward.cs
- X500Name.cs
- XmlBinaryReaderSession.cs
- ObjectListCommand.cs
- TerminatingOperationBehavior.cs
- UrlParameterReader.cs
- ProfilePropertySettings.cs
- HttpValueCollection.cs
- SchemaInfo.cs
- SecurityVersion.cs
- RegexCode.cs
- XDRSchema.cs
- ComplusTypeValidator.cs
- EndPoint.cs
- ToolbarAUtomationPeer.cs