Skip to content

Commit 26b6cc8

Browse files
committed
Array2D improvements
1 parent 026b181 commit 26b6cc8

11 files changed

+100
-29
lines changed

Loqui.Generation/Fields/Array2dType.cs

+18-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public override string ListTypeName(bool getter, bool internalInterface)
5353
}
5454
protected override string GetActualItemClass(bool ctor = false)
5555
{
56-
return $"new Array2d<{ItemTypeName(getter: false)}>{(ctor ? $"({FixedSize.Value.X}, {FixedSize.Value.Y})" : null)}";
56+
return $"new Array2d<{ItemTypeName(getter: false)}>{(ctor ? $"({FixedSize.Value.X}, {FixedSize.Value.Y}, {SubTypeGeneration.GetDefault(getter: false)})" : null)}";
5757
}
5858

5959
public override void GenerateClear(StructuredStringBuilder sb, Accessor accessor)
@@ -68,6 +68,23 @@ public override void GenerateClear(StructuredStringBuilder sb, Accessor accessor
6868
}
6969
}
7070

71+
public override void GenerateForEquals(StructuredStringBuilder sb, Accessor accessor, Accessor rhsAccessor, Accessor maskAccessor)
72+
{
73+
sb.AppendLine($"if ({GetTranslationIfAccessor(maskAccessor)})");
74+
using (sb.CurlyBrace())
75+
{
76+
if (SubTypeGeneration is LoquiType subLoq
77+
&& subLoq.TargetObjectGeneration != null)
78+
{
79+
sb.AppendLine($"if (!{accessor.Access}.{(Nullable ? nameof(ICollectionExt.SequenceEqualNullable) : nameof(ICollectionExt.SequenceEqual))}({rhsAccessor.Access}, (l, r) => {subLoq.TargetObjectGeneration.CommonClassSpeccedInstance("l.Value", LoquiInterfaceType.IGetter, CommonGenerics.Class, subLoq.GenericSpecification)}.Equals(l.Value, r.Value, {maskAccessor}?.GetSubCrystal({IndexEnumInt})))) return false;");
80+
}
81+
else
82+
{
83+
sb.AppendLine($"if (!{accessor.Access}.{nameof(EnumerableExt.SequenceEqualNullable)}({rhsAccessor.Access})) return false;");
84+
}
85+
}
86+
}
87+
7188
protected override void TypicalSetTo(StructuredStringBuilder sb)
7289
{
7390
sb.AppendLine($"rhs.{Name}");

Loqui.Generation/Fields/ArrayType.cs

-6
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,4 @@ public override void WrapSet(StructuredStringBuilder sb, Accessor accessor, Acti
206206
base.WrapSet(sb, accessor, a);
207207
}
208208
}
209-
210-
public override string GetDefault(bool getter)
211-
{
212-
if (getter && Nullable) return $"default({TypeName(getter)}{NullChar})";
213-
return base.GetDefault(getter);
214-
}
215209
}

Loqui.Generation/Fields/PrimitiveType.cs

+1-8
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,7 @@ public override string GenerateEqualsSnippet(Accessor accessor, Accessor rhsAcce
1515

1616
public override string GetDefault(bool getter)
1717
{
18-
if (Nullable)
19-
{
20-
return $"default({TypeName(getter: getter)}?)";
21-
}
22-
else
23-
{
24-
return "default";
25-
}
18+
return $"default({TypeName(getter: getter)}{this.NullChar})";
2619
}
2720

2821
public override void GenerateForCopy(StructuredStringBuilder sb, Accessor accessor, Accessor rhs, Accessor copyMaskAccessor, bool protectedMembers, bool deepCopy)

Loqui.Generation/Fields/TypeGeneration.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,10 @@ public virtual string GetTranslationIfAccessor(Accessor translationCrystalAccess
269269
return $"({translationCrystalAccessor}?.GetShouldTranslate({IndexEnumInt}) ?? true)";
270270
}
271271

272-
public virtual string GetDefault(bool getter) => "default";
272+
public virtual string GetDefault(bool getter)
273+
{
274+
return $"default({TypeName(getter)}{NullChar})";
275+
}
273276

274277
public abstract string? GetDuplicate(Accessor accessor);
275278

Loqui.Generation/Modules/Mask/Fields/ContainerMaskFieldGeneration.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public override void GenerateForAny(StructuredStringBuilder sb, TypeGeneration f
187187
}
188188
}
189189

