Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Speech / Src / Internal / GrammarBuilding / BuilderElements.cs / 1 / BuilderElements.cs
//------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Speech.Recognition;
using System.Speech.Internal.SrgsParser;
using System.Text;
namespace System.Speech.Internal.GrammarBuilding
{
///
///
///
#if VSCOMPILE
[DebuggerDisplay ("{DebugSummary}")]
#endif
internal abstract class BuilderElements : GrammarBuilderBase
{
//*******************************************************************
//
// Constructors
//
//*******************************************************************
#region Constructors
///
///
///
internal BuilderElements ()
{
}
#endregion
//********************************************************************
//
// Public Methods
//
//*******************************************************************
#region Public Methods
/// TODOC
public override bool Equals (object obj)
{
BuilderElements refObj = obj as BuilderElements;
if (refObj == null)
{
return false;
}
// Easy out if the number of elements do not match
if (refObj.Count != Count || refObj.Items.Count != Items.Count)
{
return false;
}
// Deep recursive search for equality
for (int i = 0; i < Items.Count; i++)
{
if (!Items [i].Equals (refObj.Items [i]))
{
return false;
}
}
return true;
}
/// TODOC <_include file='doc\SpeechAudioFormatInfo.uex' path='docs/doc[@for="SpeechAudioFormatInfo.GetHashCode"]/*' />
public override int GetHashCode ()
{
return base.GetHashCode ();
}
#endregion
//********************************************************************
//
// Protected Methods
//
//********************************************************************
#region Internal Methods
///
/// Optimization for a element tree
///
///
protected void Optimize (Collection newRules)
{
// Create an dictionary of [Count of elements, list of elements]
SortedDictionary> dict = new SortedDictionary> ();
GetDictionaryElements (dict);
// The dictionary is sorted from the smallest buckets to the largest.
// Revert the order in the keys arrays
int [] keys = new int [dict.Keys.Count];
int index = keys.Length - 1;
foreach (int key in dict.Keys)
{
keys [index--] = key;
}
// Look for each bucket from the largest to the smallest
for (int i = 0; i < keys.Length && keys [i] >= 3; i++)
{
Collection gb = dict [keys [i]];
for (int j = 0; j < gb.Count; j++)
{
RuleElement newRule = null;
RuleRefElement ruleRef = null;
for (int k = j + 1; k < gb.Count; k++)
{
if (gb [j] != null && gb [j].Equals (gb [k]))
{
BuilderElements current = gb [k];
BuilderElements parent = current.Parent;
if (current is SemanticKeyElement)
// if current is already a ruleref. There is no need to create a new one
{
// Simply set the ruleref of the current element to the ruleref of the org element.
parent.Items [parent.Items.IndexOf (current)] = gb [j];
}
else
{
// Create a rule to store the common elemts
if (newRule == null)
{
newRule = new RuleElement (current, "_");
newRules.Add (newRule);
}
// Create a ruleref and attach the
if (ruleRef == null)
{
ruleRef = new RuleRefElement (newRule);
gb [j].Parent.Items [gb [j].Parent.Items.IndexOf (gb [j])] = ruleRef;
}
parent.Items [current.Parent.Items.IndexOf (current)] = ruleRef;
}
//
current.RemoveDictionaryElements (dict);
gb [k] = null;
}
}
}
}
}
#endregion
//*******************************************************************
//
// Internal Methods
//
//********************************************************************
#region Internal Methods
///
///
///
///
internal void Add (string phrase)
{
_items.Add (new GrammarBuilderPhrase (phrase));
}
///
///
///
///
internal void Add (GrammarBuilder builder)
{
foreach (GrammarBuilderBase item in builder.InternalBuilder.Items)
{
_items.Add (item);
}
}
///
///
///
///
internal void Add (GrammarBuilderBase item)
{
_items.Add (item);
}
///
///
///
///
///
internal void CloneItems (BuilderElements builders)
{
foreach (GrammarBuilderBase item in builders.Items)
{
_items.Add (item);
}
}
///
///
///
///
///
///
///
internal void CreateChildrenElements (IElementFactory elementFactory, IRule parent, IdentifierCollection ruleIds)
{
foreach (GrammarBuilderBase buider in Items)
{
IElement element = buider.CreateElement (elementFactory, parent, parent, ruleIds);
if (element != null)
{
element.PostParse (parent);
elementFactory.AddElement (parent, element);
}
}
}
///
///
///
///
///
///
///
///
internal void CreateChildrenElements (IElementFactory elementFactory, IItem parent, IRule rule, IdentifierCollection ruleIds)
{
foreach (GrammarBuilderBase buider in Items)
{
IElement element = buider.CreateElement (elementFactory, parent, rule, ruleIds);
if (element != null)
{
element.PostParse (parent);
elementFactory.AddElement (parent, element);
}
}
}
///
///
///
///
internal override int CalcCount (BuilderElements parent)
{
base.CalcCount (parent);
int c = 1;
foreach (GrammarBuilderBase item in Items)
{
c += item.CalcCount (this);
}
Count = c;
return c;
}
#endregion
//*******************************************************************
//
// Internal Properties
//
//*******************************************************************
#region Internal Properties
internal List Items
{
get
{
return _items;
}
}
override internal string DebugSummary
{
get
{
StringBuilder sb = new StringBuilder ();
foreach (GrammarBuilderBase item in _items)
{
if (sb.Length > 0)
{
sb.Append (" ");
}
sb.Append (item.DebugSummary);
}
return sb.ToString ();
}
}
#endregion
//*******************************************************************
//
// Private Method
//
//********************************************************************
#region Private Method
private void GetDictionaryElements (SortedDictionary> dict)
{
// Recursive search from a matching subtree
foreach (GrammarBuilderBase item in Items)
{
BuilderElements current = item as BuilderElements;
// Go deeper if the number of children is greater the element to compare against.
if (current != null)
{
if (!dict.ContainsKey (current.Count))
{
dict.Add (current.Count, new Collection ());
}
dict [current.Count].Add (current);
current.GetDictionaryElements (dict);
}
}
}
private void RemoveDictionaryElements (SortedDictionary> dict)
{
// Recursive search from a matching subtree
foreach (GrammarBuilderBase item in Items)
{
BuilderElements current = item as BuilderElements;
// Go deeper if the number of children is greater the element to compare against.
if (current != null)
{
// Recursively remove all elements
current.RemoveDictionaryElements (dict);
dict [current.Count].Remove (current);
}
}
}
#endregion
//*******************************************************************
//
// Private Fields
//
//********************************************************************
#region Private Fields
// List of builder elements
private readonly List _items = new List ();
#endregion
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Speech.Recognition;
using System.Speech.Internal.SrgsParser;
using System.Text;
namespace System.Speech.Internal.GrammarBuilding
{
///
///
///
#if VSCOMPILE
[DebuggerDisplay ("{DebugSummary}")]
#endif
internal abstract class BuilderElements : GrammarBuilderBase
{
//*******************************************************************
//
// Constructors
//
//*******************************************************************
#region Constructors
///
///
///
internal BuilderElements ()
{
}
#endregion
//********************************************************************
//
// Public Methods
//
//*******************************************************************
#region Public Methods
/// TODOC
public override bool Equals (object obj)
{
BuilderElements refObj = obj as BuilderElements;
if (refObj == null)
{
return false;
}
// Easy out if the number of elements do not match
if (refObj.Count != Count || refObj.Items.Count != Items.Count)
{
return false;
}
// Deep recursive search for equality
for (int i = 0; i < Items.Count; i++)
{
if (!Items [i].Equals (refObj.Items [i]))
{
return false;
}
}
return true;
}
/// TODOC <_include file='doc\SpeechAudioFormatInfo.uex' path='docs/doc[@for="SpeechAudioFormatInfo.GetHashCode"]/*' />
public override int GetHashCode ()
{
return base.GetHashCode ();
}
#endregion
//********************************************************************
//
// Protected Methods
//
//********************************************************************
#region Internal Methods
///
/// Optimization for a element tree
///
///
protected void Optimize (Collection newRules)
{
// Create an dictionary of [Count of elements, list of elements]
SortedDictionary> dict = new SortedDictionary> ();
GetDictionaryElements (dict);
// The dictionary is sorted from the smallest buckets to the largest.
// Revert the order in the keys arrays
int [] keys = new int [dict.Keys.Count];
int index = keys.Length - 1;
foreach (int key in dict.Keys)
{
keys [index--] = key;
}
// Look for each bucket from the largest to the smallest
for (int i = 0; i < keys.Length && keys [i] >= 3; i++)
{
Collection gb = dict [keys [i]];
for (int j = 0; j < gb.Count; j++)
{
RuleElement newRule = null;
RuleRefElement ruleRef = null;
for (int k = j + 1; k < gb.Count; k++)
{
if (gb [j] != null && gb [j].Equals (gb [k]))
{
BuilderElements current = gb [k];
BuilderElements parent = current.Parent;
if (current is SemanticKeyElement)
// if current is already a ruleref. There is no need to create a new one
{
// Simply set the ruleref of the current element to the ruleref of the org element.
parent.Items [parent.Items.IndexOf (current)] = gb [j];
}
else
{
// Create a rule to store the common elemts
if (newRule == null)
{
newRule = new RuleElement (current, "_");
newRules.Add (newRule);
}
// Create a ruleref and attach the
if (ruleRef == null)
{
ruleRef = new RuleRefElement (newRule);
gb [j].Parent.Items [gb [j].Parent.Items.IndexOf (gb [j])] = ruleRef;
}
parent.Items [current.Parent.Items.IndexOf (current)] = ruleRef;
}
//
current.RemoveDictionaryElements (dict);
gb [k] = null;
}
}
}
}
}
#endregion
//*******************************************************************
//
// Internal Methods
//
//********************************************************************
#region Internal Methods
///
///
///
///
internal void Add (string phrase)
{
_items.Add (new GrammarBuilderPhrase (phrase));
}
///
///
///
///
internal void Add (GrammarBuilder builder)
{
foreach (GrammarBuilderBase item in builder.InternalBuilder.Items)
{
_items.Add (item);
}
}
///
///
///
///
internal void Add (GrammarBuilderBase item)
{
_items.Add (item);
}
///
///
///
///
///
internal void CloneItems (BuilderElements builders)
{
foreach (GrammarBuilderBase item in builders.Items)
{
_items.Add (item);
}
}
///
///
///
///
///
///
///
internal void CreateChildrenElements (IElementFactory elementFactory, IRule parent, IdentifierCollection ruleIds)
{
foreach (GrammarBuilderBase buider in Items)
{
IElement element = buider.CreateElement (elementFactory, parent, parent, ruleIds);
if (element != null)
{
element.PostParse (parent);
elementFactory.AddElement (parent, element);
}
}
}
///
///
///
///
///
///
///
///
internal void CreateChildrenElements (IElementFactory elementFactory, IItem parent, IRule rule, IdentifierCollection ruleIds)
{
foreach (GrammarBuilderBase buider in Items)
{
IElement element = buider.CreateElement (elementFactory, parent, rule, ruleIds);
if (element != null)
{
element.PostParse (parent);
elementFactory.AddElement (parent, element);
}
}
}
///
///
///
///
internal override int CalcCount (BuilderElements parent)
{
base.CalcCount (parent);
int c = 1;
foreach (GrammarBuilderBase item in Items)
{
c += item.CalcCount (this);
}
Count = c;
return c;
}
#endregion
//*******************************************************************
//
// Internal Properties
//
//*******************************************************************
#region Internal Properties
internal List Items
{
get
{
return _items;
}
}
override internal string DebugSummary
{
get
{
StringBuilder sb = new StringBuilder ();
foreach (GrammarBuilderBase item in _items)
{
if (sb.Length > 0)
{
sb.Append (" ");
}
sb.Append (item.DebugSummary);
}
return sb.ToString ();
}
}
#endregion
//*******************************************************************
//
// Private Method
//
//********************************************************************
#region Private Method
private void GetDictionaryElements (SortedDictionary> dict)
{
// Recursive search from a matching subtree
foreach (GrammarBuilderBase item in Items)
{
BuilderElements current = item as BuilderElements;
// Go deeper if the number of children is greater the element to compare against.
if (current != null)
{
if (!dict.ContainsKey (current.Count))
{
dict.Add (current.Count, new Collection ());
}
dict [current.Count].Add (current);
current.GetDictionaryElements (dict);
}
}
}
private void RemoveDictionaryElements (SortedDictionary> dict)
{
// Recursive search from a matching subtree
foreach (GrammarBuilderBase item in Items)
{
BuilderElements current = item as BuilderElements;
// Go deeper if the number of children is greater the element to compare against.
if (current != null)
{
// Recursively remove all elements
current.RemoveDictionaryElements (dict);
dict [current.Count].Remove (current);
}
}
}
#endregion
//*******************************************************************
//
// Private Fields
//
//********************************************************************
#region Private Fields
// List of builder elements
private readonly List _items = new List ();
#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
- NameValueConfigurationCollection.cs
- SchemaInfo.cs
- UInt64Storage.cs
- ConfigXmlText.cs
- ICspAsymmetricAlgorithm.cs
- MetadataArtifactLoaderCompositeResource.cs
- QueryReaderSettings.cs
- Ref.cs
- ArglessEventHandlerProxy.cs
- InvalidOleVariantTypeException.cs
- RenderDataDrawingContext.cs
- SystemInformation.cs
- MD5CryptoServiceProvider.cs
- InteropBitmapSource.cs
- APCustomTypeDescriptor.cs
- ComplexPropertyEntry.cs
- FlagsAttribute.cs
- XmlIgnoreAttribute.cs
- ResourceWriter.cs
- Context.cs
- DataGridBeginningEditEventArgs.cs
- UnmanagedHandle.cs
- SystemUnicastIPAddressInformation.cs
- XD.cs
- DataGridColumn.cs
- XmlDataImplementation.cs
- SafeLibraryHandle.cs
- NameNode.cs
- DbConnectionOptions.cs
- KeyTime.cs
- PointAnimationClockResource.cs
- PerformanceCounterPermissionEntryCollection.cs
- XPathChildIterator.cs
- HostedNamedPipeTransportManager.cs
- BufferedResponseStream.cs
- DecimalStorage.cs
- XmlSchemaSimpleTypeRestriction.cs
- JoinTreeSlot.cs
- LinkTarget.cs
- DataGridViewRowsRemovedEventArgs.cs
- DictionaryBase.cs
- KnownTypesHelper.cs
- WebPartExportVerb.cs
- XDRSchema.cs
- HttpCookieCollection.cs
- ConfigXmlWhitespace.cs
- DecimalStorage.cs
- ListView.cs
- StaticDataManager.cs
- ThreadStartException.cs
- LabelLiteral.cs
- SaveFileDialog.cs
- OptionUsage.cs
- ProviderCollection.cs
- ScriptingSectionGroup.cs
- ValidationService.cs
- NonBatchDirectoryCompiler.cs
- figurelength.cs
- ScrollBar.cs
- OpenTypeMethods.cs
- NestedContainer.cs
- TransformProviderWrapper.cs
- ToolboxItemAttribute.cs
- UndoManager.cs
- TcpAppDomainProtocolHandler.cs
- PermissionListSet.cs
- SystemBrushes.cs
- CompiledRegexRunner.cs
- FormatException.cs
- StringBlob.cs
- StateMachineWorkflowDesigner.cs
- ObjectDataProvider.cs
- XmlConvert.cs
- OdbcRowUpdatingEvent.cs
- LinqDataSourceDisposeEventArgs.cs
- ColorConverter.cs
- ExtendedPropertyCollection.cs
- SaveWorkflowCommand.cs
- WhileDesigner.xaml.cs
- WebPartDesigner.cs
- CodeLinePragma.cs
- Light.cs
- WizardPanelChangingEventArgs.cs
- ClientWindowsAuthenticationMembershipProvider.cs
- DetailsViewPageEventArgs.cs
- PathSegment.cs
- validation.cs
- AdRotator.cs
- Rotation3DKeyFrameCollection.cs
- OrderPreservingSpoolingTask.cs
- ReadOnlyHierarchicalDataSource.cs
- VolatileResourceManager.cs
- HtmlTableCellCollection.cs
- FormView.cs
- Page.cs
- KnownColorTable.cs
- _NegoStream.cs
- RSAOAEPKeyExchangeFormatter.cs
- FrameworkElementFactory.cs
- Permission.cs