Skip to content

Commit

Permalink
[list] IndexOf.
Browse files Browse the repository at this point in the history
  • Loading branch information
pfusik committed Mar 9, 2023
1 parent 9d0cd38 commit 39b38d3
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 3 deletions.
2 changes: 2 additions & 0 deletions AST.ci
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ public enum CiId
ListContains,
ListCopyTo,
ListCount,
ListIndexOf,
ListInsert,
ListLast,
ListRemoveAt,
Expand Down Expand Up @@ -1477,6 +1478,7 @@ public class CiSystem : CiScope
listClass.Add(CiMethod.New(CiVisibility.Public, BoolType, CiId.ListContains, "Contains", CiVar.New(TypeParam0, "value")));
listClass.Add(CiMethod.New(CiVisibility.Public, VoidType, CiId.ListCopyTo, "CopyTo", CiVar.New(IntType, "sourceIndex"),
CiVar.New(new CiReadWriteClassType { Class = ArrayPtrClass, TypeArg0 = TypeParam0 }, "destinationArray"), CiVar.New(IntType, "destinationIndex"), CiVar.New(IntType, "count")));
listClass.Add(CiMethod.NewMutator(CiVisibility.Public, IntType, CiId.ListIndexOf, "IndexOf", CiVar.New(TypeParam0, "value")));
listClass.Add(CiMethod.NewMutator(CiVisibility.Public, VoidType, CiId.ListInsert, "Insert", CiVar.New(UIntType, "index"), CiVar.New(typeParam0NotFinal, "value")));
listClass.Add(CiMethod.NewMutator(CiVisibility.Public, TypeParam0, CiId.ListLast, "Last"));
listClass.Add(CiMethod.NewMutator(CiVisibility.Public, VoidType, CiId.ListRemoveAt, "RemoveAt", CiVar.New(IntType, "index")));
Expand Down
11 changes: 11 additions & 0 deletions GenCpp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -822,6 +822,17 @@ protected override void WriteCallExpr(CiExpr obj, CiMethod method, List<CiExpr>
if (parent > CiPriority.Equality)
WriteChar(')');
break;
case CiId.ListIndexOf:
{
CiType elementType = ((CiClassType) obj.Type).GetElementType();
Write("[](");
WriteCollectionType("vector", elementType);
Write(" &v, const ");
WriteType(elementType, false);
}
Include("algorithm");
WriteCall(" &value) { auto i = std::find(v.begin(), v.end(), value); return i == v.end() ? -1 : i - v.begin(); }", obj, args[0]);
break;
case CiId.ListInsert:
StartMethodCall(obj);
if (args.Count == 1) {
Expand Down
1 change: 1 addition & 0 deletions GenJs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,7 @@ protected override void WriteCallExpr(CiExpr obj, CiMethod method, List<CiExpr>
case CiId.StringLastIndexOf:
case CiId.StringStartsWith:
case CiId.ArraySortAll:
case CiId.ListIndexOf:
case CiId.StackPush:
case CiId.StackPop:
case CiId.HashSetAdd:
Expand Down
21 changes: 18 additions & 3 deletions GenPy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,13 @@ protected override void WriteNew(CiReadWriteClassType klass, CiPriority parent)
}
}

void WriteContains(CiExpr haystack, CiExpr needle)
{
needle.Accept(this, CiPriority.Rel);
Write(" in ");
haystack.Accept(this, CiPriority.Rel);
}

void WriteSlice(CiExpr startIndex, CiExpr length)
{
WriteChar('[');
Expand Down Expand Up @@ -601,9 +608,7 @@ protected override void WriteCallExpr(CiExpr obj, CiMethod method, List<CiExpr>
case CiId.DictionaryContainsKey:
case CiId.SortedDictionaryContainsKey:
case CiId.OrderedDictionaryContainsKey:
args[0].Accept(this, CiPriority.Rel);
Write(" in ");
obj.Accept(this, CiPriority.Rel);
WriteContains(obj, args[0]);
break;
case CiId.StringEndsWith:
WriteMethodCall(obj, "endswith", args[0]);
Expand Down Expand Up @@ -699,6 +704,16 @@ protected override void WriteCallExpr(CiExpr obj, CiMethod method, List<CiExpr>
else
WritePostfix(obj, ".clear()");
break;
case CiId.ListIndexOf:
if (parent > CiPriority.Select)
WriteChar('(');
WriteMethodCall(obj, "index", args[0]);
Write(" if ");
WriteContains(obj, args[0]); // TODO: side effects
Write(" else -1");
if (parent > CiPriority.Select)
WriteChar(')');
break;
case CiId.ListInsert:
WriteListInsert(obj, "insert", args);
break;
Expand Down
9 changes: 9 additions & 0 deletions GenSwift.cs
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,15 @@ protected override void WriteCallExpr(CiExpr obj, CiMethod method, List<CiExpr>
case CiId.SortedDictionaryClear:
WritePostfix(obj, ".removeAll()");
break;
case CiId.ListIndexOf:
if (parent > CiPriority.Rel)
WriteChar('(');
WritePostfix(obj, ".firstIndex(of: ");
args[0].Accept(this, CiPriority.Argument);
Write(") ?? -1");
if (parent > CiPriority.Rel)
WriteChar(')');
break;
case CiId.ListInsert:
WritePostfix(obj, ".insert(");
CiType elementType = ((CiClassType) obj.Type).GetElementType();
Expand Down
2 changes: 2 additions & 0 deletions Transpiled.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1309,6 +1309,7 @@ public enum CiId
ListContains,
ListCopyTo,
ListCount,
ListIndexOf,
ListInsert,
ListLast,
ListRemoveAt,
Expand Down Expand Up @@ -2920,6 +2921,7 @@ internal CiSystem()
listClass.Add(CiMethod.New(CiVisibility.Public, this.BoolType, CiId.ListAny, "Any", CiVar.New(typeParam0Predicate, "predicate")));
listClass.Add(CiMethod.New(CiVisibility.Public, this.BoolType, CiId.ListContains, "Contains", CiVar.New(this.TypeParam0, "value")));
listClass.Add(CiMethod.New(CiVisibility.Public, this.VoidType, CiId.ListCopyTo, "CopyTo", CiVar.New(this.IntType, "sourceIndex"), CiVar.New(new CiReadWriteClassType { Class = this.ArrayPtrClass, TypeArg0 = this.TypeParam0 }, "destinationArray"), CiVar.New(this.IntType, "destinationIndex"), CiVar.New(this.IntType, "count")));
listClass.Add(CiMethod.NewMutator(CiVisibility.Public, this.IntType, CiId.ListIndexOf, "IndexOf", CiVar.New(this.TypeParam0, "value")));
listClass.Add(CiMethod.NewMutator(CiVisibility.Public, this.VoidType, CiId.ListInsert, "Insert", CiVar.New(this.UIntType, "index"), CiVar.New(typeParam0NotFinal, "value")));
listClass.Add(CiMethod.NewMutator(CiVisibility.Public, this.TypeParam0, CiId.ListLast, "Last"));
listClass.Add(CiMethod.NewMutator(CiVisibility.Public, this.VoidType, CiId.ListRemoveAt, "RemoveAt", CiVar.New(this.IntType, "index")));
Expand Down
2 changes: 2 additions & 0 deletions doc/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -924,6 +924,8 @@ You can remove:
* A continuous sequence of elements with `RemoveRange(index, count)`.

`list.Contains(value)` returns `true` if the list contains the specified item.
`list.IndexOf(value)` returns the position of the specified element
or -1 if not found.

`list.CopyTo(sourceIndex, destinationArray, destinationIndex, count)`
copies elements from a list to an array.
Expand Down
21 changes: 21 additions & 0 deletions test/ListIndexOf.ci
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
public static class Test
{
public static bool Run()
{
List<int>() li; //FAIL: cl
li.Add(42);
li.Add(15);
li.Add(15);

List<string>() lsp;
lsp.Add("foo");
lsp.Add("bar");

List<string()>() lss;
lss.Add("foo");
lss.Add("bar");
return li.IndexOf(15) == 1 && li.IndexOf(1) == -1 //FAIL: c
&& lsp.IndexOf("bar") == 1 && lsp.IndexOf("quux") == -1
&& lss.IndexOf("bar") == 1 && lss.IndexOf("quux") == -1;
}
}

0 comments on commit 39b38d3

Please sign in to comment.