OSDN Git Service

MMFへのアクセスをアンマネージドポインタ経由として高速化
[nmecab/NMeCabRepo2.git] / src / LibNMeCab / Core / StrUtils.cs
index b73333f..22c276e 100644 (file)
-using System;\r
-using System.Collections.Generic;\r
-using System.Text;\r
-#if MMF_DIC\r
-using System.IO.MemoryMappedFiles;\r
-#endif\r
-\r
-namespace NMeCab.Core\r
-{\r
-    public static class StrUtils\r
-    {\r
-        private const byte Nul = (byte)0;\r
-\r
-        /// <summary>\r
-        /// バイト配列の中から終端が\0で表された文字列を取り出す。\r
-        /// </summary>\r
-        /// <remarks>\r
-        /// バイト配列の長さはInt32.MaxValueを超えていても良い。\r
-        /// </remarks>\r
-        /// <param name="bytes">バイト配列</param>\r
-        /// <param name="enc">文字エンコーディング</param>\r
-        /// <returns>文字列(\0は含まない)</returns>\r
-        public static string GetString(byte[] bytes, Encoding enc)\r
-        {\r
-            return StrUtils.GetString(bytes, 0L, enc);\r
-        }\r
-\r
-        /// <summary>\r
-        /// バイト配列の中から終端が\0で表された文字列を取り出す。\r
-        /// </summary>\r
-        /// <remarks>\r
-        /// バイト配列の長さはInt32.MaxValueを超えていても良い。\r
-        /// </remarks>\r
-        /// <param name="bytes">バイト配列</param>\r
-        /// <param name="offset">オフセット位置</param>\r
-        /// <param name="enc">文字エンコーディング</param>\r
-        /// <returns>文字列(\0は含まない)</returns>\r
-        public unsafe static string GetString(byte[] bytes, long offset, Encoding enc)\r
-        {\r
-            fixed (byte* pBytes = bytes)\r
-                return StrUtils.GetString(pBytes + offset, enc);\r
-        }\r
-\r
-        /// <summary>\r
-        /// バイト配列の中から終端が\0で表された文字列を取り出す。\r
-        /// </summary>\r
-        /// <remarks>\r
-        /// バイト配列の長さはInt32.MaxValueを超えていても良い。\r
-        /// </remarks>\r
-        /// <param name="bytes">デコードする最初のバイトへのポインタ</param>\r
-        /// <param name="enc">文字エンコーディング</param>\r
-        /// <returns>文字列(\0は含まない)</returns>\r
-        public unsafe static string GetString(byte* bytes, Encoding enc)\r
-        {\r
-            //バイト長のカウント\r
-            int byteCount = 0;\r
-            while (*bytes != Nul) //終端\0に到達するまでシーク\r
-            {\r
-                checked { byteCount++; } //文字列のバイト長がInt32.MaxValueを超えたならエラー\r
-                bytes++;\r
-            }\r
-            bytes -= byteCount;\r
-\r
-            //生成されうる最大文字数のバッファを確保\r
-            int maxCharCount = enc.GetMaxCharCount(byteCount);\r
-            fixed (char* buff = new char[maxCharCount])\r
-            {\r
-                //バイト配列を文字列にデコード\r
-                int len = enc.GetChars(bytes, byteCount, buff, maxCharCount);\r
-                return new string(buff, 0, len);\r
-            }\r
-        }\r
-\r
-#if MMF_DIC\r
-\r
-        /// <summary>\r
-        /// MemoryMappedViewAccessorから終端が\0で表された文字列を取り出す。\r
-        /// </summary>\r
-        /// <remarks>\r
-        /// MemoryMappedViewAccessorの容量はInt32.MaxValueを超えていても良い。\r
-        /// </remarks>\r
-        /// <param name="accessor">MemoryMappedViewAccessor</param>\r
-        /// <param name="index">オフセット位置</param>\r
-        /// <param name="enc">文字エンコーディング</param>\r
-        /// <param name="buffSize">内部で使用するバッファの初期サイズ</param>\r
-        /// <returns>文字列(\0は含まない)</returns>\r
-        public static string GetString(MemoryMappedViewAccessor accessor, long offset, Encoding enc,\r
-                                        int buffSize = 128)\r
-        {\r
-            byte[] buff = new byte[buffSize]; //IO回数削減のためのバッファ配列\r
-            accessor.ReadArray<byte>(offset, buff, 0, buffSize); //初期読込\r
-\r
-            //バイト長のカウント\r
-            int byteCount = 0;\r
-            while (buff[byteCount] != Nul) //終端\0に到達するまでシーク\r
-            {\r
-                byteCount++;\r
-\r
-                if (byteCount == buffSize) //バッファ配列の終端\r
-                {\r
-                    //バッファ配列の拡張と追加読込\r
-                    checked { buffSize *= 2; } //Int32.MaxValueを超えたならエラー\r
-                    byte[] newBuff = new byte[buffSize];\r
-                    Buffer.BlockCopy(buff, 0, newBuff, 0, byteCount);\r
-                    accessor.ReadArray<byte>(offset + byteCount, newBuff, byteCount, buffSize - byteCount);\r
-                    buff = newBuff;\r
-                }\r
-            }\r
-\r
-            //バッファ配列を文字列にデコード\r
-            return enc.GetString(buff, 0, byteCount);\r
-        }\r
-\r
-#endif\r
-\r
-    }\r
-}\r
+using System;
+using System.Collections.Generic;
+using System.Text;
+#if MMF_DIC
+using System.IO.MemoryMappedFiles;
+#endif
+
+namespace NMeCab.Core
+{
+    public static class StrUtils
+    {
+        private const byte Nul = (byte)0;
+
+        /// <summary>
+        /// バイト配列の中から終端が\0で表された文字列を取り出す。
+        /// </summary>
+        /// <remarks>
+        /// バイト配列の長さはInt32.MaxValueを超えていても良い。
+        /// </remarks>
+        /// <param name="bytes">バイト配列</param>
+        /// <param name="enc">文字エンコーディング</param>
+        /// <returns>文字列(\0は含まない)</returns>
+        public static string GetString(byte[] bytes, Encoding enc)
+        {
+            return StrUtils.GetString(bytes, 0L, enc);
+        }
+
+        /// <summary>
+        /// バイト配列の中から終端が\0で表された文字列を取り出す。
+        /// </summary>
+        /// <remarks>
+        /// バイト配列の長さはInt32.MaxValueを超えていても良い。
+        /// </remarks>
+        /// <param name="bytes">バイト配列</param>
+        /// <param name="offset">オフセット位置</param>
+        /// <param name="enc">文字エンコーディング</param>
+        /// <returns>文字列(\0は含まない)</returns>
+        public unsafe static string GetString(byte[] bytes, long offset, Encoding enc)
+        {
+            fixed (byte* pBytes = bytes)
+                return StrUtils.GetString(pBytes, offset, enc);
+        }
+
+        /// <summary>
+        /// バイト配列の中から終端が\0で表された文字列を取り出す。
+        /// </summary>
+        /// <remarks>
+        /// バイト配列の長さはInt32.MaxValueを超えていても良い。
+        /// </remarks>
+        /// <param name="bytes">デコードするバイトへのポインタ</param>
+        /// <param name="offset">オフセット位置</param>
+        /// <param name="enc">文字エンコーディング</param>
+        /// <returns>文字列(\0は含まない)</returns>
+        public unsafe static string GetString(byte* bytes, long offset, Encoding enc)
+        {
+            return StrUtils.GetString(bytes + offset, enc);
+        }
+        /// <summary>
+        /// バイト配列の中から終端が\0で表された文字列を取り出す。
+        /// </summary>
+        /// <remarks>
+        /// バイト配列の長さはInt32.MaxValueを超えていても良い。
+        /// </remarks>
+        /// <param name="bytes">デコードする最初のバイトへのポインタ</param>
+        /// <param name="enc">文字エンコーディング</param>
+        /// <returns>文字列(\0は含まない)</returns>
+        public unsafe static string GetString(byte* bytes, Encoding enc)
+        {
+            //バイト長のカウント
+            int byteCount = 0;
+            while (bytes[byteCount] != Nul) //終端\0に到達するまでシーク
+            {
+                checked { byteCount++; } //文字列のバイト長がInt32.MaxValueを超えたならエラー
+            }
+
+            if (byteCount == 0)
+                return "";
+
+            //生成されうる最大文字数のバッファを確保
+            int maxCharCount = enc.GetMaxCharCount(byteCount);
+            fixed (char* buff = new char[maxCharCount])
+            {
+                //バイト配列を文字列にデコード
+                int len = enc.GetChars(bytes, byteCount, buff, maxCharCount);
+                return new string(buff, 0, len);
+            }
+        }
+
+        /// <summary>
+        /// 指定の名前に対応するエンコーディングを取得する(.NET FWが対応していない名前にもアドホックに対応)
+        /// </summary>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        public static Encoding GetEncoding(string name)
+        {
+            switch (name.ToUpper())
+            {
+                case "UTF8":
+                    return Encoding.UTF8;
+                default:
+                    return Encoding.GetEncoding(name);
+            }
+        }
+    }
+}