From 9673664147a9e80be39bf511f0c39f8d0f4aa850 Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 11 Aug 2021 17:26:36 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BC=98=E5=8C=96=E3=80=91=E5=AF=B9?= =?UTF-8?q?=E4=BA=8E=20DBool,DInt,DLong,DString,DFloat=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=AF=B9=E8=B1=A1=E6=B1=A0=E3=80=82=E7=95=A5=E5=BE=AE?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E4=B8=8B=E6=80=A7=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/DataCreators/ExcelDataCreator.cs | 18 +++++++-------- .../Source/DataCreators/JsonDataCreator.cs | 8 +++---- .../Source/DataCreators/LuaDataCreator.cs | 8 +++---- .../Source/DataCreators/StringDataCreator.cs | 8 +++---- .../Source/DataCreators/XmlDataCreator.cs | 8 +++---- src/Luban.Job.Cfg/Source/Datas/DBool.cs | 11 +++++++++- src/Luban.Job.Cfg/Source/Datas/DFloat.cs | 13 +++++++++-- src/Luban.Job.Cfg/Source/Datas/DInt.cs | 22 +++++++++++++++++-- src/Luban.Job.Cfg/Source/Datas/DLong.cs | 22 ++++++++++++++++++- src/Luban.Job.Cfg/Source/Datas/DString.cs | 11 ++++++++++ 10 files changed, 98 insertions(+), 31 deletions(-) diff --git a/src/Luban.Job.Cfg/Source/DataCreators/ExcelDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/ExcelDataCreator.cs index 4c9c8e5..3d80727 100644 --- a/src/Luban.Job.Cfg/Source/DataCreators/ExcelDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/DataCreators/ExcelDataCreator.cs @@ -101,9 +101,9 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return new DBool(false); + return DBool.ValueOf(false); } - return new DBool(CreateBool(d)); + return DBool.ValueOf(CreateBool(d)); } public DType Accept(TByte type, object converter, ExcelStream x, DefAssembly ass) @@ -185,21 +185,21 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DInt.Default; + return DInt.ValueOf(0); } var ds = d.ToString(); if (converter is TEnum te) { if (te.DefineEnum.TryValueByNameOrAlias(ds, out var c)) { - return new DInt(c); + return DInt.ValueOf(c); } } if (!int.TryParse(ds, out var v)) { throw new InvalidExcelDataException($"{d} 不是 int 类型值"); } - return new DInt(v); + return DInt.ValueOf(v); } public DType Accept(TFint type, object converter, ExcelStream x, DefAssembly ass) @@ -252,14 +252,14 @@ namespace Luban.Job.Cfg.DataCreators { if (te.DefineEnum.TryValueByNameOrAlias(ds, out var c)) { - return new DLong(c); + return DLong.ValueOf(c); } } if (!long.TryParse(ds, out var v)) { throw new InvalidExcelDataException($"{d} 不是 long 类型值"); } - return new DLong(v); + return DLong.ValueOf(v); } public DType Accept(TFlong type, object converter, ExcelStream x, DefAssembly ass) @@ -305,13 +305,13 @@ namespace Luban.Job.Cfg.DataCreators } if (CheckIsDefault(x.NamedMode, d)) { - return DFloat.Default; + return DFloat.ValueOf(0); } if (!float.TryParse(d.ToString(), out var v)) { throw new InvalidExcelDataException($"{d} 不是 float 类型值"); } - return new DFloat(v); + return DFloat.ValueOf(v); } public DType Accept(TDouble type, object converter, ExcelStream x, DefAssembly ass) diff --git a/src/Luban.Job.Cfg/Source/DataCreators/JsonDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/JsonDataCreator.cs index 26f9c48..19d3718 100644 --- a/src/Luban.Job.Cfg/Source/DataCreators/JsonDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/DataCreators/JsonDataCreator.cs @@ -16,7 +16,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TBool type, JsonElement x, DefAssembly ass) { - return new DBool(x.GetBoolean()); + return DBool.ValueOf(x.GetBoolean()); } public DType Accept(TByte type, JsonElement x, DefAssembly ass) @@ -36,7 +36,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TInt type, JsonElement x, DefAssembly ass) { - return new DInt(x.GetInt32()); + return DInt.ValueOf(x.GetInt32()); } public DType Accept(TFint type, JsonElement x, DefAssembly ass) @@ -46,7 +46,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TLong type, JsonElement x, DefAssembly ass) { - return new DLong(x.GetInt64()); + return DLong.ValueOf(x.GetInt64()); } public DType Accept(TFlong type, JsonElement x, DefAssembly ass) @@ -56,7 +56,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TFloat type, JsonElement x, DefAssembly ass) { - return new DFloat(x.GetSingle()); + return DFloat.ValueOf(x.GetSingle()); } public DType Accept(TDouble type, JsonElement x, DefAssembly ass) diff --git a/src/Luban.Job.Cfg/Source/DataCreators/LuaDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/LuaDataCreator.cs index 54be78d..4715d45 100644 --- a/src/Luban.Job.Cfg/Source/DataCreators/LuaDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/DataCreators/LuaDataCreator.cs @@ -17,7 +17,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TBool type, object x, DefAssembly ass) { - return new DBool((bool)x); + return DBool.ValueOf((bool)x); } public DType Accept(TByte type, object x, DefAssembly ass) @@ -37,7 +37,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TInt type, object x, DefAssembly ass) { - return new DInt((int)x); + return DInt.ValueOf((int)x); } public DType Accept(TFint type, object x, DefAssembly ass) @@ -83,7 +83,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TLong type, object x, DefAssembly ass) { - return new DLong(ToLong(x)); + return DLong.ValueOf(ToLong(x)); } public DType Accept(TFlong type, object x, DefAssembly ass) @@ -93,7 +93,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TFloat type, object x, DefAssembly ass) { - return new DFloat(ToFloat(x)); + return DFloat.ValueOf(ToFloat(x)); } public DType Accept(TDouble type, object x, DefAssembly ass) diff --git a/src/Luban.Job.Cfg/Source/DataCreators/StringDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/StringDataCreator.cs index 3505d3f..fd469cd 100644 --- a/src/Luban.Job.Cfg/Source/DataCreators/StringDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/DataCreators/StringDataCreator.cs @@ -14,7 +14,7 @@ namespace Luban.Job.Cfg.DataCreators { if (bool.TryParse(x, out var b)) { - return new DBool(b); + return DBool.ValueOf(b); } else { @@ -62,7 +62,7 @@ namespace Luban.Job.Cfg.DataCreators { if (int.TryParse(x, out var b)) { - return new DInt(b); + return DInt.ValueOf(b); } else { @@ -86,7 +86,7 @@ namespace Luban.Job.Cfg.DataCreators { if (long.TryParse(x, out var b)) { - return new DLong(b); + return DLong.ValueOf(b); } else { @@ -110,7 +110,7 @@ namespace Luban.Job.Cfg.DataCreators { if (float.TryParse(x, out var b)) { - return new DFloat(b); + return DFloat.ValueOf(b); } else { diff --git a/src/Luban.Job.Cfg/Source/DataCreators/XmlDataCreator.cs b/src/Luban.Job.Cfg/Source/DataCreators/XmlDataCreator.cs index 53c6228..2cdf27e 100644 --- a/src/Luban.Job.Cfg/Source/DataCreators/XmlDataCreator.cs +++ b/src/Luban.Job.Cfg/Source/DataCreators/XmlDataCreator.cs @@ -17,7 +17,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TBool type, XElement x, DefAssembly ass) { - return new DBool(bool.Parse(x.Value.Trim().ToLower())); + return DBool.ValueOf(bool.Parse(x.Value.Trim().ToLower())); } public DType Accept(TByte type, XElement x, DefAssembly ass) @@ -37,7 +37,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TInt type, XElement x, DefAssembly ass) { - return new DInt(int.Parse(x.Value.Trim())); + return DInt.ValueOf(int.Parse(x.Value.Trim())); } public DType Accept(TFint type, XElement x, DefAssembly ass) @@ -47,7 +47,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TLong type, XElement x, DefAssembly ass) { - return new DLong(long.Parse(x.Value.Trim())); + return DLong.ValueOf(long.Parse(x.Value.Trim())); } public DType Accept(TFlong type, XElement x, DefAssembly ass) @@ -57,7 +57,7 @@ namespace Luban.Job.Cfg.DataCreators public DType Accept(TFloat type, XElement x, DefAssembly ass) { - return new DFloat(float.Parse(x.Value.Trim())); + return DFloat.ValueOf(float.Parse(x.Value.Trim())); } public DType Accept(TDouble type, XElement x, DefAssembly ass) diff --git a/src/Luban.Job.Cfg/Source/Datas/DBool.cs b/src/Luban.Job.Cfg/Source/Datas/DBool.cs index 2eefee2..1b41968 100644 --- a/src/Luban.Job.Cfg/Source/Datas/DBool.cs +++ b/src/Luban.Job.Cfg/Source/Datas/DBool.cs @@ -4,7 +4,16 @@ namespace Luban.Job.Cfg.Datas { public class DBool : DType { - public DBool(bool x) : base(x) + + private static readonly DBool s_false = new DBool(false); + private static readonly DBool s_true = new DBool(true); + + public static DBool ValueOf(bool x) + { + return x ? s_true : s_false; + } + + private DBool(bool x) : base(x) { } diff --git a/src/Luban.Job.Cfg/Source/Datas/DFloat.cs b/src/Luban.Job.Cfg/Source/Datas/DFloat.cs index aec0357..3e6d51f 100644 --- a/src/Luban.Job.Cfg/Source/Datas/DFloat.cs +++ b/src/Luban.Job.Cfg/Source/Datas/DFloat.cs @@ -4,9 +4,18 @@ namespace Luban.Job.Cfg.Datas { public class DFloat : DType { - public static DFloat Default { get; } = new DFloat(0); + private static DFloat Default { get; } = new DFloat(0); - public DFloat(float x) : base(x) + public static DFloat ValueOf(float x) + { + if (x == 0) + { + return Default; + } + return new DFloat(x); + } + + private DFloat(float x) : base(x) { } diff --git a/src/Luban.Job.Cfg/Source/Datas/DInt.cs b/src/Luban.Job.Cfg/Source/Datas/DInt.cs index f3dd7a6..876d05b 100644 --- a/src/Luban.Job.Cfg/Source/Datas/DInt.cs +++ b/src/Luban.Job.Cfg/Source/Datas/DInt.cs @@ -4,9 +4,27 @@ namespace Luban.Job.Cfg.Datas { public class DInt : DType { - public static DInt Default { get; } = new DInt(0); + private const int POOL_SIZE = 128; + private static readonly DInt[] s_pool = new DInt[POOL_SIZE]; - public DInt(int x) : base(x) + static DInt() + { + for (int i = 0; i < POOL_SIZE; i++) + { + s_pool[i] = new DInt(i); + } + } + + public static DInt ValueOf(int x) + { + if (x >= 0 && x < POOL_SIZE) + { + return s_pool[x]; + } + return new DInt(x); + } + + private DInt(int x) : base(x) { } diff --git a/src/Luban.Job.Cfg/Source/Datas/DLong.cs b/src/Luban.Job.Cfg/Source/Datas/DLong.cs index 4608413..c200512 100644 --- a/src/Luban.Job.Cfg/Source/Datas/DLong.cs +++ b/src/Luban.Job.Cfg/Source/Datas/DLong.cs @@ -5,8 +5,28 @@ namespace Luban.Job.Cfg.Datas public class DLong : DType { public static DLong Default { get; } = new DLong(0); + private const int POOL_SIZE = 128; + private static readonly DLong[] s_pool = new DLong[POOL_SIZE]; - public DLong(long x) : base(x) + static DLong() + { + for (int i = 0; i < POOL_SIZE; i++) + { + s_pool[i] = new DLong(i); + } + } + + public static DLong ValueOf(long x) + { + if (x >= 0 && x < POOL_SIZE) + { + return s_pool[x]; + } + return new DLong(x); + } + + + private DLong(long x) : base(x) { } diff --git a/src/Luban.Job.Cfg/Source/Datas/DString.cs b/src/Luban.Job.Cfg/Source/Datas/DString.cs index efc757b..ed57e41 100644 --- a/src/Luban.Job.Cfg/Source/Datas/DString.cs +++ b/src/Luban.Job.Cfg/Source/Datas/DString.cs @@ -4,6 +4,17 @@ namespace Luban.Job.Cfg.Datas { public class DString : DType { + private static readonly DString s_empty = new DString(""); + + public static DString ValueOf(string s) + { + if (s.Length == 0) + { + return s_empty; + } + return new DString(s); + } + public DString(string x) : base(x) { }