The Labs \ Source Viewer \ SSCLI \ System.Xml \ IncrementalReadCharsDecoder

  1. //------------------------------------------------------------------------------
  2. // <copyright file="IncrementalReadDecoder.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. using System.Diagnostics;
  16. namespace System.Xml
  17. {
  18.    
  19.     //
  20.     // IncrementalReadDecoder abstract class
  21.     //
  22.     internal abstract class IncrementalReadDecoder
  23.     {
  24.         internal abstract int DecodedCount {
  25.             get;
  26.         }
  27.         internal abstract bool IsFull {
  28.             get;
  29.         }
  30.         internal abstract void SetNextOutputBuffer(Array array, int offset, int len);
  31.         internal abstract int Decode(char[] chars, int startPos, int len);
  32.         internal abstract int Decode(string str, int startPos, int len);
  33.         internal abstract void Reset();
  34.     }
  35.    
  36.     //
  37.     // Dummy IncrementalReadDecoder
  38.     //
  39.     internal class IncrementalReadDummyDecoder : IncrementalReadDecoder
  40.     {
  41.         internal override int DecodedCount {
  42.             get { return -1; }
  43.         }
  44.         internal override bool IsFull {
  45.             get { return false; }
  46.         }
  47.         internal override void SetNextOutputBuffer(Array array, int offset, int len)
  48.         {
  49.         }
  50.         internal override int Decode(char[] chars, int startPos, int len)
  51.         {
  52.             return len;
  53.         }
  54.         internal override int Decode(string str, int startPos, int len)
  55.         {
  56.             return len;
  57.         }
  58.         internal override void Reset()
  59.         {
  60.         }
  61.     }
  62.    
  63.     //
  64.     // IncrementalReadDecoder for ReadChars
  65.     //
  66.     internal class IncrementalReadCharsDecoder : IncrementalReadDecoder
  67.     {
  68.         char[] buffer;
  69.         int startIndex;
  70.         int curIndex;
  71.         int endIndex;
  72.        
  73.         internal IncrementalReadCharsDecoder()
  74.         {
  75.         }
  76.        
  77.         internal override int DecodedCount {
  78.             get { return curIndex - startIndex; }
  79.         }
  80.        
  81.         internal override bool IsFull {
  82.             get { return curIndex == endIndex; }
  83.         }
  84.        
  85.         internal override int Decode(char[] chars, int startPos, int len)
  86.         {
  87.             Debug.Assert(chars != null);
  88.             Debug.Assert(len >= 0);
  89.             Debug.Assert(startPos >= 0);
  90.             Debug.Assert(chars.Length - startPos >= len);
  91.            
  92.             Debug.Assert(len > 0);
  93.            
  94.             int copyCount = endIndex - curIndex;
  95.             if (copyCount > len) {
  96.                 copyCount = len;
  97.             }
  98.             Buffer.BlockCopy(chars, startPos * 2, buffer, curIndex * 2, copyCount * 2);
  99.             curIndex += copyCount;
  100.            
  101.             return copyCount;
  102.         }
  103.        
  104.         internal override int Decode(string str, int startPos, int len)
  105.         {
  106.             Debug.Assert(str != null);
  107.             Debug.Assert(len >= 0);
  108.             Debug.Assert(startPos >= 0);
  109.             Debug.Assert(str.Length - startPos >= len);
  110.            
  111.             Debug.Assert(len > 0);
  112.            
  113.             int copyCount = endIndex - curIndex;
  114.             if (copyCount > len) {
  115.                 copyCount = len;
  116.             }
  117.             str.CopyTo(startPos, buffer, curIndex, copyCount);
  118.             curIndex += copyCount;
  119.            
  120.             return copyCount;
  121.         }
  122.        
  123.         internal override void Reset()
  124.         {
  125.         }
  126.        
  127.         internal override void SetNextOutputBuffer(Array buffer, int index, int count)
  128.         {
  129.             Debug.Assert(buffer != null);
  130.             Debug.Assert(count >= 0);
  131.             Debug.Assert(index >= 0);
  132.             Debug.Assert(buffer.Length - index >= count);
  133.            
  134.             Debug.Assert((buffer as char[]) != null);
  135.             this.buffer = (char[])buffer;
  136.             this.startIndex = index;
  137.             this.curIndex = index;
  138.             this.endIndex = index + count;
  139.         }
  140.     }
  141.    
  142. }

Developer Fusion