190-
public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, bool indexed)
190+
public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, string? index)
191191
{
192192
ListType listType = field as ListType;
193193

@@ -200,7 +200,7 @@ public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGenera
200200
{
201201
if (listType.SubTypeGeneration is LoquiType loqui)
202202
{
203-
var submaskString = $"MaskItemIndexed<R, {loqui.GetMaskString("R")}?>";
203+
var submaskString = $"MaskItemIndexed<{(IndexStr == "int" ? null : $"{IndexStr}, ")}R, {loqui.GetMaskString("R")}?>";
204204
sb.AppendLine($"var l = new List<{submaskString}>();");
205205
sb.AppendLine($"{retAccessor}.Specific = l;");
206206
sb.AppendLine($"foreach (var item in {field.Name}.Specific)");
@@ -210,7 +210,7 @@ public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGenera
210210
fieldGen.GenerateForTranslate(sb, listType.SubTypeGeneration,
211211
retAccessor: $"{submaskString}? mask",
212212
rhsAccessor: $"item",
213-
indexed: true);
213+
index: IndexStr);
214214
sb.AppendLine("if (mask == null) continue;");
215215
sb.AppendLine($"l.Add(mask);");
216216
}
@@ -226,7 +226,7 @@ public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGenera
226226
fieldGen.GenerateForTranslate(sb, listType.SubTypeGeneration,
227227
retAccessor: $"R mask",
228228
rhsAccessor: $"item",
229-
indexed: true);
229+
index: IndexStr);
230230
sb.AppendLine($"l.Add((item.Index, mask));");
231231
}
232232
}

Loqui.Generation/Modules/Mask/Fields/DictMaskFieldGeneration.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ public override void GenerateForAny(StructuredStringBuilder sb, TypeGeneration f
329329
}
330330
}
331331

332-
public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, bool indexed)
332+
public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, string? index)
333333
{
334334
DictType dictType = field as DictType;
335335

Loqui.Generation/Modules/Mask/Fields/LoquiMaskFieldGeneration.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public override void GenerateForAny(StructuredStringBuilder sb, TypeGeneration f
144144
}
145145
}
146146

147-
public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, bool indexed)
147+
public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, string? index)
148148
{
149149
LoquiType loqui = field as LoquiType;
150150
if (IsUnknownGeneric(loqui))
@@ -154,7 +154,7 @@ public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGenera
154154
}
155155
else
156156
{
157-
sb.AppendLine($"{retAccessor} = {rhsAccessor} == null ? null : new MaskItem{(indexed ? "Indexed" : null)}<R, {loqui.GenerateMaskString("R")}?>({(indexed ? $"{rhsAccessor}.Index, " : null)}eval({rhsAccessor}.Overall), {rhsAccessor}.Specific?.Translate(eval));");
157+
sb.AppendLine($"{retAccessor} = {rhsAccessor} == null ? null : new MaskItem{(index != null ? "Indexed" : null)}<{(index is null or "int" ? null : $"{index}, ")}R, {loqui.GenerateMaskString("R")}?>({(index != null ? $"{rhsAccessor}.Index, " : null)}eval({rhsAccessor}.Overall), {rhsAccessor}.Specific?.Translate(eval));");
158158
}
159159
}
160160

@@ -186,10 +186,10 @@ public override void GenerateForClearEnumerable(StructuredStringBuilder sb, Type
186186
{
187187
}
188188

189-
public override string GetMaskString(TypeGeneration field, string valueStr, string? indexed)
189+
public override string GetMaskString(TypeGeneration field, string valueStr, string? index)
190190
{
191191
var loqui = field as LoquiType;
192-
return $"MaskItem{(indexed != null ? "Indexed" : null)}<{valueStr}, {(loqui.TargetObjectGeneration?.GetMaskString(valueStr) ?? $"IMask<{valueStr}>")}?>";
192+
return $"MaskItem{(index != null ? "Indexed" : null)}<{(index is null or "int" ? null : $"{index}, ")}{valueStr}, {(loqui.TargetObjectGeneration?.GetMaskString(valueStr) ?? $"IMask<{valueStr}>")}?>";
193193
}
194194

195195
public override string GenerateForTranslationMaskCrystalization(TypeGeneration field)

Loqui.Generation/Modules/Mask/Fields/MaskModuleField.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public virtual void GenerateForHashCode(StructuredStringBuilder sb, TypeGenerati
4747
if (!field.IntegrateField) return;
4848
sb.AppendLine($"hash.Add(this.{field.Name});");
4949
}
50-
public abstract void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, bool indexed);
50+
public abstract void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, string? index);
5151
public abstract void GenerateForClearEnumerable(StructuredStringBuilder sb, TypeGeneration field);
5252
public abstract void GenerateForErrorMaskCombine(StructuredStringBuilder sb, TypeGeneration field, string accessor, string retAccessor, string rhsAccessor);
5353
public abstract string GenerateBoolMaskCheck(TypeGeneration field, string boolMaskAccessor);

