Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Framework / System / Windows / Markup / XamlInt32CollectionSerializer.cs / 2 / XamlInt32CollectionSerializer.cs
//---------------------------------------------------------------------------- // // File: XamlInt32CollectionSerializer.cs // // Description: // XamlSerializer used to persist collections of integer indices in Baml // // Copyright (C) 2006 by Microsoft Corporation. All rights reserved. // //--------------------------------------------------------------------------- using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; using System.Diagnostics; using System.Globalization; using System.IO; using System.Xml; using MS.Utility; using MS.Internal; #if PBTCOMPILER using System.Reflection; using System.Collections.Generic; using TypeConverterHelper = MS.Internal.Markup.TypeConverterHelper; namespace MS.Internal.Markup #else using System.Windows; using System.Windows.Media; using System.Windows.Media.Media3D; using MS.Internal.Media; using TypeConverterHelper = System.Windows.Markup.TypeConverterHelper; namespace System.Windows.Markup #endif { ////// XamlInt32CollectionSerializer is used to persist collections of integer indices in Baml /// internal class XamlInt32CollectionSerializer : XamlSerializer { // // Internal only class. // We actually create a class here - to avoid jitting for use of struct/value type // #if PBTCOMPILER internal class IntegerMarkup { internal IntegerMarkup( int value) { _value = value; } internal int Value { get { return _value; } } int _value; } #endif #region Construction ////// Constructor for XamlInt32CollectionSerializer /// public XamlInt32CollectionSerializer() { } #endregion Construction #region Conversions ////// Convert a string into a compact binary representation and write it out /// to the passed BinaryWriter. /// public override bool ConvertStringToCustomBinary ( BinaryWriter writer, // Writer into the baml stream string stringValue) // String to convert { #if PBTCOMPILER Listints = Parse( stringValue); #else Int32Collection ints = Int32Collection.Parse( stringValue ); #endif int cur, last , count, max = 0 ; count = ints.Count ; // loop through the collection testing for // if the numbers are consecutive, and what's the max. bool consecutive = true; bool allPositive = true ; for ( int i = 1; i < count; i++) { #if PBTCOMPILER last = ints[i-1].Value; cur = ints[i].Value; #else last = ints.Internal_GetItem(i-1); cur = ints.Internal_GetItem(i); #endif if ( consecutive && ( last + 1 != cur )) { consecutive = false; } // // If any number is negative - we will just use Integer type. // // We could handle this by encoding the min/max and creating a different number of bit encoding. // For now - we're seeing enough gains with this change. // if ( cur < 0 ) { allPositive = false ; } if ( cur > max ) { max = cur; } } if ( consecutive ) { writer.Write( (byte) IntegerCollectionType.Consecutive ); writer.Write( count ); // Write the count // Write the first number. #if PBTCOMPILER writer.Write( ints[0].Value ); #else writer.Write( ints.Internal_GetItem(0)); #endif } else { IntegerCollectionType type; if ( allPositive && max <= 255 ) { type = IntegerCollectionType.Byte; } else if ( allPositive && max <= UInt16.MaxValue ) { type = IntegerCollectionType.UShort; } else { type = IntegerCollectionType.Integer; } writer.Write( (byte) type ); writer.Write( count ); // Write the count switch( type ) { case IntegerCollectionType.Byte: { for( int i = 0; i < count; i++ ) { writer.Write( (byte) #if PBTCOMPILER ints[i].Value #else ints.Internal_GetItem(i) #endif ) ; } } break; case IntegerCollectionType.UShort: { for( int i = 0; i < count; i++ ) { writer.Write( (ushort) #if PBTCOMPILER ints[i].Value #else ints.Internal_GetItem(i) #endif ); } } break; case IntegerCollectionType.Integer: { for( int i = 0; i < count; i++ ) { writer.Write( #if PBTCOMPILER ints[i].Value #else ints.Internal_GetItem(i) #endif ); } } break; } } return true; } #if PBTCOMPILER public static List Parse(string source) { IFormatProvider formatProvider = TypeConverterHelper.EnglishUSCulture; TokenizerHelper th = new TokenizerHelper(source, formatProvider); List resource = new List (); int value; while (th.NextToken()) { value = Convert.ToInt32(th.GetCurrentToken(), formatProvider); resource.Add( new IntegerMarkup(value) ); } return resource; } #endif #if !PBTCOMPILER /// /// Convert a compact binary representation of a collection /// into a Point3DCollection into and instance /// ////// This is called ONLY from the Parser and is not a general public method. /// public override object ConvertCustomBinaryToObject( BinaryReader reader) { return DeserializeFrom( reader ); } ////// Convert a compact binary representation of a collection /// into a Point3DCollection into and instance /// ////// This is called ONLY from the Parser and is not a general public method. /// public static object StaticConvertCustomBinaryToObject( BinaryReader reader) { return DeserializeFrom( reader ); } private static Int32Collection DeserializeFrom( BinaryReader reader ) { Int32Collection theCollection; IntegerCollectionType type; type = (IntegerCollectionType) reader.ReadByte(); int count = reader.ReadInt32(); if ( count < 0 ) { throw new ArgumentException(SR.Get(SRID.IntegerCollectionLengthLessThanZero)); } theCollection = new Int32Collection( count ); if ( type == IntegerCollectionType.Consecutive ) { // Get the first integer int first = reader.ReadInt32(); for( int i = 0; i < count; i ++) { theCollection.Add( first + i ); } } else { switch( type ) { case IntegerCollectionType.Byte : { for ( int i = 0; i < count; i++ ) { theCollection.Add( (int) reader.ReadByte()); } } break; case IntegerCollectionType.UShort : { for ( int i = 0; i < count; i++ ) { theCollection.Add( (int) reader.ReadUInt16()); } } break; case IntegerCollectionType.Integer : { for ( int i = 0; i < count; i++ ) { int value = reader.ReadInt32(); theCollection.Add( value); } } break; default: throw new ArgumentException(SR.Get(SRID.UnknownIndexType)); } } return theCollection; } #endif #endregion Conversions internal enum IntegerCollectionType : byte { Unknown = 0, Consecutive = 1, Byte = 2, UShort= 3, Integer= 4 } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // // File: XamlInt32CollectionSerializer.cs // // Description: // XamlSerializer used to persist collections of integer indices in Baml // // Copyright (C) 2006 by Microsoft Corporation. All rights reserved. // //--------------------------------------------------------------------------- using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; using System.Diagnostics; using System.Globalization; using System.IO; using System.Xml; using MS.Utility; using MS.Internal; #if PBTCOMPILER using System.Reflection; using System.Collections.Generic; using TypeConverterHelper = MS.Internal.Markup.TypeConverterHelper; namespace MS.Internal.Markup #else using System.Windows; using System.Windows.Media; using System.Windows.Media.Media3D; using MS.Internal.Media; using TypeConverterHelper = System.Windows.Markup.TypeConverterHelper; namespace System.Windows.Markup #endif { ////// XamlInt32CollectionSerializer is used to persist collections of integer indices in Baml /// internal class XamlInt32CollectionSerializer : XamlSerializer { // // Internal only class. // We actually create a class here - to avoid jitting for use of struct/value type // #if PBTCOMPILER internal class IntegerMarkup { internal IntegerMarkup( int value) { _value = value; } internal int Value { get { return _value; } } int _value; } #endif #region Construction ////// Constructor for XamlInt32CollectionSerializer /// public XamlInt32CollectionSerializer() { } #endregion Construction #region Conversions ////// Convert a string into a compact binary representation and write it out /// to the passed BinaryWriter. /// public override bool ConvertStringToCustomBinary ( BinaryWriter writer, // Writer into the baml stream string stringValue) // String to convert { #if PBTCOMPILER Listints = Parse( stringValue); #else Int32Collection ints = Int32Collection.Parse( stringValue ); #endif int cur, last , count, max = 0 ; count = ints.Count ; // loop through the collection testing for // if the numbers are consecutive, and what's the max. bool consecutive = true; bool allPositive = true ; for ( int i = 1; i < count; i++) { #if PBTCOMPILER last = ints[i-1].Value; cur = ints[i].Value; #else last = ints.Internal_GetItem(i-1); cur = ints.Internal_GetItem(i); #endif if ( consecutive && ( last + 1 != cur )) { consecutive = false; } // // If any number is negative - we will just use Integer type. // // We could handle this by encoding the min/max and creating a different number of bit encoding. // For now - we're seeing enough gains with this change. // if ( cur < 0 ) { allPositive = false ; } if ( cur > max ) { max = cur; } } if ( consecutive ) { writer.Write( (byte) IntegerCollectionType.Consecutive ); writer.Write( count ); // Write the count // Write the first number. #if PBTCOMPILER writer.Write( ints[0].Value ); #else writer.Write( ints.Internal_GetItem(0)); #endif } else { IntegerCollectionType type; if ( allPositive && max <= 255 ) { type = IntegerCollectionType.Byte; } else if ( allPositive && max <= UInt16.MaxValue ) { type = IntegerCollectionType.UShort; } else { type = IntegerCollectionType.Integer; } writer.Write( (byte) type ); writer.Write( count ); // Write the count switch( type ) { case IntegerCollectionType.Byte: { for( int i = 0; i < count; i++ ) { writer.Write( (byte) #if PBTCOMPILER ints[i].Value #else ints.Internal_GetItem(i) #endif ) ; } } break; case IntegerCollectionType.UShort: { for( int i = 0; i < count; i++ ) { writer.Write( (ushort) #if PBTCOMPILER ints[i].Value #else ints.Internal_GetItem(i) #endif ); } } break; case IntegerCollectionType.Integer: { for( int i = 0; i < count; i++ ) { writer.Write( #if PBTCOMPILER ints[i].Value #else ints.Internal_GetItem(i) #endif ); } } break; } } return true; } #if PBTCOMPILER public static List Parse(string source) { IFormatProvider formatProvider = TypeConverterHelper.EnglishUSCulture; TokenizerHelper th = new TokenizerHelper(source, formatProvider); List resource = new List (); int value; while (th.NextToken()) { value = Convert.ToInt32(th.GetCurrentToken(), formatProvider); resource.Add( new IntegerMarkup(value) ); } return resource; } #endif #if !PBTCOMPILER /// /// Convert a compact binary representation of a collection /// into a Point3DCollection into and instance /// ////// This is called ONLY from the Parser and is not a general public method. /// public override object ConvertCustomBinaryToObject( BinaryReader reader) { return DeserializeFrom( reader ); } ////// Convert a compact binary representation of a collection /// into a Point3DCollection into and instance /// ////// This is called ONLY from the Parser and is not a general public method. /// public static object StaticConvertCustomBinaryToObject( BinaryReader reader) { return DeserializeFrom( reader ); } private static Int32Collection DeserializeFrom( BinaryReader reader ) { Int32Collection theCollection; IntegerCollectionType type; type = (IntegerCollectionType) reader.ReadByte(); int count = reader.ReadInt32(); if ( count < 0 ) { throw new ArgumentException(SR.Get(SRID.IntegerCollectionLengthLessThanZero)); } theCollection = new Int32Collection( count ); if ( type == IntegerCollectionType.Consecutive ) { // Get the first integer int first = reader.ReadInt32(); for( int i = 0; i < count; i ++) { theCollection.Add( first + i ); } } else { switch( type ) { case IntegerCollectionType.Byte : { for ( int i = 0; i < count; i++ ) { theCollection.Add( (int) reader.ReadByte()); } } break; case IntegerCollectionType.UShort : { for ( int i = 0; i < count; i++ ) { theCollection.Add( (int) reader.ReadUInt16()); } } break; case IntegerCollectionType.Integer : { for ( int i = 0; i < count; i++ ) { int value = reader.ReadInt32(); theCollection.Add( value); } } break; default: throw new ArgumentException(SR.Get(SRID.UnknownIndexType)); } } return theCollection; } #endif #endregion Conversions internal enum IntegerCollectionType : byte { Unknown = 0, Consecutive = 1, Byte = 2, UShort= 3, Integer= 4 } } } // 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
- Stackframe.cs
- WizardPanelChangingEventArgs.cs
- SkewTransform.cs
- DirectoryNotFoundException.cs
- StyleSheetDesigner.cs
- DoubleCollection.cs
- DataRecordInfo.cs
- BaseCollection.cs
- SolidBrush.cs
- RouteValueDictionary.cs
- SqlExpander.cs
- Rectangle.cs
- IFlowDocumentViewer.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- InternalRelationshipCollection.cs
- OverrideMode.cs
- WebScriptMetadataMessageEncoderFactory.cs
- EpmSourceTree.cs
- RtType.cs
- ProgressBarAutomationPeer.cs
- MetadataExchangeClient.cs
- SmiEventSink.cs
- SqlClientWrapperSmiStreamChars.cs
- ColorDialog.cs
- SqlTypeConverter.cs
- ControlPaint.cs
- SiteOfOriginContainer.cs
- KeySpline.cs
- ContentHostHelper.cs
- X509Certificate2.cs
- CustomAttributeBuilder.cs
- ECDiffieHellmanCng.cs
- InputProcessorProfiles.cs
- Matrix3DValueSerializer.cs
- HttpModulesInstallComponent.cs
- SimpleFileLog.cs
- BaseDataListDesigner.cs
- _BaseOverlappedAsyncResult.cs
- DataRowComparer.cs
- XmlSchemaInclude.cs
- HMAC.cs
- SqlSelectClauseBuilder.cs
- ClearTypeHintValidation.cs
- Sequence.cs
- GlyphElement.cs
- ToolStripItemEventArgs.cs
- HandleExceptionArgs.cs
- UpWmlPageAdapter.cs
- EventDescriptorCollection.cs
- XmlObjectSerializerReadContextComplexJson.cs
- FilterFactory.cs
- HttpHeaderCollection.cs
- WebMethodAttribute.cs
- EmptyEnumerable.cs
- X500Name.cs
- UIElementParagraph.cs
- HttpRuntimeSection.cs
- ExtensionQuery.cs
- FontWeightConverter.cs
- ApplicationActivator.cs
- WindowsButton.cs
- ComponentCollection.cs
- OAVariantLib.cs
- XPathNavigatorReader.cs
- XmlBoundElement.cs
- MessageTransmitTraceRecord.cs
- Tablet.cs
- InfoCardAsymmetricCrypto.cs
- WriteFileContext.cs
- DataRowExtensions.cs
- ArraySortHelper.cs
- ContainerFilterService.cs
- NetworkInformationPermission.cs
- OleDbCommand.cs
- XmlSchemaAttributeGroupRef.cs
- WebEventCodes.cs
- DataServiceClientException.cs
- IdentityModelDictionary.cs
- AutomationPeer.cs
- returneventsaver.cs
- DetailsViewCommandEventArgs.cs
- FtpRequestCacheValidator.cs
- StringCollection.cs
- WebPartConnectionCollection.cs
- ApplicationBuildProvider.cs
- CodeSnippetExpression.cs
- _SslState.cs
- CorrelationTokenTypeConvertor.cs
- ISAPIRuntime.cs
- UIElement3D.cs
- UrlMappingsSection.cs
- XmlSerializer.cs
- ConfigurationFileMap.cs
- GroupBoxRenderer.cs
- NonBatchDirectoryCompiler.cs
- TextView.cs
- Tool.cs
- PartBasedPackageProperties.cs
- GeneratedContractType.cs
- Aggregates.cs