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

xml/soap/webservice

开发平台:

Visual C++

  1. //------------------------------------------------------------------------------
  2. // <copyright file="XmlPatchNodeList.cs" company="Microsoft">
  3. //     Copyright (c) Microsoft Corporation.  All rights reserved.
  4. // </copyright>                                                                
  5. //------------------------------------------------------------------------------
  6. using System;
  7. using System.Xml;
  8. using System.Diagnostics;
  9. using System.Collections;
  10. namespace Microsoft.XmlDiffPatch
  11. {
  12. //////////////////////////////////////////////////////////////////
  13. // XmlPatchNodeList
  14. //
  15. internal abstract class XmlPatchNodeList : XmlNodeList 
  16. {
  17.     internal abstract void AddNode( XmlNode node );
  18. }
  19. //////////////////////////////////////////////////////////////////
  20. // XmlPatchNodeList
  21. //
  22. internal class MultiNodeList : XmlPatchNodeList
  23. {
  24.     internal class ListChunk 
  25.     {
  26.         internal const int ChunkSize = 10;
  27.         internal XmlNode[] _nodes = new XmlNode[ ChunkSize ];
  28.         internal int _count = 0;
  29.         internal ListChunk _next = null;
  30.         internal XmlNode this[int i] { get { return _nodes[i]; } }
  31.         internal void AddNode( XmlNode node )
  32.         {
  33.             Debug.Assert( _count < ChunkSize );
  34.             _nodes[ _count++ ] = node;
  35.         }
  36.     }
  37.     private class Enumerator : IEnumerator
  38.     {
  39.         private MultiNodeList _nodeList;
  40.         private ListChunk _currentChunk;
  41.         private int _currentChunkIndex = 0;
  42.         internal Enumerator( MultiNodeList nodeList )
  43.         {
  44.             _nodeList = nodeList;
  45.             _currentChunk = nodeList._chunks;
  46.         }
  47.         public object Current
  48.         {
  49.             get 
  50.             { 
  51.                 if ( _currentChunk == null )
  52.                     return null;
  53.                 else
  54.                     return _currentChunk[ _currentChunkIndex ];
  55.             }
  56.         }
  57.         public bool MoveNext()
  58.         {
  59.             if ( _currentChunk == null )
  60.                 return false;
  61.             if ( _currentChunkIndex >= _currentChunk._count - 1 )
  62.             {
  63.                 if ( _currentChunk._next == null )
  64.                     return false;
  65.                 else
  66.                 {
  67.                     _currentChunk = _currentChunk._next;
  68.                     _currentChunkIndex = 0;
  69.                     Debug.Assert( _currentChunk._count > 0 );
  70.                     return true;
  71.                 }
  72.             }
  73.             else
  74.             {
  75.                 _currentChunkIndex++;
  76.                 return true;
  77.             }
  78.         }
  79.         public void Reset()
  80.         {
  81.             _currentChunk = _nodeList._chunks;
  82.             _currentChunkIndex = -1;
  83.         }
  84.     }
  85. // Fields
  86.     int _count = 0;
  87.     internal ListChunk _chunks = null;
  88.     ListChunk _lastChunk = null;
  89. // Constructor
  90. internal MultiNodeList()
  91. {
  92. }
  93. // Overriden methods
  94.     public override XmlNode Item(int index)
  95.     {
  96.         if ( _chunks == null )
  97.             return null;
  98.         if ( index < ListChunk.ChunkSize )
  99.             return _chunks[ index ];
  100.         int chunkNo = index / ListChunk.ChunkSize;
  101.         ListChunk curChunk = _chunks;
  102.         while ( chunkNo > 0 )
  103.         {
  104.             curChunk = curChunk._next;
  105.             chunkNo--;
  106.             Debug.Assert( curChunk != null );
  107.         }
  108.         return curChunk[ index % ListChunk.ChunkSize ]; 
  109.     }
  110.     public override int Count 
  111.     { 
  112.         get { return _count; } 
  113.     }
  114.     public override IEnumerator GetEnumerator()
  115.     {
  116.         return new Enumerator( this );
  117.     }
  118. // Methods
  119.     internal override void AddNode( XmlNode node )
  120.     {
  121.         if ( _lastChunk == null )
  122.         {
  123.             _chunks = new ListChunk();
  124.             _lastChunk = _chunks;
  125.         }
  126.         else if ( _lastChunk._count == ListChunk.ChunkSize )
  127.         {
  128.             _lastChunk._next = new ListChunk();
  129.             _lastChunk = _lastChunk._next;
  130.         }
  131.         _lastChunk.AddNode( node );
  132.         _count++;
  133.     }
  134. }
  135. //////////////////////////////////////////////////////////////////
  136. // SingleNodeList
  137. //
  138. internal class SingleNodeList : XmlPatchNodeList
  139. {
  140.     private class Enumerator : IEnumerator
  141.     {
  142.         enum State 
  143.         { 
  144.             BeforeNode = 0,
  145.             OnNode = 1,
  146.             AfterNode = 2
  147.         }
  148.         private XmlNode _node;
  149.         private State _state = State.BeforeNode;
  150.         internal Enumerator( XmlNode node )
  151.         {
  152.             _node = node;
  153.         }
  154.         public object Current 
  155.         {
  156.             get { return ( _state == State.OnNode ) ? _node : null; } 
  157.         }
  158.         public bool MoveNext()
  159.         {
  160.             switch ( _state ) 
  161.             {
  162.                 case State.BeforeNode:
  163.                     _state = State.OnNode;
  164.                     return true;
  165.                 case State.OnNode:
  166.                     _state = State.AfterNode;
  167.                     return false;
  168.                 case State.AfterNode:
  169.                     return false;
  170.                 default:
  171.                     return false;
  172.             }
  173.         }
  174.         public void Reset()
  175.         {
  176.             _state = State.BeforeNode;
  177.         }
  178.     }
  179. // Fields
  180.     XmlNode _node;
  181. // Constructor
  182. internal SingleNodeList ()
  183. {
  184. }
  185. // Overriden methods
  186.     public override XmlNode Item(int index)
  187.     {
  188.         if ( index == 0 )
  189.             return _node;
  190.         else
  191.             return null;
  192.     }
  193.     public override int Count 
  194.     { 
  195.         get { return 1; } 
  196.     }
  197.     public override IEnumerator GetEnumerator()
  198.     {
  199.         return new Enumerator( _node );
  200.     }
  201.     internal override void AddNode( XmlNode node )
  202.     {
  203.         Debug.Assert( _node == null );
  204.         if ( _node != null )
  205.             XmlPatchError.Error( XmlPatchError.InternalErrorMoreThanOneNodeInList );
  206.         _node = node;
  207.     }
  208. }
  209. }