Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Common / Utils / Helpers.cs / 3 / Helpers.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Globalization; using System.Diagnostics; namespace System.Data.Common.Utils { // Miscellaneous helper routines internal static class Helpers { #region Trace methods // effects: Trace args according to the CLR format string with a new line internal static void FormatTraceLine(string format, params object[] args) { Trace.WriteLine(String.Format(CultureInfo.InvariantCulture, format, args)); } // effects: Trace the string with a new line internal static void StringTrace(string arg) { Trace.Write(arg); } // effects: Trace the string without adding a new line internal static void StringTraceLine(string arg) { Trace.WriteLine(arg); } #endregion #region Misc Helpers // effects: compares two sets using the given comparer - removes // duplicates if they exist internal static bool IsSetEqual(IEnumerable list1, IEnumerable list2, IEqualityComparer comparer) { Set set1 = new Set (list1, comparer); Set set2 = new Set (list2, comparer); return set1.SetEquals(set2); } // effects: Given a stream of values of type "SubType", returns a // stream of values of type "SuperType" where SuperType is a // superclass/supertype of SubType internal static IEnumerable AsSuperTypeList (IEnumerable values) where SubType : SuperType { foreach (SubType value in values) { yield return value; } } /// /// Builds a balanced binary tree with the specified nodes as leaves. /// Note that the current elements of ///MAY be overwritten /// as the leaves are combined to produce the tree. /// The type of each node in the tree /// The leaf nodes to combine into an balanced binary tree /// A function that produces a new node that is the combination of the two specified argument nodes ///The single node that is the root of the balanced binary tree internal static TNode BuildBalancedTreeInPlace(IList nodes, Func combinator) { EntityUtil.CheckArgumentNull(nodes, "nodes"); EntityUtil.CheckArgumentNull(combinator, "combinator"); Debug.Assert(nodes.Count > 0, "At least one node is required"); // If only one node is present, return the single node. if (nodes.Count == 1) { return nodes[0]; } // For the two-node case, simply combine the two nodes and return the result. if (nodes.Count == 2) { return combinator(nodes[0], nodes[1]); } // // Build the balanced tree in a bottom-up fashion. // On each iteration, an even number of nodes are paired off using the // combinator function, reducing the total number of available leaf nodes // by half each time. If the number of nodes in an iteration is not even, // the 'last' node in the set is omitted, then combined with the last pair // that is produced. // Nodes are collected from left to right with newly combined nodes overwriting // nodes from the previous iteration that have already been consumed (as can // be seen by 'writePos' lagging 'readPos' in the main statement of the loop below). // When a single available leaf node remains, this node is the root of the // balanced binary tree and can be returned to the caller. // int nodesToPair = nodes.Count; while (nodesToPair != 1) { bool combineModulo = ((nodesToPair & 0x1) == 1); if (combineModulo) { nodesToPair--; } int writePos = 0; for (int readPos = 0; readPos < nodesToPair; readPos += 2) { nodes[writePos++] = combinator(nodes[readPos], nodes[readPos + 1]); } if (combineModulo) { int updatePos = writePos - 1; nodes[updatePos] = combinator(nodes[updatePos], nodes[nodesToPair]); } nodesToPair /= 2; } return nodes[0]; } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Globalization; using System.Diagnostics; namespace System.Data.Common.Utils { // Miscellaneous helper routines internal static class Helpers { #region Trace methods // effects: Trace args according to the CLR format string with a new line internal static void FormatTraceLine(string format, params object[] args) { Trace.WriteLine(String.Format(CultureInfo.InvariantCulture, format, args)); } // effects: Trace the string with a new line internal static void StringTrace(string arg) { Trace.Write(arg); } // effects: Trace the string without adding a new line internal static void StringTraceLine(string arg) { Trace.WriteLine(arg); } #endregion #region Misc Helpers // effects: compares two sets using the given comparer - removes // duplicates if they exist internal static bool IsSetEqual(IEnumerable list1, IEnumerable list2, IEqualityComparer comparer) { Set set1 = new Set (list1, comparer); Set set2 = new Set (list2, comparer); return set1.SetEquals(set2); } // effects: Given a stream of values of type "SubType", returns a // stream of values of type "SuperType" where SuperType is a // superclass/supertype of SubType internal static IEnumerable AsSuperTypeList (IEnumerable values) where SubType : SuperType { foreach (SubType value in values) { yield return value; } } /// /// Builds a balanced binary tree with the specified nodes as leaves. /// Note that the current elements of ///MAY be overwritten /// as the leaves are combined to produce the tree. /// The type of each node in the tree /// The leaf nodes to combine into an balanced binary tree /// A function that produces a new node that is the combination of the two specified argument nodes ///The single node that is the root of the balanced binary tree internal static TNode BuildBalancedTreeInPlace(IList nodes, Func combinator) { EntityUtil.CheckArgumentNull(nodes, "nodes"); EntityUtil.CheckArgumentNull(combinator, "combinator"); Debug.Assert(nodes.Count > 0, "At least one node is required"); // If only one node is present, return the single node. if (nodes.Count == 1) { return nodes[0]; } // For the two-node case, simply combine the two nodes and return the result. if (nodes.Count == 2) { return combinator(nodes[0], nodes[1]); } // // Build the balanced tree in a bottom-up fashion. // On each iteration, an even number of nodes are paired off using the // combinator function, reducing the total number of available leaf nodes // by half each time. If the number of nodes in an iteration is not even, // the 'last' node in the set is omitted, then combined with the last pair // that is produced. // Nodes are collected from left to right with newly combined nodes overwriting // nodes from the previous iteration that have already been consumed (as can // be seen by 'writePos' lagging 'readPos' in the main statement of the loop below). // When a single available leaf node remains, this node is the root of the // balanced binary tree and can be returned to the caller. // int nodesToPair = nodes.Count; while (nodesToPair != 1) { bool combineModulo = ((nodesToPair & 0x1) == 1); if (combineModulo) { nodesToPair--; } int writePos = 0; for (int readPos = 0; readPos < nodesToPair; readPos += 2) { nodes[writePos++] = combinator(nodes[readPos], nodes[readPos + 1]); } if (combineModulo) { int updatePos = writePos - 1; nodes[updatePos] = combinator(nodes[updatePos], nodes[nodesToPair]); } nodesToPair /= 2; } return nodes[0]; } #endregion } } // 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
- ContentPlaceHolder.cs
- QuaternionIndependentAnimationStorage.cs
- QilTargetType.cs
- TabItemAutomationPeer.cs
- XmlSchemaRedefine.cs
- SoapHeader.cs
- RemotingServices.cs
- Matrix3DConverter.cs
- IIS7UserPrincipal.cs
- ResourceDictionary.cs
- ViewRendering.cs
- MessageAction.cs
- PartialTrustVisibleAssemblyCollection.cs
- ComplexPropertyEntry.cs
- HMACSHA512.cs
- SeekStoryboard.cs
- CmsInterop.cs
- TemplatedMailWebEventProvider.cs
- InstanceOwner.cs
- StorageRoot.cs
- FontDifferentiator.cs
- ActivityStateQuery.cs
- UnsafeNativeMethods.cs
- ListViewSortEventArgs.cs
- TreeNode.cs
- GridViewHeaderRowPresenter.cs
- BoundingRectTracker.cs
- DetailsViewPageEventArgs.cs
- CodeVariableDeclarationStatement.cs
- columnmapkeybuilder.cs
- GridLength.cs
- ReachDocumentPageSerializer.cs
- SharedStream.cs
- MissingManifestResourceException.cs
- ICspAsymmetricAlgorithm.cs
- DesignerAdapterAttribute.cs
- LayoutEditorPart.cs
- CodeIdentifiers.cs
- AppSecurityManager.cs
- EmbeddedMailObject.cs
- CellParagraph.cs
- FixedMaxHeap.cs
- ThousandthOfEmRealPoints.cs
- BezierSegment.cs
- DataGridViewAutoSizeModeEventArgs.cs
- AttributeEmitter.cs
- WindowsImpersonationContext.cs
- QualifiedCellIdBoolean.cs
- SoapHeaderAttribute.cs
- ListViewAutomationPeer.cs
- SafeLibraryHandle.cs
- Logging.cs
- HandlerBase.cs
- QilExpression.cs
- NodeLabelEditEvent.cs
- DropShadowEffect.cs
- BindingNavigator.cs
- SerializerProvider.cs
- BatchServiceHost.cs
- RSAOAEPKeyExchangeFormatter.cs
- HtmlAnchor.cs
- SHA384.cs
- XMLSchema.cs
- UserControl.cs
- ListViewCommandEventArgs.cs
- SqlGatherConsumedAliases.cs
- HierarchicalDataSourceDesigner.cs
- SqlXml.cs
- RenderingBiasValidation.cs
- XmlTypeAttribute.cs
- prompt.cs
- HtmlForm.cs
- MergablePropertyAttribute.cs
- PrefixHandle.cs
- AttachedPropertyBrowsableForTypeAttribute.cs
- RelationshipType.cs
- HandlerBase.cs
- DoubleConverter.cs
- RuntimeResourceSet.cs
- WriteableOnDemandPackagePart.cs
- FixedHyperLink.cs
- PanningMessageFilter.cs
- OutputCacheSettings.cs
- SchemaEntity.cs
- GridItemPattern.cs
- SmtpReplyReader.cs
- StylusLogic.cs
- ScopeCompiler.cs
- MSAAWinEventWrap.cs
- RootDesignerSerializerAttribute.cs
- Stacktrace.cs
- WhiteSpaceTrimStringConverter.cs
- glyphs.cs
- WindowsAuthenticationModule.cs
- ProvideValueServiceProvider.cs
- x509utils.cs
- COM2IDispatchConverter.cs
- AssertHelper.cs
- TextCompositionEventArgs.cs
- DataServiceQuery.cs