Loqui.Generation/Modules/Mask/Fields/TypicalMaskFieldGeneration.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ public override void GenerateForAny(StructuredStringBuilder sb, TypeGeneration f
5252
sb.AppendLine($"if (eval({accessor.Access}{(indexed ? ".Value" : null)})) return true;");
5353
}
5454

55-
public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, bool indexed)
55+
public override void GenerateForTranslate(StructuredStringBuilder sb, TypeGeneration field, string retAccessor, string rhsAccessor, string? index)
5656
{
5757
if (!field.IntegrateField) return;
58-
sb.AppendLine($"{retAccessor} = eval({rhsAccessor}{(indexed ? ".Value" : null)});");
58+
sb.AppendLine($"{retAccessor} = eval({rhsAccessor}{(index != null ? ".Value" : null)});");
5959
}
6060

6161
public override void GenerateForErrorMaskCombine(StructuredStringBuilder sb, TypeGeneration field, string accessor, string retAccessor, string rhsAccessor)

Loqui.Generation/Modules/Mask/MaskModule.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ private async Task GenerateNormalMask(ObjectGeneration obj, StructuredStringBuil
494494
}
495495
foreach (var field in obj.IterateFields())
496496
{
497-
GetMaskModule(field.GetType()).GenerateForTranslate(sb, field, $"obj.{field.Name}", $"this.{field.Name}", indexed: false);
497+
GetMaskModule(field.GetType()).GenerateForTranslate(sb, field, $"obj.{field.Name}", $"this.{field.Name}", index: null);
498498
}
499499
}
500500
}

Loqui/Masks/EqualsMaskHelper.cs

+64
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,70 @@ public static bool RefEquality<T>(T? lhs, T? rhs, [MaybeNullWhen(false)] out T l
237237
return null;
238238
}
239239

240+
public static MaskItem<bool, IEnumerable<MaskItemIndexed<P2Int, bool, M?>>?>? Array2dEqualsHelper<T, M>(
241+
this IReadOnlyArray2d<T>? lhs,
242+
IReadOnlyArray2d<T>? rhs,
243+
Func<T, T, M> maskGetter,
244+
Include include)
245+
where M : class, IMask<bool>
246+
{
247+
if (lhs == null && rhs == null)
248+
{
249+
return include == Include.All ? new MaskItem<bool, IEnumerable<MaskItemIndexed<P2Int, bool, M?>>?>(true, default) : default;
250+
}
251+
if (lhs == null || rhs == null)
252+
{
253+
return new MaskItem<bool, IEnumerable<MaskItemIndexed<P2Int, bool, M?>>?>(false, default);
254+
}
255+
256+
if (lhs.Width != rhs.Width
257+
|| lhs.Height != rhs.Height)
258+
{
259+
return new MaskItem<bool, IEnumerable<MaskItemIndexed<P2Int, bool, M?>>?>(false, default);
260+
}
261+
262+
var overall = true;
263+
List<MaskItemIndexed<P2Int, bool, M?>> masks = new();
264+
for (int y = 0; y < lhs.Height; y++)
265+
{
266+
for (int x = 0; x < lhs.Width; x++)
267+
{
268+
var lhsVal = lhs[x, y];
269+
var rhsVal = rhs[x, y];
270+
var val = new MaskItemIndexed<P2Int, bool, M?>(index:new P2Int(x, y), overall: false, specific: default);
271+
EqualsHelper(val, lhsVal, rhsVal, maskGetter, include);
272+
273+
if (include == Include.All || !val.Overall)
274+
{
275+
masks.Add(val);
276+
}
277+
else
278+
{
279+
overall = false;
280+
}
281+
}
282+
}
283+
if (overall)
284+
{
285+
switch (include)
286+
{
287+
case Include.All:
288+
overall = masks.All((b) => b.Overall);
289+
break;
290+
case Include.OnlyFailures:
291+
overall = !masks.Any();
292+
break;
293+
default:
294+
throw new NotImplementedException();
295+
}
296+
}
297+
if (!overall || include == Include.All)
298+
{
299+
return new MaskItem<bool, IEnumerable<MaskItemIndexed<P2Int, bool, M?>>?>(overall, masks);
300+
}
301+
return null;
302+
}
303+
240304
public static MaskItem<bool, IEnumerable<(P2Int Index, bool EqualValues)>?>? Array2dEqualsHelper<T>(
241305
this IReadOnlyArray2d<T>? lhs,
242306
IReadOnlyArray2d<T>? rhs,

0 commit comments

Comments
 (0)