Refactored UnicodeInfo to a static class.

This commit is contained in:
GoldenCrystal
2014-11-15 13:36:19 +01:00
parent 3373855769
commit a36caa4243
5 changed files with 39 additions and 56 deletions
@@ -12,7 +12,7 @@ namespace UnicodeCharacterInspector
{
private string character;
private int codePoint;
private UnicodeCharInfo characterInfo = UnicodeInfo.Default.GetCharInfo(0);
private UnicodeCharInfo characterInfo = UnicodeInfo.GetCharInfo(0);
public CharacterInfoViewModel()
{
@@ -40,12 +40,12 @@ namespace UnicodeCharacterInspector
if ((character = value) != null)
{
codePoint = char.ConvertToUtf32(character, 0);
characterInfo = UnicodeInfo.Default.GetCharInfo(codePoint);
characterInfo = UnicodeInfo.GetCharInfo(codePoint);
}
else
{
codePoint = 0;
characterInfo = UnicodeInfo.Default.GetCharInfo(0);
characterInfo = UnicodeInfo.GetCharInfo(0);
}
NotifyPropertyChanged();
@@ -13,9 +13,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright("Copyright © 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
#if DEBUG
[assembly: InternalsVisibleTo("UnicodeInformation.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100711da5e71bb2208797ed36597e628c6bf6541b6c157ede943539d19de5104763bd2f42d8c0233ea8fbe7e782d4e2d29c3706a8e8dc1cfa78faabec946a167f7b2b1d396d17a85839ad96f2be930c0efaa893c8b9b6a665bf50ca569b56b9eabf3a69e8274723f85e9d4c3eea1e53dcbbb29a74c78c305e447917daaa6593f1c2")]
#endif
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
@@ -243,20 +243,20 @@ namespace System.Unicode.Builder
blockEntries.Add(block);
}
public UnicodeInfo ToUnicodeData()
{
var finalUnicodeData = new UnicodeCharacterData[ucdEntryCount];
//public UnicodeInfo ToUnicodeData()
//{
// var finalUnicodeData = new UnicodeCharacterData[ucdEntryCount];
for (int i = 0; i < finalUnicodeData.Length; ++i)
finalUnicodeData[i] = ucdEntries[i].ToCharacterData();
// for (int i = 0; i < finalUnicodeData.Length; ++i)
// finalUnicodeData[i] = ucdEntries[i].ToCharacterData();
var finalUnihanData = new UnihanCharacterData[unihanEntryCount];
// var finalUnihanData = new UnihanCharacterData[unihanEntryCount];
for (int i = 0; i < finalUnihanData.Length; ++i)
finalUnihanData[i] = unihanEntries[i].ToCharacterData();
// for (int i = 0; i < finalUnihanData.Length; ++i)
// finalUnihanData[i] = unihanEntries[i].ToCharacterData();
return new UnicodeInfo(unicodeVersion, finalUnicodeData, finalUnihanData, blockEntries.ToArray());
}
// return new UnicodeInfo(unicodeVersion, finalUnicodeData, finalUnihanData, blockEntries.ToArray());
//}
private void WriteUnicodeBlockToFile(BinaryWriter writer, UnicodeBlock block)
{
@@ -45,9 +45,9 @@ namespace System.Unicode.Tests
{
var source = new FileDataSource(UcdDirectoryName);
var data = (await UnicodeDataProcessor.BuildDataAsync(source, source)).ToUnicodeData();
var data = (await UnicodeDataProcessor.BuildDataAsync(source, source));
Assert.AreEqual((int)'\t', data.GetCharInfo('\t').CodePoint);
Assert.AreEqual((int)'\t', data.GetUcd('\t').CodePointRange.FirstCodePoint);
}
[TestMethod]
@@ -61,13 +61,6 @@ namespace System.Unicode.Tests
{
data.WriteToStream(stream);
}
using (var stream = new DeflateStream(File.OpenRead("ucd.dat"), CompressionMode.Decompress, false))
{
var readData = UnicodeInfo.FromStream(stream);
Assert.AreEqual((int)'\t', data.GetUcd('\t').CodePointRange.FirstCodePoint);
}
}
#if DEBUG
+24 -32
View File
@@ -10,20 +10,22 @@ using System.Threading.Tasks;
namespace System.Unicode
{
public sealed class UnicodeInfo
public static class UnicodeInfo
{
private static readonly UnicodeInfo @default = ReadEmbeddedUnicodeData();
public static UnicodeInfo Default { get { return @default; } }
private static readonly Version unicodeVersion;
private static readonly UnicodeCharacterData[] unicodeCharacterData;
private static readonly UnihanCharacterData[] unihanCharacterData;
private static readonly UnicodeBlock[] blocks;
private static UnicodeInfo ReadEmbeddedUnicodeData()
static UnicodeInfo()
{
using (var stream = new DeflateStream(typeof(UnicodeInfo).GetTypeInfo().Assembly.GetManifestResourceStream("ucd.dat"), CompressionMode.Decompress, false))
{
return FromStream(stream);
ReadFromStream(stream, out unicodeVersion, out unicodeCharacterData, out unihanCharacterData, out blocks);
}
}
public static UnicodeInfo FromStream(Stream stream)
internal static void ReadFromStream(Stream stream, out Version unicodeVersion, out UnicodeCharacterData[] unicodeCharacterData, out UnihanCharacterData[] unihanCharacterData, out UnicodeBlock[] blocks)
{
using (var reader = new BinaryReader(stream, Encoding.UTF8))
{
@@ -36,7 +38,7 @@ namespace System.Unicode
if (formatVersion != 1) throw new InvalidDataException();
var unicodeVersion = new Version(reader.ReadUInt16(), reader.ReadByte());
var fileUnicodeVersion = new Version(reader.ReadUInt16(), reader.ReadByte());
var unicodeCharacterDataEntries = new UnicodeCharacterData[ReadCodePoint(reader)];
@@ -59,7 +61,10 @@ namespace System.Unicode
unihanCharacterDataEntries[i] = ReadUnihanCharacterDataEntry(reader);
}
return new UnicodeInfo(unicodeVersion, unicodeCharacterDataEntries, unihanCharacterDataEntries, blockEntries);
unicodeVersion = fileUnicodeVersion;
unicodeCharacterData = unicodeCharacterDataEntries;
unihanCharacterData = unihanCharacterDataEntries;
blocks = blockEntries;
}
}
@@ -181,22 +186,9 @@ namespace System.Unicode
}
}
private readonly Version unicodeVersion;
private readonly UnicodeCharacterData[] unicodeCharacterData;
private readonly UnihanCharacterData[] unihanCharacterData;
private readonly UnicodeBlock[] blockEntries;
public static Version UnicodeVersion { get { return unicodeVersion; } }
internal UnicodeInfo(Version unicodeVersion, UnicodeCharacterData[] unicodeCharacterData, UnihanCharacterData[] unihanCharacterData, UnicodeBlock[] blockEntries)
{
this.unicodeVersion = unicodeVersion;
this.unicodeCharacterData = unicodeCharacterData;
this.unihanCharacterData = unihanCharacterData;
this.blockEntries = blockEntries;
}
public Version UnicodeVersion { get { return unicodeVersion; } }
private UnicodeCharacterData FindUnicodeCodePoint(int codePoint)
private static UnicodeCharacterData FindUnicodeCodePoint(int codePoint)
{
int minIndex = 0;
int maxIndex = unicodeCharacterData.Length - 1;
@@ -215,7 +207,7 @@ namespace System.Unicode
return null;
}
private UnihanCharacterData FindUnihanCodePoint(int codePoint)
private static UnihanCharacterData FindUnihanCodePoint(int codePoint)
{
int minIndex;
int maxIndex;
@@ -239,16 +231,16 @@ namespace System.Unicode
return null;
}
private int FindBlockIndex(int codePoint)
private static int FindBlockIndex(int codePoint)
{
int minIndex = 0;
int maxIndex = blockEntries.Length - 1;
int maxIndex = blocks.Length - 1;
do
{
int index = (minIndex + maxIndex) >> 1;
int Δ = blockEntries[index].CodePointRange.CompareCodePoint(codePoint);
int Δ = blocks[index].CodePointRange.CompareCodePoint(codePoint);
if (Δ == 0) return index;
else if (Δ < 0) maxIndex = index - 1;
@@ -258,21 +250,21 @@ namespace System.Unicode
return -1;
}
private string GetBlockName(int codePoint)
private static string GetBlockName(int codePoint)
{
int i = FindBlockIndex(codePoint);
return i >= 0 ? blockEntries[i].Name : null;
return i >= 0 ? blocks[i].Name : null;
}
public UnicodeCharInfo GetCharInfo(int codePoint)
public static UnicodeCharInfo GetCharInfo(int codePoint)
{
return new UnicodeCharInfo(codePoint, FindUnicodeCodePoint(codePoint), FindUnihanCodePoint(codePoint), GetBlockName(codePoint));
}
public UnicodeBlock[] GetBlocks()
public static UnicodeBlock[] GetBlocks()
{
return (UnicodeBlock[])blockEntries.Clone();
return (UnicodeBlock[])blocks.Clone();
}
}
}