Skip to content

Commit 6a6890f

Browse files
committed
Refactor configs and constants into string and numeric variants
1 parent 5c3093b commit 6a6890f

26 files changed

Lines changed: 405 additions & 371 deletions

File tree

Src/FastData.Generator.CPlusPlus/CPlusPlusCodeGenerator.cs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,16 @@ public static CPlusPlusCodeGenerator Create(CPlusPlusCodeGeneratorConfig userCfg
2929

3030
public override GeneratorEncoding Encoding => GeneratorEncoding.UTF8;
3131

32-
public override string Generate<TKey, TValue>(GeneratorConfig<TKey> genCfg, IContext context)
32+
public override string Generate<TKey, TValue>(GeneratorConfigBase genCfg, IContext context)
3333
{
3434
//C++ generator does not support chars outside ASCII
35-
if (typeof(TKey) == typeof(char) && (char)(object)genCfg.Constants.MaxValue > 127)
35+
if (genCfg is NumericGeneratorConfig<char> cfg && cfg.Constants.MaxValue > 127)
3636
throw new InvalidOperationException("C++ generator does not support chars outside ASCII. Please use a different data type or reduce the max value to 127 or lower.");
3737

3838
return base.Generate<TKey, TValue>(genCfg, context);
3939
}
4040

41-
protected override void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorConfig<TKey> genCfg, IContext context)
41+
protected override void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorConfigBase genCfg, IContext context)
4242
{
4343
base.AppendHeader<TKey, TValue>(sb, genCfg, context);
4444

@@ -53,7 +53,7 @@ protected override void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorCo
5353
""");
5454
}
5555

56-
protected override void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConfig<TKey> genCfg, string keyTypeName, string valueTypeName, IContext context)
56+
protected override void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConfigBase genCfg, string keyTypeName, string valueTypeName, IContext context)
5757
{
5858
sb.AppendLine($$"""
5959
class {{_cfg.ClassName}} final {
@@ -62,13 +62,13 @@ class {{_cfg.ClassName}} final {
6262
base.AppendBody<TKey, TValue>(sb, genCfg, keyTypeName, valueTypeName, context);
6363
}
6464

65-
protected override void AppendFooter<T>(StringBuilder sb, GeneratorConfig<T> genCfg, string typeName)
65+
protected override void AppendFooter<T>(StringBuilder sb, GeneratorConfigBase genCfg, string typeName)
6666
{
67-
base.AppendFooter(sb, genCfg, typeName);
67+
base.AppendFooter<T>(sb, genCfg, typeName);
6868
sb.Append("};");
6969
}
7070

71-
protected override OutputWriter<TKey> GetOutputWriter<TKey, TValue>(GeneratorConfig<TKey> genCfg, IContext context) => new TemplateBasedOutputWriter<TKey, TValue>(context);
71+
protected override OutputWriter<TKey> GetOutputWriter<TKey, TValue>(GeneratorConfigBase genCfg, IContext context) => new TemplateBasedOutputWriter<TKey, TValue>(context);
7272

7373
private sealed class TemplateBasedOutputWriter<TKey, TValue>(IContext context) : OutputWriter<TKey>
7474
{
@@ -255,13 +255,8 @@ public override string Generate()
255255

256256
private string GetCompareFunction(string var1, string var2)
257257
{
258-
if (typeof(TKey) == typeof(string))
259-
{
260-
if (IgnoreCase)
261-
return $"case_insensitive_compare({var1}, {var2})";
262-
263-
return $"{var1}.compare({var2})";
264-
}
258+
if (GeneratorConfig is StringGeneratorConfig strCfg)
259+
return strCfg.IgnoreCase ? $"case_insensitive_compare({var1}, {var2})" : $"{var1}.compare({var2})";
265260

266261
return $"{var1} < {var2} ? -1 : ({var1} > {var2} ? 1 : 0)";
267262
}
@@ -271,31 +266,31 @@ protected override string GetMethodHeader(MethodType methodType)
271266
StringBuilder sb = new StringBuilder();
272267
sb.Append(base.GetMethodHeader(methodType));
273268

274-
if (TotalTrimLength != 0)
275-
sb.Append($" const auto {TrimmedKeyName} = {InputKeyName}.substr({TrimPrefix.Length.ToStringInvariant()}, {InputKeyName}.length() - {TotalTrimLength.ToStringInvariant()});");
269+
if (GeneratorConfig is StringGeneratorConfig strCfg && strCfg.TotalTrimLength != 0)
270+
sb.Append($" const auto {TrimmedKeyName} = {InputKeyName}.substr({strCfg.TrimPrefix.Length.ToStringInvariant()}, {InputKeyName}.length() - {strCfg.TotalTrimLength.ToStringInvariant()});");
276271

277272
return sb.ToString();
278273
}
279274

280-
protected override string GetEqualFunctionInternal(string value1, string value2, TypeCode keyType)
275+
protected override string GetEqualFunctionInternal(string value1, string value2, TypeCode overrideType)
281276
{
282-
if (keyType == TypeCode.String && IgnoreCase)
277+
if (GeneratorConfig is StringGeneratorConfig strCfg && strCfg.IgnoreCase)
283278
return $"case_insensitive_equals({value1}, {value2})";
284279

285280
return $"{value1} == {value2}";
286281
}
287282

288283
protected override void RegisterSharedCode()
289284
{
290-
if (typeof(TKey) != typeof(string) || !IgnoreCase)
285+
if (GeneratorConfig is not StringGeneratorConfig strCfg || !strCfg.IgnoreCase)
291286
return;
292287

293-
string helpers = Encoding switch
288+
string helpers = strCfg.Encoding switch
294289
{
295290
GeneratorEncoding.UTF16 => GetUtf16CaseInsensitiveHelpers(),
296291
GeneratorEncoding.UTF32 => GetUtf32CaseInsensitiveHelpers(),
297292
GeneratorEncoding.UTF8 or GeneratorEncoding.ASCII => GetAsciiCaseInsensitiveHelpers(),
298-
_ => throw new InvalidOperationException($"Unsupported encoding: {Encoding}")
293+
_ => throw new InvalidOperationException($"Unsupported encoding: {strCfg.Encoding}")
299294
};
300295

301296
Shared.Add(CodePlacement.Before, helpers);

Src/FastData.Generator.CPlusPlus/Internal/Framework/CPlusPlusConstantsDef.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Genbox.FastData.Generator.Framework.Interfaces;
22
using Genbox.FastData.Generators;
3+
using Genbox.FastData.Generators.Enums;
34

45
namespace Genbox.FastData.Generator.CPlusPlus.Internal.Framework;
56

Src/FastData.Generator.CSharp/CSharpCodeGenerator.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public static CSharpCodeGenerator Create(CSharpCodeGeneratorConfig userCfg)
3333

3434
public override GeneratorEncoding Encoding => GeneratorEncoding.UTF16;
3535

36-
protected override void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorConfig<TKey> genCfg, IContext context)
36+
protected override void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorConfigBase genCfg, IContext context)
3737
{
3838
sb.AppendLine("// <auto-generated />");
3939
base.AppendHeader<TKey, TValue>(sb, genCfg, context);
@@ -47,7 +47,7 @@ protected override void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorCo
4747
""");
4848
}
4949

50-
protected override void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConfig<TKey> genCfg, string keyTypeName, string valueTypeName, IContext context)
50+
protected override void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConfigBase genCfg, string keyTypeName, string valueTypeName, IContext context)
5151
{
5252
string cn = _cfg.ClassName;
5353
string? ns = _cfg.Namespace != null ? $"namespace {_cfg.Namespace};\n\n" : null;
@@ -73,14 +73,14 @@ protected override void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConf
7373
base.AppendBody<TKey, TValue>(sb, genCfg, keyTypeName, valueTypeName, context);
7474
}
7575

76-
protected override void AppendFooter<T>(StringBuilder sb, GeneratorConfig<T> genCfg, string typeName)
76+
protected override void AppendFooter<T>(StringBuilder sb, GeneratorConfigBase genCfg, string typeName)
7777
{
78-
base.AppendFooter(sb, genCfg, typeName);
78+
base.AppendFooter<T>(sb, genCfg, typeName);
7979

8080
sb.Append('}');
8181
}
8282

83-
protected override OutputWriter<TKey> GetOutputWriter<TKey, TValue>(GeneratorConfig<TKey> genCfg, IContext context) => new TemplateBasedOutputWriter<TKey, TValue>(context, _cfg);
83+
protected override OutputWriter<TKey> GetOutputWriter<TKey, TValue>(GeneratorConfigBase genCfg, IContext context) => new TemplateBasedOutputWriter<TKey, TValue>(context, _cfg);
8484

8585
private sealed class TemplateBasedOutputWriter<TKey, TValue>(IContext context, CSharpCodeGeneratorConfig cfg) : OutputWriter<TKey>
8686
{
@@ -277,16 +277,16 @@ private string GetMethodAttribute()
277277

278278
private string GetCompareFunction(string var1, string var2)
279279
{
280-
if (typeof(TKey) == typeof(string))
281-
return $"StringComparer.{StringHelper.GetStringComparer(IgnoreCase)}.Compare({var1}, {var2})";
280+
if (GeneratorConfig is StringGeneratorConfig strCfg)
281+
return $"StringComparer.{StringHelper.GetStringComparer(strCfg.IgnoreCase)}.Compare({var1}, {var2})";
282282

283283
return $"{var1}.CompareTo({var2})";
284284
}
285285

286-
protected override string GetEqualFunctionInternal(string var1, string var2, TypeCode keyType)
286+
protected override string GetEqualFunctionInternal(string var1, string var2, TypeCode overrideType)
287287
{
288-
if (keyType == TypeCode.String)
289-
return $"StringComparer.{StringHelper.GetStringComparer(IgnoreCase)}.Equals({var1}, {var2})";
288+
if (overrideType == TypeCode.String && GeneratorConfig is StringGeneratorConfig strCfg)
289+
return $"StringComparer.{StringHelper.GetStringComparer(strCfg.IgnoreCase)}.Equals({var1}, {var2})";
290290

291291
return $"{var1} == {var2}";
292292
}
@@ -296,8 +296,8 @@ protected override string GetMethodHeader(MethodType methodType)
296296
StringBuilder sb = new StringBuilder();
297297
sb.Append(base.GetMethodHeader(methodType));
298298

299-
if (TotalTrimLength != 0)
300-
sb.Append($" string {TrimmedKeyName} = {InputKeyName}.Substring({TrimPrefix.Length.ToStringInvariant()}, {InputKeyName}.Length - {TotalTrimLength.ToStringInvariant()});");
299+
if (GeneratorConfig is StringGeneratorConfig strCfg && strCfg.TotalTrimLength != 0)
300+
sb.Append($" string {TrimmedKeyName} = {InputKeyName}.Substring({strCfg.TrimPrefix.Length.ToStringInvariant()}, {InputKeyName}.Length - {strCfg.TotalTrimLength.ToStringInvariant()});");
301301

302302
return sb.ToString();
303303
}

Src/FastData.Generator.CSharp/Internal/Framework/CSharpConstantsDef.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Genbox.FastData.Generator.Framework.Interfaces;
22
using Genbox.FastData.Generators;
3+
using Genbox.FastData.Generators.Enums;
34

45
namespace Genbox.FastData.Generator.CSharp.Internal.Framework;
56

Src/FastData.Generator.Rust/Internal/Framework/RustConstantsDef.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Genbox.FastData.Generator.Framework.Interfaces;
22
using Genbox.FastData.Generators;
3+
using Genbox.FastData.Generators.Enums;
34

45
namespace Genbox.FastData.Generator.Rust.Internal.Framework;
56

Src/FastData.Generator.Rust/RustCodeGenerator.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public static RustCodeGenerator Create(RustCodeGeneratorConfig userCfg)
2929

3030
public override GeneratorEncoding Encoding => GeneratorEncoding.UTF8;
3131

32-
protected override void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorConfig<TKey> genCfg, IContext context)
32+
protected override void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorConfigBase genCfg, IContext context)
3333
{
3434
base.AppendHeader<TKey, TValue>(sb, genCfg, context);
3535

@@ -45,7 +45,7 @@ protected override void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorCo
4545
""");
4646
}
4747

