Skip to content

Commit 59354de

Browse files
committed
Implement deque.insert
1 parent 08289db commit 59354de

File tree

1 file changed

+39
-0
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque

1 file changed

+39
-0
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeBuiltins.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeDelItemNodeClinicProviderGen;
8282
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeGetItemNodeClinicProviderGen;
8383
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeInplaceMulNodeClinicProviderGen;
84+
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeInsertNodeClinicProviderGen;
8485
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeMulNodeClinicProviderGen;
8586
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeRMulNodeClinicProviderGen;
8687
import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeRotateNodeClinicProviderGen;
@@ -441,6 +442,44 @@ private static Object next(Iterator<?> it) {
441442
}
442443
}
443444

445+
// deque.insert()
446+
@Builtin(name = "insert", minNumOfPositionalArgs = 3, parameterNames = {"$self", "index", "object"})
447+
@GenerateNodeFactory
448+
@ArgumentClinic(name = "index", conversion = ClinicConversion.Index)
449+
public abstract static class DequeInsertNode extends PythonTernaryClinicBuiltinNode {
450+
451+
@Override
452+
protected ArgumentClinicProvider getArgumentClinic() {
453+
return DequeInsertNodeClinicProviderGen.INSTANCE;
454+
}
455+
456+
@Specialization
457+
@TruffleBoundary
458+
PNone doGeneric(PDeque self, int index, Object value) {
459+
int n = self.getSize();
460+
if (self.getMaxLength() == n) {
461+
throw PRaiseNode.raiseUncached(this, IndexError, "deque already at its maximum size");
462+
}
463+
464+
// shortcuts for simple cases
465+
if (index >= n) {
466+
self.append(value);
467+
} else if (index <= -n || index == 0) {
468+
self.appendLeft(value);
469+
}
470+
471+
DequeRotateNode.doLeft(self, -index);
472+
if (index < 0) {
473+
self.append(value);
474+
} else {
475+
self.appendLeft(value);
476+
}
477+
DequeRotateNode.doRight(self, index);
478+
479+
return PNone.NONE;
480+
}
481+
}
482+
444483
// deque.pop()
445484
@Builtin(name = "pop", minNumOfPositionalArgs = 1)
446485
@GenerateNodeFactory

0 commit comments

Comments
 (0)