Monoソース学習ノート:Console類(三)

49901 ワード

Bufferクラス(public static class)


次はmcs/class/corlib/system/Bufferです.cs:
001:  //
002: // System.Buffer.cs
003: //
004: // Authors:
005: //   Paolo Molaro ([email protected])
006: //   Dan Lewis ([email protected])
007: //
008: // (C) 2001 Ximian, Inc.  http://www.ximian.com
009: //
010: 
011: //
012: // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
013: //
014: // Permission is hereby granted, free of charge, to any person obtaining
015: // a copy of this software and associated documentation files (the
016: // "Software"), to deal in the Software without restriction, including
017: // without limitation the rights to use, copy, modify, merge, publish,
018: // distribute, sublicense, and/or sell copies of the Software, and to
019: // permit persons to whom the Software is furnished to do so, subject to
020: // the following conditions:
021: // 
022: // The above copyright notice and this permission notice shall be
023: // included in all copies or substantial portions of the Software.
024: // 
025: // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
026: // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
027: // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
028: // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
029: // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
030: // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
031: // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
032: //
033: 
034: using System.Runtime.CompilerServices;
035:  using System.Runtime.InteropServices;
036:  
037:  namespace System {
038:      [ComVisible (true)]
039:      public static class Buffer {
040:  
041:          public static int ByteLength (Array array)
042:          {
043:              // note: the other methods in this class also use ByteLength to test for
044:             // null and non-primitive arguments as a side-effect.
045: 
046:             if (array == null)
047:                  throw new ArgumentNullException ("array");
048:  
049:              int length = ByteLengthInternal (array);
050:              if (length < 0)
051:                  throw new ArgumentException (Locale.GetText ("Object must be an array of primitives."));
052:  
053:              return length;
054:          }
055:  
056:          public static byte GetByte (Array array, int index)
057:          {
058:              if (index < 0 || index >= ByteLength (array))
059:                  throw new ArgumentOutOfRangeException ("index", Locale.GetText(
060:                      "Value must be non-negative and less than the size of the collection."));
061:  
062:              return GetByteInternal (array, index);
063:          }
064:  
065:          public static void SetByte (Array array, int index, byte value)
066:          {
067:              if (index < 0 || index >= ByteLength (array))
068:                  throw new ArgumentOutOfRangeException ("index", Locale.GetText(
069:                      "Value must be non-negative and less than the size of the collection."));
070:  
071:              SetByteInternal (array, index, value);
072:          }
073:  
074:          public static void BlockCopy (Array src, int srcOffset, Array dst, int dstOffset, int count)
075:          {
076:              if (src == null)
077:                  throw new ArgumentNullException ("src");
078:  
079:              if (dst == null)
080:                  throw new ArgumentNullException ("dst");
081:  
082:              if (srcOffset < 0)
083:                  throw new ArgumentOutOfRangeException ("srcOffset", Locale.GetText(
084:                      "Non-negative number required."));
085:  
086:              if (dstOffset < 0)
087:                  throw new ArgumentOutOfRangeException ("dstOffset", Locale.GetText (
088:                      "Non-negative number required."));
089:  
090:              if (count < 0)
091:                  throw new ArgumentOutOfRangeException ("count", Locale.GetText (
092:                      "Non-negative number required."));
093:  
094:              // We do the checks in unmanaged code for performance reasons
095:             bool res = BlockCopyInternal (src, srcOffset, dst, dstOffset, count);
096:              if (!res) {
097:                  // watch for integer overflow
098:                 if ((srcOffset > ByteLength (src) - count) || (dstOffset > ByteLength (dst) - count))
099:                      throw new ArgumentException (Locale.GetText (
100:                          "Offset and length were out of bounds for the array or count is greater than " + 
101:                          "the number of elements from index to the end of the source collection."));
102:              }
103:          }
104:  
105:          // private
106:         [MethodImplAttribute (MethodImplOptions.InternalCall)]
107:          private extern static int ByteLengthInternal (Array array);
108:  
109:          [MethodImplAttribute (MethodImplOptions.InternalCall)]
110:          private extern static byte GetByteInternal (Array array, int index);
111:  
112:          [MethodImplAttribute (MethodImplOptions.InternalCall)]
113:          private extern static void SetByteInternal (Array array, int index, int value);
114:  
115:          [MethodImplAttribute (MethodImplOptions.InternalCall)]
116:          internal extern static bool BlockCopyInternal (Array src, int src_offset, Array dest, int dest_offset, int count);
117:      }
118:  }

