Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / System / Activities / Quack.cs / 1305376 / Quack.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.Activities
{
using System;
using System.Runtime;
// A mostly output-restricted double-ended queue. You can add an item to both ends
// and it is optimized for removing from the front. The list can be scanned and
// items can be removed from any location at the cost of performance.
class Quack
{
T[] items;
// First element when items is not empty
int head;
// Next vacancy when items are not full
int tail;
// Number of elements.
int count;
public Quack()
{
this.items = new T[4];
}
public Quack(T[] items)
{
Fx.Assert(items != null, "This shouldn't get called with null");
Fx.Assert(items.Length > 0, "This shouldn't be called with a zero length array.");
this.items = items;
// The default value of 0 is correct for both
// head and tail.
this.count = this.items.Length;
}
public int Count
{
get { return this.count; }
}
public T this[int index]
{
get
{
Fx.Assert(index < this.count, "Index out of range.");
int realIndex = (this.head + index) % this.items.Length;
return this.items[realIndex];
}
}
public T[] ToArray()
{
Fx.Assert(this.count > 0, "We should only call this when we have items.");
T[] compressedItems = new T[this.count];
for (int i = 0; i < this.count; i++)
{
compressedItems[i] = this.items[(this.head + i) % this.items.Length];
}
return compressedItems;
}
public void PushFront(T item)
{
if (this.count == this.items.Length)
{
Enlarge();
}
if (--this.head == -1)
{
this.head = this.items.Length - 1;
}
this.items[this.head] = item;
++this.count;
}
public void Enqueue(T item)
{
if (this.count == this.items.Length)
{
Enlarge();
}
this.items[this.tail] = item;
if (++this.tail == this.items.Length)
{
this.tail = 0;
}
++this.count;
}
public T Dequeue()
{
Fx.Assert(this.count > 0, "Quack is empty");
T removed = this.items[this.head];
this.items[this.head] = default(T);
if (++this.head == this.items.Length)
{
this.head = 0;
}
--this.count;
return removed;
}
public bool Remove(T item)
{
int found = -1;
for (int i = 0; i < this.count; i++)
{
int realIndex = (this.head + i) % this.items.Length;
if (object.Equals(this.items[realIndex], item))
{
found = i;
break;
}
}
if (found == -1)
{
return false;
}
else
{
Remove(found);
return true;
}
}
public void Remove(int index)
{
Fx.Assert(index < this.count, "Index out of range");
for (int i = index - 1; i >= 0; i--)
{
int sourceIndex = (this.head + i) % this.items.Length;
int targetIndex = sourceIndex + 1;
if (targetIndex == this.items.Length)
{
targetIndex = 0;
}
this.items[targetIndex] = this.items[sourceIndex];
}
--this.count;
++this.head;
if (this.head == this.items.Length)
{
this.head = 0;
}
}
void Enlarge()
{
Fx.Assert(this.items.Length > 0, "Quack is empty");
int capacity = this.items.Length * 2;
this.SetCapacity(capacity);
}
void SetCapacity(int capacity)
{
Fx.Assert(capacity >= this.count, "Capacity is set to a smaller value");
T[] newArray = new T[capacity];
if (this.count > 0)
{
if (this.head < this.tail)
{
Array.Copy(this.items, this.head, newArray, 0, this.count);
}
else
{
Array.Copy(this.items, this.head, newArray, 0, this.items.Length - this.head);
Array.Copy(this.items, 0, newArray, this.items.Length - this.head, this.tail);
}
}
this.items = newArray;
this.head = 0;
this.tail = (this.count == capacity) ? 0 : this.count;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DashStyle.cs
- Schema.cs
- OleDbCommandBuilder.cs
- DataControlField.cs
- Journal.cs
- ServiceAuthorizationElement.cs
- Point3DValueSerializer.cs
- ValidationHelpers.cs
- TemplateXamlParser.cs
- FunctionMappingTranslator.cs
- DefaultProxySection.cs
- BrowserDefinitionCollection.cs
- keycontainerpermission.cs
- HwndAppCommandInputProvider.cs
- KnownBoxes.cs
- SyntaxCheck.cs
- TargetControlTypeCache.cs
- ContentElement.cs
- DataConnectionHelper.cs
- StreamGeometryContext.cs
- XPathItem.cs
- ListViewItem.cs
- GeneratedContractType.cs
- X500Name.cs
- DateTimeValueSerializerContext.cs
- TextSearch.cs
- XmlDictionaryReaderQuotasElement.cs
- UInt64Converter.cs
- SynchronizedDispatch.cs
- CharacterMetrics.cs
- MatrixAnimationUsingPath.cs
- DocumentsTrace.cs
- UiaCoreProviderApi.cs
- TextCompositionManager.cs
- DataGridCellEditEndingEventArgs.cs
- AppAction.cs
- SizeChangedInfo.cs
- CharAnimationUsingKeyFrames.cs
- EntitySetRetriever.cs
- FrameworkEventSource.cs
- BinaryObjectWriter.cs
- QueryStringConverter.cs
- EditorPart.cs
- WasNotInstalledException.cs
- XPathNavigator.cs
- GridLengthConverter.cs
- DmlSqlGenerator.cs
- ExtensionFile.cs
- EntityAdapter.cs
- DocumentCollection.cs
- DataControlFieldCell.cs
- InvokePattern.cs
- ToolBarOverflowPanel.cs
- WeakHashtable.cs
- ArgumentOutOfRangeException.cs
- DataGridViewLayoutData.cs
- Helper.cs
- TableLayoutPanelDesigner.cs
- SessionIDManager.cs
- MetadataItem.cs
- WebPartManagerInternals.cs
- ConstraintConverter.cs
- StringPropertyBuilder.cs
- wgx_render.cs
- SafeCryptContextHandle.cs
- StyleSheetDesigner.cs
- CompiledELinqQueryState.cs
- MimeWriter.cs
- XmlSortKeyAccumulator.cs
- InputReferenceExpression.cs
- FormsAuthentication.cs
- XmlDeclaration.cs
- WriteableBitmap.cs
- Pointer.cs
- Mouse.cs
- Axis.cs
- MemoryStream.cs
- DesignerForm.cs
- AdornedElementPlaceholder.cs
- EncodingNLS.cs
- WebRequestModuleElementCollection.cs
- PrintingPermissionAttribute.cs
- PassportAuthentication.cs
- CapabilitiesRule.cs
- QuaternionAnimationBase.cs
- ListView.cs
- MenuAdapter.cs
- DataGridViewCellPaintingEventArgs.cs
- ComponentTray.cs
- PreviewPrintController.cs
- AttachedAnnotationChangedEventArgs.cs
- WebPartConnectionsCloseVerb.cs
- PathNode.cs
- ProviderUtil.cs
- BinaryWriter.cs
- HttpHandlerActionCollection.cs
- OpenTypeCommon.cs
- FileDetails.cs
- ProfileSection.cs
- securitycriticaldataformultiplegetandset.cs