XmlDiffPathMultiNodeList.cs
上传用户:hbhltzc
上传日期:2022-06-04
资源大小:1925k
文件大小:7k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. //  ---------------------------------------------------------------------------
  2. // <copyright company="Microsoft Corporation" file="XmlDiffPathMultiNodeList.cs">
  3. //     Copyright (c) Microsoft Corporation 2005
  4. // </copyright>
  5. // <project>
  6. //     XmlDiffView
  7. // </project>
  8. // <summary>
  9. //     Methods to handle nodes which have child nodes.
  10. // </summary>
  11. // <history>
  12. //      [barryw] 03MAR15 Created
  13. // </history>
  14. //  ---------------------------------------------------------------------------
  15. namespace Microsoft.XmlDiffPatch
  16. {
  17.     #region Using directives
  18.     using System;
  19.     using System.Diagnostics;
  20.     #endregion
  21.     /// <summary>
  22.     /// Class which provides methods 
  23.     /// to navigate sibling nodes. 
  24.     /// </summary>
  25.     internal class XmlDiffPathMultiNodeList : XmlDiffPathNodeList
  26.     {
  27.         #region Member variables section
  28.         /// <summary>
  29.         /// Number of sibling nodes in the list of data.
  30.         /// </summary>
  31.         private int count = 0;
  32.         /// <summary>
  33.         /// Collection of sibling nodes
  34.         /// </summary>
  35.         private ListChunk chunks = null;
  36.         
  37.         /// <summary>
  38.         /// Reference to the previous collection of sibling nodes
  39.         /// </summary>
  40.         private ListChunk lastChunk = null;
  41.         
  42.         /// <summary>
  43.         /// Reference to collection of sibling nodes
  44.         /// </summary>
  45.         private ListChunk currentChunk = null;
  46.         
  47.         /// <summary>
  48.         /// The index to the current collection of
  49.         /// sibling nodes
  50.         /// </summary>
  51.         private int currentChunkIndex = -1;
  52.         
  53.         #endregion
  54.         #region  Constructors section
  55.         /// <summary>
  56.         /// Constructor
  57.         /// </summary>
  58.         public XmlDiffPathMultiNodeList()
  59.         {
  60.         }
  61.  
  62.         #endregion
  63.         #region Properties section
  64.         /// <summary>
  65.         /// Gets the current sibling node.
  66.         /// </summary>
  67.         public override XmlDiffViewNode Current
  68.         {
  69.             get
  70.             {
  71.                 if (this.currentChunk == null || this.currentChunkIndex < 0)
  72.                 {
  73.                     return null;
  74.                 }
  75.                 else
  76.                 {
  77.                     return this.currentChunk[this.currentChunkIndex];
  78.                 }
  79.             }
  80.         }
  81.         /// <summary>
  82.         /// Gets the number of sibling nodes
  83.         /// </summary>
  84.         public override int Count
  85.         {
  86.             get
  87.             {
  88.                 return this.count;
  89.             }
  90.         }
  91.         #endregion
  92.         
  93.         #region Indexers section
  94.         #endregion
  95.         
  96.         #region Methods section
  97.         /// <summary>
  98.         /// Move to the next list (branch) of nodes
  99.         /// </summary>
  100.         /// <returns>Moved to the next list of nodes</returns>
  101.         public override bool MoveNext()
  102.         {
  103.             if (this.currentChunk == null)
  104.             {
  105.                 return false;
  106.             }
  107.             
  108.             if (this.currentChunkIndex >= this.currentChunk.Count - 1)
  109.             {
  110.                 if (this.currentChunk.Next == null)
  111.                 {
  112.                     return false;
  113.                 }
  114.                 else
  115.                 {
  116.                     this.currentChunk = this.currentChunk.Next;
  117.                     this.currentChunkIndex = 0;
  118.                     Debug.Assert(this.currentChunk.Count > 0);
  119.                     return true;
  120.                 }
  121.             }
  122.             else
  123.             {
  124.                 this.currentChunkIndex++;
  125.                 return true;
  126.             }
  127.         }
  128.         /// <summary>
  129.         /// Reset the position in the lists of nodes.
  130.         /// </summary>
  131.         public override void Reset()
  132.         {
  133.             this.currentChunk = this.chunks;
  134.             this.currentChunkIndex = -1;
  135.         }
  136.         /// <summary>
  137.         /// Adds a node to the current list of data.
  138.         /// </summary>
  139.         /// <param name="node">Node object to add</param>
  140.         public override void AddNode(XmlDiffViewNode node)
  141.         {
  142.             if (this.lastChunk == null)
  143.             {
  144.                 this.chunks = new ListChunk();
  145.                 this.lastChunk = this.chunks;
  146.                 this.currentChunk = this.chunks;
  147.             }
  148.             else if (this.lastChunk.Count == ListChunk.ChunkSize)
  149.             {
  150.                 this.lastChunk.Next = new ListChunk();
  151.                 this.lastChunk = this.lastChunk.Next;
  152.             }
  153.             this.lastChunk.AddNode(node);
  154.             this.count++;
  155.         }
  156.         #endregion
  157.         #region Subclasses section
  158.         /// <summary>
  159.         /// Class to provide an array in which
  160.         /// to hold nodes and the ability to navigate
  161.         /// the array.
  162.         /// </summary>
  163.         private class ListChunk
  164.         {
  165.             #region Constants section
  166.             /// <summary>
  167.             /// Maximum number of nodes in the list.
  168.             /// </summary>
  169.             public const int ChunkSize = 10;
  170.             #endregion
  171.             #region Member variables section
  172.             /// <summary>
  173.             /// Create the list of nodes object. 
  174.             /// </summary>
  175.             private XmlDiffViewNode[] nodes = new XmlDiffViewNode[ChunkSize];
  176.             
  177.             /// <summary>
  178.             /// Number of nodes in the list.
  179.             /// </summary>
  180.             private int count = 0;
  181.             
  182.             /// <summary>
  183.             /// Initialize the next chuck of data.
  184.             /// </summary>
  185.             private ListChunk next = null;
  186.             #endregion
  187.             #region Properties section
  188.             /// <summary>
  189.             /// Gets the number of nodes (chunks of
  190.             /// data) in the current list (branch) of data. Read only.
  191.             /// </summary>
  192.             /// <value></value>
  193.             public int Count
  194.             {
  195.                 get
  196.                 {
  197.                     return this.count;
  198.                 }
  199.             }
  200.             /// <summary>
  201.             /// Gets or sets the next chuck of data 
  202.             /// </summary>
  203.             /// <value>Reference to the next list of nodes</value>
  204.             public ListChunk Next
  205.             {
  206.                 get
  207.                 {
  208.                     return this.next;
  209.                 }
  210.                 
  211.                 set
  212.                 {
  213.                     this.next = value;
  214.                 }
  215.             }
  216.             #endregion
  217.         
  218.             #region Indexers section
  219.             /// <summary>
  220.             /// Gets a node based on its index in the collection.
  221.             /// </summary>
  222.             /// <param name="index">index to node</param>
  223.             public XmlDiffViewNode this[int index]
  224.             {
  225.                 get
  226.                 {
  227.                     return this.nodes[index];
  228.                 }
  229.             }
  230.             
  231.             #endregion
  232.         
  233.             #region Methods section
  234.             /// <summary>
  235.             /// Adds a node object to the collection.
  236.             /// </summary>
  237.             /// <param name="node">node object to add</param>
  238.             public void AddNode(XmlDiffViewNode node)
  239.             {
  240.                 Debug.Assert(this.count < ChunkSize);
  241.                 this.nodes[this.count++] = node;
  242.             }
  243.             #endregion
  244.         }
  245.         #endregion
  246.     }
  247. }