上記のソースプログラムはBufferクラスを定義している.これは、ベースタイプを操作するための共通の静的クラスであり、配列内の各ベースタイプは一連のバイトとみなされます.その共通メンバーは以下の4つの共通静的方法しかなく、これらの方法はSystemより優れている.Arrayクラスの同様の方法は、より良いパフォーマンスを提供します.
  • BtyeLength:public static、指定した配列のバイト数を返します.(41~54行)
  • GetByte:public static、指定された配列で指定された位置のバイトを取得します.(56~63行)
  • SetByte:public static,指定した値を指定した配列内の特定の位置のバイトに割り当てる.(65~72行)
  • BlockCopy:public staticは、指定された数のバイトを特定のオフセットから始まるソース配列から特定のオフセットから始まるターゲット配列にコピーします.(74-103行)
  • 上記の4つの方法は、いくつかの必要なパラメータチェックを行った後に、以下の4つの非共通の外部静的方法を呼び出すだけである.
  • ByteLengthInternal:private extern static(106-107行)
  • GetByteInternal:private extern static(109-110行)
  • SetByteInternal:private extern static(112–114行)
  • BlockCopyInternal:internal extern static(115-116行)
  • これら4つの方法はいずれも[MethodImpl(MethodImplOptions.InternalCall)]と表記されており、すなわち、これら4つの方法はいずれも共通言語の実行時に自身の内部で実現される方法の呼び出しである.BlockCopyInternalメソッドはinternalであり、他の3つのメソッドのようにprivateではないことに注意してください.実は、Console.dllプロジェクトでは、BlockCopyInternalメソッドはTermInfoReader.csで呼び出されます.Bufferクラスの4つの共通の方法はConsole.dllプロジェクトには呼び出されていません.

    IConsoleDriverインタフェース(internal interface)


    次はmcs/class/corlib/system/IConsoleDriver.cs:
    01:  //
    02: // System.IConsoleDriver
    03: //
    04: // Author:
    05: //    Gonzalo Paniagua Javier ([email protected])
    06: //
    07: // (C) 2005 Novell, Inc. (http://www.novell.com)
    08: //
    09: 
    10: // Permission is hereby granted, free of charge, to any person obtaining
    11: // a copy of this software and associated documentation files (the
    12: // "Software"), to deal in the Software without restriction, including
    13: // without limitation the rights to use, copy, modify, merge, publish,
    14: // distribute, sublicense, and/or sell copies of the Software, and to
    15: // permit persons to whom the Software is furnished to do so, subject to
    16: // the following conditions:
    17: // 
    18: // The above copyright notice and this permission notice shall be
    19: // included in all copies or substantial portions of the Software.
    20: // 
    21: // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    22: // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    23: // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    24: // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    25: // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    26: // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    27: // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    28: //
    29: namespace System {
    30:      interface IConsoleDriver {
    31:          ConsoleColor BackgroundColor { get; set; }
    32:          int BufferHeight { get; set; }
    33:          int BufferWidth { get; set; }
    34:          bool CapsLock { get; }
    35:          int CursorLeft { get; set; } 
    36:          int CursorSize { get; set; } 
    37:          int CursorTop { get; set; }
    38:          bool CursorVisible { get; set; }
    39:          ConsoleColor ForegroundColor { get; set; }
    40:          bool KeyAvailable { get; }
    41:          bool Initialized { get; }
    42:          int LargestWindowHeight { get; }
    43:          int LargestWindowWidth { get; }
    44:          bool NumberLock { get; }
    45:          string Title { get; set; }
    46:          bool TreatControlCAsInput { get; set; } 
    47:          int WindowHeight { get; set; }
    48:          int WindowLeft { get; set; }
    49:          int WindowTop { get; set; }
    50:          int WindowWidth { get; set; }
    51:  
    52:          void Init ();
    53:          void Beep (int frequency, int duration);
    54:          void Clear ();
    55:          void MoveBufferArea (int sourceLeft, int sourceTop, int sourceWidth, int sourceHeight,
    56:                      int targetLeft, int targetTop, Char sourceChar,
    57:                      ConsoleColor sourceForeColor, ConsoleColor sourceBackColor);
    58:  
    59:          ConsoleKeyInfo ReadKey (bool intercept);
    60:          void ResetColor ();
    61:          void SetBufferSize (int width, int height);
    62:          void SetCursorPosition (int left, int top);
    63:          void SetWindowPosition (int left, int top);
    64:          void SetWindowSize (int width, int height);
    65:          string ReadLine ();
    66:      }
    67:  }

    上記のソースプログラムは、IConsoleDriverインタフェースを定義します.上記のソースプログラムの30行目にアクセス修飾子が明確に示されていない場合、このインタフェースはデフォルトでinternalであり、本プログラムセットでのみ使用できます.IConsoleDriverインタフェースは、このシリーズ学習ノート第一編の末尾で指摘した6つの最も核心的なタイプの1つであり、すべてのコンソールが実現しなければならない基本的な機能を規定しています.IConsoleDriverは11のメソッド,20のプロパティを定義し,そのうち6は読み取り専用プロパティである.

    NullConsoleDriverクラス(internal class)


    次はmcs/class/corlib/system/Null ConsoleDriverです.cs:
    001:  //
    002: // System.NullConsoleDriver
    003: //
    004: // Author:
    005: //    Gonzalo Paniagua Javier ([email protected])
    006: //
    007: // (C) 2006 Novell, Inc. (http://www.novell.com)
    008: //
    009: 
    010: // Permission is hereby granted, free of charge, to any person obtaining
    011: // a copy of this software and associated documentation files (the
    012: // "Software"), to deal in the Software without restriction, including
    013: // without limitation the rights to use, copy, modify, merge, publish,
    014: // distribute, sublicense, and/or sell copies of the Software, and to
    015: // permit persons to whom the Software is furnished to do so, subject to
    016: // the following conditions:
    017: // 
    018: // The above copyright notice and this permission notice shall be
    019: // included in all copies or substantial portions of the Software.
    020: // 
    021: // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    022: // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    023: // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    024: // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    025: // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    026: // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    027: // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    028: //
    029: #if !NET_2_1
    030:  using System.Runtime.InteropServices;
    031:  using System.Text;
    032:  namespace System {
    033:      class NullConsoleDriver : IConsoleDriver {
    034:          public ConsoleColor BackgroundColor {
    035:              get { return ConsoleColor.Black; }
    036:              set {
    037:              }
    038:          }
    039:  
    040:          public int BufferHeight {
    041:              get { return 0; }
    042:              set {}
    043:          }
    044:  
    045:          public int BufferWidth {
    046:              get { return 0; }
    047:              set {}
    048:          }
    049:  
    050:          public bool CapsLock {
    051:              get { return false; }
    052:          }
    053:  
    054:          public int CursorLeft {
    055:              get { return 0; }
    056:              set {}
    057:          }
    058:  
    059:          public int CursorSize {
    060:              get { return 0; }
    061:              set { }
    062:          }
    063:  
    064:          public int CursorTop {
    065:              get { return 0; }
    066:              set {}
    067:          }
    068:  
    069:          public bool CursorVisible {
    070:              get { return false; }
    071:              set {}
    072:          }
    073:  
    074:          public ConsoleColor ForegroundColor {
    075:              get { return ConsoleColor.Black; }
    076:              set {}
    077:          }
    078:  
    079:          public bool KeyAvailable {
    080:              get { return false; } // FIXME: throw?
    081:         }
    082:  
    083:          public bool Initialized {
    084:              get { return true; }
    085:          }
    086:  
    087:          public int LargestWindowHeight {
    088:              get { return 0; }
    089:          }
    090:  
    091:          public int LargestWindowWidth {
    092:              get { return 0; }
    093:          }
    094:  
    095:          public bool NumberLock {
    096:              get { return false; }
    097:          }
    098:  
    099:          public string Title {
    100:              get { return ""; }
    101:              set {}
    102:          }
    103:  
    104:          public bool TreatControlCAsInput {
    105:              get { return false; }
    106:              set {}
    107:          }
    108:  
    109:          public int WindowHeight {
    110:              get { return 0; }
    111:              set {}
    112:          }
    113:  
    114:          public int WindowLeft {
    115:              get { return 0; }
    116:              set {}
    117:          }
    118:  
    119:          public int WindowTop {
    120:              get { return 0; }
    121:              set {}
    122:          }
    123:  
    124:          public int WindowWidth {
    125:              get { return 0; }
    126:              set {}
    127:          }
    128:  
    129:          public void Beep (int frequency, int duration)
    130:          {
    131:          }
    132:  
    133:          public void Clear ()
    134:          {
    135:          }
    136:  
    137:          public void MoveBufferArea (int sourceLeft, int sourceTop, int sourceWidth, int sourceHeight,
    138:                      int targetLeft, int targetTop, Char sourceChar,
    139:                      ConsoleColor sourceForeColor, ConsoleColor sourceBackColor)
    140:          {
    141:          }
    142:  
    143:          public void Init ()
    144:          {
    145:          }
    146:  
    147:          public string ReadLine ()
    148:          {
    149:              return null;
    150:          }
    151:  
    152:          public ConsoleKeyInfo ReadKey (bool intercept)
    153:          {
    154:              return ConsoleKeyInfo.Empty;
    155:          }
    156:  
    157:          public void ResetColor ()
    158:          {
    159:          }
    160:  
    161:          public void SetBufferSize (int width, int height)
    162:          {
    163:          }
    164:  
    165:          public void SetCursorPosition (int left, int top)
    166:          {
    167:          }
    168:  
    169:          public void SetWindowPosition (int left, int top)
    170:          {
    171:          }
    172:  
    173:          public void SetWindowSize (int width, int height)
    174:          {
    175:          }
    176:      }
    177:  }
    178:  #endif

    上記のソースプログラムはNullConsoleDriverクラスを定義しています.ソースプログラム全体(冒頭のコメントを除く)は29行目の「#if!NET_2_1」と178行目の「#endif」前処理命令で囲まれており、このクラスはMoonlightでは使用できないことを示しており、実際にMoonlightはWebに適用され、コンソールの概念は不要である.ここのNET_2_1は.NET 2.1、Moonlightは.NET 2.1の詳細については、MoonlightNotesを参照してください.
    上記のソースプログラムから、クラスのすべてのメンバーはpublicであり、ちょうど31人のメンバーがあり、IConsoleDriverインタフェースの要件を満たしているだけであることがわかります.
    34行目から127行目までは20個の属性である、これらの属性のsetメソッド(読み取り専用属性でなければ)はすべて空であり、getメソッドも空文字列、ゼロ、null、false、true、またはConsoleColorを返すだけである.Black.
    129行目から176行目までは11の方法である、これらの方法は空であるか、nullまたはConsoleKeyInfoのみを返す.Empty.
    Null ConsoleDriverクラスはNull Object設計モデルを実践した.
    Console.dllプロジェクトにおいて、NullConsoleDriverクラスはConsoleDriver.のみである.csでは一度使用されたことがある.
     
    (未完待機)