48-
protected override void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConfig<TKey> genCfg, string keyTypeName, string valueTypeName, IContext context)
48+
protected override void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConfigBase genCfg, string keyTypeName, string valueTypeName, IContext context)
4949
{
5050
sb.Append($$"""
5151
@@ -56,14 +56,14 @@ protected override void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConf
5656
base.AppendBody<TKey, TValue>(sb, genCfg, keyTypeName, valueTypeName, context);
5757
}
5858

59-
protected override void AppendFooter<T>(StringBuilder sb, GeneratorConfig<T> genCfg, string typeName)
59+
protected override void AppendFooter<T>(StringBuilder sb, GeneratorConfigBase genCfg, string typeName)
6060
{
61-
base.AppendFooter(sb, genCfg, typeName);
61+
base.AppendFooter<T>(sb, genCfg, typeName);
6262

6363
sb.Append('}');
6464
}
6565

66-
protected override OutputWriter<TKey> GetOutputWriter<TKey, TValue>(GeneratorConfig<TKey> genCfg, IContext context) => new TemplateBasedOutputWriter<TKey, TValue>(context);
66+
protected override OutputWriter<TKey> GetOutputWriter<TKey, TValue>(GeneratorConfigBase genCfg, IContext context) => new TemplateBasedOutputWriter<TKey, TValue>(context);
6767

6868
private sealed class TemplateBasedOutputWriter<TKey, TValue>(IContext context) : OutputWriter<TKey>
6969
{
@@ -249,7 +249,7 @@ public override string Generate()
249249

250250
private string GetCompareFunction(string var1, string var2)
251251
{
252-
if (typeof(TKey) == typeof(string) && IgnoreCase)
252+
if (GeneratorConfig is StringGeneratorConfig strCfg && strCfg.IgnoreCase)
253253
return $"case_insensitive_compare({var1}, {var2})";
254254

255255
return $"if {var1} < {var2} {{ -1 }} else if {var1} > {var2} {{ 1 }} else {{ 0 }}";
@@ -260,23 +260,23 @@ protected override string GetMethodHeader(MethodType methodType)
260260
StringBuilder sb = new StringBuilder();
261261
sb.Append(base.GetMethodHeader(methodType));
262262

263-
if (TotalTrimLength != 0)
264-
sb.Append($" let {TrimmedKeyName} = &{InputKeyName}[{TrimPrefix.Length.ToStringInvariant()}..{InputKeyName}.len() - {TrimSuffix.Length.ToStringInvariant()}];");
263+
if (GeneratorConfig is StringGeneratorConfig strCfg && strCfg.TotalTrimLength != 0)
264+
sb.Append($" let {TrimmedKeyName} = &{InputKeyName}[{strCfg.TrimPrefix.Length.ToStringInvariant()}..{InputKeyName}.len() - {strCfg.TrimSuffix.Length.ToStringInvariant()}];");
265265

266266
return sb.ToString();
267267
}
268268

269-
protected override string GetEqualFunctionInternal(string value1, string value2, TypeCode keyType)
269+
protected override string GetEqualFunctionInternal(string value1, string value2, TypeCode overrideType)
270270
{
271-
if (keyType == TypeCode.String && IgnoreCase)
271+
if (GeneratorConfig is StringGeneratorConfig strCfg && strCfg.IgnoreCase)
272272
return $"case_insensitive_equals({value1}, {value2})";
273273

274274
return $"{value1} == {value2}";
275275
}
276276

277277
protected override void RegisterSharedCode()
278278
{
279-
if (typeof(TKey) != typeof(string) || !IgnoreCase)
279+
if (GeneratorConfig is not StringGeneratorConfig strCfg || !strCfg.IgnoreCase)
280280
return;
281281

282282
Shared.Add(CodePlacement.Before, """

Src/FastData.Generator.Template/Helpers/TemplateHelper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Text;
33
using Genbox.FastData.Generator.Framework;
44
using Genbox.FastData.Generator.Helpers;
5+
using Genbox.FastData.Generators;
56
using Microsoft.VisualStudio.TextTemplating;
67
using Mono.TextTemplating;
78

Src/FastData.Generator/Framework/CodeGenerator.cs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public abstract class CodeGenerator(ILanguageDef langDef, IConstantsDef constDef
1616

1717
public abstract GeneratorEncoding Encoding { get; }
1818

19-
public virtual string Generate<TKey, TValue>(GeneratorConfig<TKey> genCfg, IContext context)
19+
public virtual string Generate<TKey, TValue>(GeneratorConfigBase genCfg, IContext context)
2020
{
2121
Shared.Clear();
2222

@@ -32,7 +32,7 @@ public virtual string Generate<TKey, TValue>(GeneratorConfig<TKey> genCfg, ICont
3232
AppendBody<TKey, TValue>(body, genCfg, keyTypeName, valueTypeName, context);
3333

3434
StringBuilder footer = new StringBuilder();
35-
AppendFooter(footer, genCfg, keyTypeName);
35+
AppendFooter<TKey>(footer, genCfg, keyTypeName);
3636

3737
foreach (string code in Shared.GetType(CodePlacement.After))
3838
footer.AppendLine(code);
@@ -48,9 +48,9 @@ public virtual string Generate<TKey, TValue>(GeneratorConfig<TKey> genCfg, ICont
4848
return final.ToString();
4949
}
5050

51-
protected abstract OutputWriter<TKey>? GetOutputWriter<TKey, TValue>(GeneratorConfig<TKey> genCfg, IContext context);
51+
protected abstract OutputWriter<TKey>? GetOutputWriter<TKey, TValue>(GeneratorConfigBase genCfg, IContext context);
5252

53-
protected virtual void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorConfig<TKey> genCfg, IContext context)
53+
protected virtual void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorConfigBase genCfg, IContext context)
5454
{
5555
sb.Append(constDef.Comment).Append(' ').AppendLine("This file is auto-generated. Do not edit manually.");
5656
sb.Append(constDef.Comment).Append(' ').AppendLine($"Structure: {genCfg.StructureType.GetCleanName().Replace("Structure", "")}");
@@ -61,7 +61,7 @@ protected virtual void AppendHeader<TKey, TValue>(StringBuilder sb, GeneratorCon
6161
#endif
6262
}
6363

64-
protected virtual void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConfig<TKey> genCfg, string keyTypeName, string valueTypeName, IContext context)
64+
protected virtual void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConfigBase genCfg, string keyTypeName, string valueTypeName, IContext context)
6565
{
6666
OutputWriter<TKey>? writer = GetOutputWriter<TKey, TValue>(genCfg, context);
6767

@@ -145,24 +145,22 @@ protected virtual void AppendBody<TKey, TValue>(StringBuilder sb, GeneratorConfi
145145
}
146146
}
147147

148-
protected virtual void AppendFooter<T>(StringBuilder sb, GeneratorConfig<T> genCfg, string typeName)
148+
protected virtual void AppendFooter<T>(StringBuilder sb, GeneratorConfigBase genCfg, string typeName)
149149
{
150150
sb.AppendLine();
151151
sb.AppendLine();
152-
sb.AppendLine(constDef.ItemCountTemplate(langDef.ArraySizeType, genCfg.Constants.ItemCount.ToStringInvariant()));
152+
sb.AppendLine(constDef.ItemCountTemplate(langDef.ArraySizeType, genCfg.ItemCount.ToStringInvariant()));
153153

154-
Type keyType = typeof(T);
155-
156-
if (keyType.IsNumeric())
154+
if (genCfg is NumericGeneratorConfig<T> numericCfg)
157155
{
158-
sb.AppendLine(constDef.MinValueTemplate(typeName, map.ToValueLabel(genCfg.Constants.MinValue)));
159-
sb.AppendLine(constDef.MaxValueTemplate(typeName, map.ToValueLabel(genCfg.Constants.MaxValue)));
156+
sb.AppendLine(constDef.MinValueTemplate(typeName, map.ToValueLabel(numericCfg.Constants.MinValue)));
157+
sb.AppendLine(constDef.MaxValueTemplate(typeName, map.ToValueLabel(numericCfg.Constants.MaxValue)));
160158
}
161-
else if (Type.GetTypeCode(keyType) == TypeCode.String)
159+
else if (genCfg is StringGeneratorConfig stringCfg)
162160
{
163-
sb.AppendLine(constDef.MinLengthTemplate(langDef.ArraySizeType, genCfg.Constants.MinStringLength.ToStringInvariant()));
164-
sb.AppendLine(constDef.MaxLengthTemplate(langDef.ArraySizeType, genCfg.Constants.MaxStringLength.ToStringInvariant()));
165-
sb.AppendLine(constDef.CharacterClassesTemplate(genCfg.Constants.CharacterClasses));
161+
sb.AppendLine(constDef.MinLengthTemplate(langDef.ArraySizeType, stringCfg.Constants.MinStringLength.ToStringInvariant()));
162+
sb.AppendLine(constDef.MaxLengthTemplate(langDef.ArraySizeType, stringCfg.Constants.MaxStringLength.ToStringInvariant()));
163+
sb.AppendLine(constDef.CharacterClassesTemplate(stringCfg.Constants.CharacterClasses));
166164
}
167165
}
168166
}

Src/FastData.Generator/Framework/Interfaces/IConstantsDef.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Genbox.FastData.Generators;
2+
using Genbox.FastData.Generators.Enums;
23

34
namespace Genbox.FastData.Generator.Framework.Interfaces;
45

0 commit comments

Comments
 (0)