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

xml/soap/webservice

开发平台:

Visual C++

  1. //------------------------------------------------------------------------------
  2. // <copyright file="EditScript.cs" company="Microsoft">
  3. //     Copyright (c) Microsoft Corporation.  All rights reserved.
  4. // </copyright>                                                                
  5. //------------------------------------------------------------------------------
  6. using System;
  7. using System.Diagnostics;
  8. namespace Microsoft.XmlDiffPatch
  9. {
  10. //////////////////////////////////////////////////////////////////
  11. // EditScriptOperation enum
  12. //
  13. internal enum EditScriptOperation
  14. {
  15.     None                 = 0,
  16.     Match                = 1,
  17.     Add                  = 2,
  18.     Remove               = 3,
  19.     ChangeNode           = 4,
  20.     EditScriptReference  = 5,
  21.     EditScriptPostponed  = 6,
  22.     OpenedAdd            = 7,
  23.     OpenedRemove         = 8,
  24.     OpenedMatch          = 9,
  25. }
  26. //////////////////////////////////////////////////////////////////
  27. // EditScript
  28. //
  29. internal abstract class EditScript
  30. {
  31. // Fields
  32.     internal EditScript _nextEditScript;
  33. // Constructor
  34.     internal EditScript( EditScript next)
  35.     {
  36.         _nextEditScript = next;
  37.     }
  38. // Properties
  39.     internal abstract EditScriptOperation Operation { get; }
  40.     internal EditScript Next { get { return _nextEditScript; } }
  41. // Methods
  42.     internal virtual EditScript GetClosedScript( int currentSourceIndex, int currentTargetIndex )
  43.     {
  44.         Debug.Assert( this as EditScriptOpened == null );
  45.         return this;
  46.     }
  47. #if DEBUG
  48.     internal abstract void Dump();
  49. #endif
  50. }
  51. //////////////////////////////////////////////////////////////////
  52. // EditScriptEmpty
  53. //
  54. internal class EditScriptEmpty : EditScript
  55. {
  56. // Constructor
  57.     internal EditScriptEmpty() : base( null ) {}
  58. // Properties
  59.     internal override EditScriptOperation Operation { get { return EditScriptOperation.None; } }
  60. // Methods
  61. #if DEBUG
  62.     internal override void Dump()
  63.     {
  64.         Trace.WriteLine( "empty" );
  65.         if ( _nextEditScript != null ) _nextEditScript.Dump();
  66.     }
  67. #endif
  68. }
  69. //////////////////////////////////////////////////////////////////
  70. // EditScriptMatch
  71. //
  72. internal class EditScriptMatch : EditScript
  73. {
  74. // Fields
  75.     internal int _firstSourceIndex; 
  76.     internal int _firstTargetIndex;
  77.     internal int _length;
  78. // Constructor
  79.     internal EditScriptMatch( int startSourceIndex, int startTargetIndex, 
  80.                               int length, EditScript next )
  81.         : base ( next )
  82.     {
  83.         Debug.Assert( length > 0 );
  84.         Debug.Assert( startSourceIndex > 0 );
  85.         Debug.Assert( startTargetIndex > 0 );
  86.         _firstSourceIndex = startSourceIndex;
  87.         _firstTargetIndex = startTargetIndex;
  88.         _length = length;
  89.     }
  90. // Properties
  91.     internal override EditScriptOperation Operation { get { return EditScriptOperation.Match; } }
  92. // Methods
  93. #if DEBUG
  94.     internal override void Dump()
  95.     {
  96.         if ( _length > 1 )
  97.             Trace.WriteLine( "match s" + _firstSourceIndex + "-s" + (_firstSourceIndex + _length - 1).ToString() + 
  98.                                " to t" + _firstTargetIndex + "-t" + (_firstTargetIndex + _length - 1).ToString() );
  99.         else
  100.             Trace.WriteLine( "match s" + _firstSourceIndex + " to t" + _firstTargetIndex );
  101.         if ( _nextEditScript != null ) _nextEditScript.Dump();
  102.     }
  103. #endif
  104. }
  105. //////////////////////////////////////////////////////////////////
  106. // EditScriptAdd
  107. //
  108. internal class EditScriptAdd : EditScript
  109. {
  110. // Fields
  111.     internal int _startTargetIndex;
  112.     internal int _endTargetIndex;
  113. // Constructor
  114.     internal EditScriptAdd( int startTargetIndex, int endTargetIndex, EditScript next )
  115.         : base ( next )
  116.     {
  117.         Debug.Assert( endTargetIndex - startTargetIndex >= 0 );
  118.         Debug.Assert( startTargetIndex > 0 );
  119.         Debug.Assert( endTargetIndex > 0 );
  120.         _startTargetIndex = startTargetIndex;
  121.         _endTargetIndex = endTargetIndex;
  122.     }
  123. // Properties
  124.     internal override EditScriptOperation Operation { get { return EditScriptOperation.Add; } }
  125. // Methods
  126. #if DEBUG
  127.     internal override void Dump()
  128.     {
  129.         if ( _endTargetIndex - _startTargetIndex > 0 )
  130.             Trace.WriteLine( "add t" + _startTargetIndex + "-t" + _endTargetIndex );
  131.         else
  132.             Trace.WriteLine( "add t" + _startTargetIndex );
  133.         if (_nextEditScript != null ) _nextEditScript.Dump();
  134.     }
  135. #endif
  136. }
  137. //////////////////////////////////////////////////////////////////
  138. // EditScriptRemove
  139. //
  140. internal class EditScriptRemove : EditScript
  141. {
  142. // Fields
  143.     internal int _startSourceIndex;
  144.     internal int _endSourceIndex;
  145. // Constructor
  146.     internal EditScriptRemove( int startSourceIndex, int endSourceIndex, EditScript next )
  147.         : base ( next )
  148.     {
  149.         Debug.Assert( endSourceIndex - startSourceIndex >= 0 );
  150.         Debug.Assert( startSourceIndex > 0 );
  151.         Debug.Assert( endSourceIndex > 0 );
  152.         _startSourceIndex = startSourceIndex;
  153.         _endSourceIndex = endSourceIndex;
  154.     }
  155. // Properties
  156.     internal override EditScriptOperation Operation { get { return EditScriptOperation.Remove; } }
  157. // Methods
  158. #if DEBUG
  159.     internal override void Dump()
  160.     {
  161.         if ( _endSourceIndex - _startSourceIndex > 0 )
  162.             Trace.WriteLine( "remove s" + _startSourceIndex + "-s" + _endSourceIndex );
  163.         else
  164.             Trace.WriteLine( "remove s" + _startSourceIndex );
  165.         if (_nextEditScript != null ) _nextEditScript.Dump();
  166.     }
  167. #endif
  168. }
  169. //////////////////////////////////////////////////////////////////
  170. // EditScriptChange
  171. //
  172. internal class EditScriptChange : EditScript
  173. {
  174. // Fields
  175.     internal int _sourceIndex, _targetIndex;
  176.     internal XmlDiffOperation _changeOp;
  177. // Constructor
  178.     internal EditScriptChange( int sourceIndex, int targetIndex, XmlDiffOperation changeOp, EditScript next )
  179.         : base( next )
  180.     {
  181.         Debug.Assert( sourceIndex > 0 );
  182.         Debug.Assert( targetIndex > 0 );
  183.         Debug.Assert( XmlDiff.IsChangeOperation( changeOp) );
  184.         _sourceIndex = sourceIndex;
  185.         _targetIndex = targetIndex;
  186.         _changeOp = changeOp;
  187.     }
  188. // Properties
  189.     internal override EditScriptOperation Operation { get { return EditScriptOperation.ChangeNode; } }
  190. // Methods
  191. #if DEBUG
  192.     internal override void Dump()
  193.     {
  194.         Trace.WriteLine( "change s" + _sourceIndex + " to t" + _targetIndex );
  195.         if ( _nextEditScript != null ) _nextEditScript.Dump();
  196.     }
  197. #endif
  198. }
  199. //////////////////////////////////////////////////////////////////
  200. // EditScriptOpened
  201. //
  202. internal abstract class EditScriptOpened : EditScript
  203. {
  204. // Constructor
  205.     internal EditScriptOpened( EditScript next ) : base ( next ) {}
  206. }
  207. //////////////////////////////////////////////////////////////////
  208. // EditScriptMatchOpened
  209. //
  210. internal class EditScriptMatchOpened : EditScriptOpened
  211. {
  212. // Fields
  213.     internal int _startSourceIndex;
  214.     internal int _startTargetIndex;
  215. // Constructor
  216.     internal EditScriptMatchOpened( int startSourceIndex, int startTargetIndex, EditScript next )
  217.         : base ( next )
  218.     {
  219.         Debug.Assert( startSourceIndex > 0 );
  220.         Debug.Assert( startTargetIndex > 0 );
  221.         _startSourceIndex = startSourceIndex;
  222.         _startTargetIndex = startTargetIndex;
  223.     }
  224. // Properties
  225.     internal override EditScriptOperation Operation { get { return EditScriptOperation.OpenedMatch; } }
  226. // Methods
  227.     internal override EditScript GetClosedScript( int currentSourceIndex, int currentTargetIndex )
  228.     {
  229.         Debug.Assert( _startSourceIndex - currentSourceIndex == _startTargetIndex - currentTargetIndex );
  230.         Debug.Assert( currentSourceIndex - _startSourceIndex >= 0 );
  231.         Debug.Assert( currentTargetIndex - _startTargetIndex >= 0 );
  232.         return new EditScriptMatch( _startSourceIndex, _startTargetIndex,
  233.                                             currentSourceIndex - _startSourceIndex + 1,
  234.                                             _nextEditScript );
  235.     }
  236. #if DEBUG
  237.     internal override void Dump()
  238.     {
  239.         Trace.WriteLine( "opened match: s" + _startSourceIndex + " to t" + _startTargetIndex );
  240.         if ( _nextEditScript != null ) _nextEditScript.Dump();
  241.     }
  242. #endif
  243. }
  244. //////////////////////////////////////////////////////////////////
  245. // EditScriptAddOpened
  246. //
  247. internal class EditScriptAddOpened : EditScriptOpened
  248. {
  249. // Fields
  250.     internal int _startTargetIndex;
  251. // Constructor
  252.     internal EditScriptAddOpened( int startTargetIndex, EditScript next )
  253.         : base ( next )
  254.     {
  255.         Debug.Assert( startTargetIndex > 0 );
  256.         _startTargetIndex = startTargetIndex;
  257.     }
  258. // Properties
  259.     internal override EditScriptOperation Operation { get { return EditScriptOperation.OpenedAdd; } }
  260. // Methods
  261.     internal override EditScript GetClosedScript( int currentSourceIndex, int currentTargetIndex )
  262.     {
  263.         Debug.Assert( currentTargetIndex - _startTargetIndex >= 0 );
  264.         return new EditScriptAdd( _startTargetIndex, currentTargetIndex, _nextEditScript );
  265.     }
  266. #if DEBUG
  267.     internal override void Dump()
  268.     {
  269.         Trace.WriteLine( "opened add: t" + _startTargetIndex );
  270.         if ( _nextEditScript != null ) _nextEditScript.Dump();
  271.     }
  272. #endif
  273. }
  274. //////////////////////////////////////////////////////////////////
  275. // EditScriptRemoveOpened
  276. //
  277. internal class EditScriptRemoveOpened : EditScriptOpened
  278. {
  279. // Fields
  280.     internal int _startSourceIndex;
  281. // Constructor
  282.     internal EditScriptRemoveOpened( int startSourceIndex, EditScript next )
  283.         : base ( next )
  284.     {
  285.         Debug.Assert( startSourceIndex > 0 );
  286.         _startSourceIndex = startSourceIndex;
  287.     }
  288. // Properties
  289.     internal override EditScriptOperation Operation { get { return EditScriptOperation.OpenedRemove; } }
  290. // Methods
  291.     internal override EditScript GetClosedScript( int currentSourceIndex, int currentTargetIndex )
  292.     {
  293.         Debug.Assert( currentSourceIndex - _startSourceIndex >= 0 );
  294.         return new EditScriptRemove( _startSourceIndex, currentSourceIndex, _nextEditScript );
  295.     }
  296. #if DEBUG
  297.     internal override void Dump()
  298.     {
  299.         Trace.WriteLine( "opened remove: s" + _startSourceIndex );
  300.         if ( _nextEditScript != null ) _nextEditScript.Dump();
  301.     }
  302. #endif
  303. }
  304. //////////////////////////////////////////////////////////////////
  305. // EditScriptReference
  306. //
  307. internal class EditScriptReference : EditScript
  308. {
  309. // Fields
  310.     internal EditScript _editScriptReference;
  311. // Constructor
  312.     internal EditScriptReference( EditScript editScriptReference, EditScript next ) : base( next )
  313.     {
  314.         Debug.Assert( editScriptReference != null );
  315.         Debug.Assert( next != null );
  316.         _editScriptReference = editScriptReference;
  317.     }
  318. // Properties
  319.     internal override EditScriptOperation Operation { get { return EditScriptOperation.EditScriptReference; } }   
  320. // Methods
  321. #if DEBUG
  322.     internal override void Dump()
  323.     {
  324.         Trace.WriteLine( "REFERENCE EDIT SCRIPT - start" );
  325.         _editScriptReference.Dump();
  326.         Trace.WriteLine( "REFERENCE EDIT SCRIPT - end" );
  327.         if ( _nextEditScript != null ) _nextEditScript.Dump();
  328.     }
  329. #endif
  330. }    
  331. //////////////////////////////////////////////////////////////////
  332. // EditScriptReference
  333. //
  334. internal class EditScriptPostponed : EditScript
  335. {
  336. // Fields
  337.     internal DiffgramOperation _diffOperation;
  338.     internal int _startSourceIndex;
  339.     internal int _endSourceIndex;
  340. // Constructor
  341.     internal EditScriptPostponed( DiffgramOperation diffOperation, int startSourceIndex, int endSourceIndex ) : base( null )
  342.     {
  343.         Debug.Assert( diffOperation != null );
  344.         Debug.Assert( startSourceIndex > 0 );
  345.         Debug.Assert( endSourceIndex > 0 );
  346.         _diffOperation = diffOperation;
  347.         _startSourceIndex = startSourceIndex;
  348.         _endSourceIndex = endSourceIndex;
  349.     }
  350. // Properties
  351.     internal override EditScriptOperation Operation { get { return EditScriptOperation.EditScriptPostponed; } }   
  352. // Methods
  353. #if DEBUG
  354.     internal override void Dump()
  355.     {
  356.         Trace.WriteLine( "postponed edit script: s" + _startSourceIndex + "-s" + _endSourceIndex );
  357.         if ( _nextEditScript != null ) _nextEditScript.Dump();
  358.     }
  359. #endif
  360. }    
  361. };