Skip to content

Commit 52995e6

Browse files
committed
support list.pop()
support list.remove() support list.insert()
1 parent 9c3ca9a commit 52995e6

File tree

8 files changed

+190
-1
lines changed

8 files changed

+190
-1
lines changed

package/PikaStdLib/PikaStdData.pyi

+14
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from PikaObj import *
2+
3+
14
class Tuple:
25
def __init__(self): ...
36

@@ -36,6 +39,15 @@ class List(Tuple):
3639
def reverse(self):
3740
"""reverse the list"""
3841

42+
def pop(self) -> any:
43+
"""pop the last element"""
44+
45+
def remove(self, val: any):
46+
"""remove the first element"""
47+
48+
def insert(self, i: int, arg: any):
49+
"""insert an arg before the index"""
50+
3951
def __setitem__(self, __key: any, __val: any):
4052
"""support list[] = val"""
4153

@@ -75,12 +87,14 @@ class dict_keys:
7587
def __str__(self) -> str: ...
7688
def __len__(self) -> int: ...
7789

90+
7891
class dict_items:
7992
def __iter__(self) -> any: ...
8093
def __next__(self) -> any: ...
8194
def __str__(self) -> str: ...
8295
def __len__(self) -> int: ...
8396

97+
8498
class String:
8599
def __init__(self, s: str): ...
86100
def set(self, s: str): ...

package/PikaStdLib/PikaStdData_List.c

+19
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,22 @@ PikaObj* PikaStdData_List___add__(PikaObj* self, PikaObj* others) {
7777
}
7878
return res;
7979
}
80+
81+
void PikaStdData_List_insert(PikaObj *self, int i, Arg* arg){
82+
PikaList* list = obj_getPtr(self, "list");
83+
if (PIKA_RES_OK != list_insert(list, i, arg)) {
84+
obj_setErrorCode(self, 1);
85+
obj_setSysOut(self, "Error: index exceeded lengh of list.");
86+
}
87+
}
88+
89+
Arg* PikaStdData_List_pop(PikaObj *self){
90+
PikaList* list = obj_getPtr(self, "list");
91+
return list_pop(list);
92+
}
93+
94+
void PikaStdData_List_remove(PikaObj *self, Arg* val){
95+
PikaList* list = obj_getPtr(self, "list");
96+
list_remove(list, val);
97+
}
98+

port/linux/.vscode/launch.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"program": "${workspaceFolder}/build/test/pikascript_test",
1212
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
1313
"args": [
14-
// "--gtest_filter=vm.super_val_"
14+
// "--gtest_filter=stddata.list_pop_"
1515
],
1616
"stopAtEntry": false,
1717
"cwd": "${workspaceFolder}",

port/linux/package/pikascript/PikaStdData.pyi

+14
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from PikaObj import *
2+
3+
14
class Tuple:
25
def __init__(self): ...
36

@@ -36,6 +39,15 @@ class List(Tuple):
3639
def reverse(self):
3740
"""reverse the list"""
3841

42+
def pop(self) -> any:
43+
"""pop the last element"""
44+
45+
def remove(self, val: any):
46+
"""remove the first element"""
47+
48+
def insert(self, i: int, arg: any):
49+
"""insert an arg before the index"""
50+
3951
def __setitem__(self, __key: any, __val: any):
4052
"""support list[] = val"""
4153

@@ -75,12 +87,14 @@ class dict_keys:
7587
def __str__(self) -> str: ...
7688
def __len__(self) -> int: ...
7789

90+
7891
class dict_items:
7992
def __iter__(self) -> any: ...
8093
def __next__(self) -> any: ...
8194
def __str__(self) -> str: ...
8295
def __len__(self) -> int: ...
8396

97+
8498
class String:
8599
def __init__(self, s: str): ...
86100
def set(self, s: str): ...

port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdData_List.c

+19
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,22 @@ PikaObj* PikaStdData_List___add__(PikaObj* self, PikaObj* others) {
7777
}
7878
return res;
7979
}
80+
81+
void PikaStdData_List_insert(PikaObj *self, int i, Arg* arg){
82+
PikaList* list = obj_getPtr(self, "list");
83+
if (PIKA_RES_OK != list_insert(list, i, arg)) {
84+
obj_setErrorCode(self, 1);
85+
obj_setSysOut(self, "Error: index exceeded lengh of list.");
86+
}
87+
}
88+
89+
Arg* PikaStdData_List_pop(PikaObj *self){
90+
PikaList* list = obj_getPtr(self, "list");
91+
return list_pop(list);
92+
}
93+
94+
void PikaStdData_List_remove(PikaObj *self, Arg* val){
95+
PikaList* list = obj_getPtr(self, "list");
96+
list_remove(list, val);
97+
}
98+

port/linux/test/stddata-test.cpp

+62
Original file line numberDiff line numberDiff line change
@@ -311,4 +311,66 @@ TEST(stddata, bytes_list) {
311311
EXPECT_EQ(pikaMemNow(), 0);
312312
}
313313

314+
TEST(stddata, list_pop_) {
315+
/* init */
316+
pikaMemInfo.heapUsedMax = 0;
317+
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
318+
/* run */
319+
__platform_printf("BEGIN\r\n");
320+
obj_run(pikaMain,
321+
"l = [1,2,3,4]\n"
322+
"l.pop()\n"
323+
"l.pop()\n"
324+
"l");
325+
/* collect */
326+
/* assert */
327+
EXPECT_STREQ(log_buff[0], "[1, 2]\r\n");
328+
EXPECT_STREQ(log_buff[1], "3\r\n");
329+
EXPECT_STREQ(log_buff[2], "4\r\n");
330+
EXPECT_STREQ(log_buff[3], "BEGIN\r\n");
331+
/* deinit */
332+
obj_deinit(pikaMain);
333+
EXPECT_EQ(pikaMemNow(), 0);
334+
}
335+
336+
TEST(stddata, list_remove_) {
337+
/* init */
338+
pikaMemInfo.heapUsedMax = 0;
339+
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
340+
/* run */
341+
__platform_printf("BEGIN\r\n");
342+
obj_run(pikaMain,
343+
"l = [1,2,3,4,5]\n"
344+
"l.remove(2)\n"
345+
"l\n"
346+
"l.remove(3)\n"
347+
"l");
348+
/* collect */
349+
/* assert */
350+
EXPECT_STREQ(log_buff[1], "[1, 3, 4, 5]\r\n");
351+
EXPECT_STREQ(log_buff[0], "[1, 4, 5]\r\n");
352+
/* deinit */
353+
obj_deinit(pikaMain);
354+
EXPECT_EQ(pikaMemNow(), 0);
355+
}
356+
357+
TEST(stddata, list_insert_) {
358+
/* init */
359+
pikaMemInfo.heapUsedMax = 0;
360+
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
361+
/* run */
362+
__platform_printf("BEGIN\r\n");
363+
obj_run(pikaMain,
364+
"l = [1,2,3]\n"
365+
"l.insert(1, 'q')\n"
366+
"l");
367+
/* collect */
368+
/* assert */
369+
EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
370+
EXPECT_STREQ(log_buff[0], "[1, 'q', 2, 3]\r\n");
371+
/* deinit */
372+
obj_deinit(pikaMain);
373+
EXPECT_EQ(pikaMemNow(), 0);
374+
}
375+
314376
#endif

src/dataArgs.c

+58
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,64 @@ PIKA_RES list_append(PikaList* self, Arg* arg) {
600600
return args_setInt(&self->super, "top", top + 1);
601601
}
602602

603+
Arg* list_pop(PikaList* list) {
604+
int top = args_getInt(&list->super, "top");
605+
if (top <= 0) {
606+
return NULL;
607+
}
608+
Arg* arg = list_getArg(list, top - 1);
609+
Arg* res = arg_copy(arg);
610+
args_removeArg(&list->super, arg);
611+
args_setInt(&list->super, "top", top - 1);
612+
return res;
613+
}
614+
615+
PIKA_RES list_remove(PikaList* list, Arg* arg) {
616+
int top = args_getInt(&list->super, "top");
617+
int i_remove = 0;
618+
if (top <= 0) {
619+
return PIKA_RES_ERR_OUT_OF_RANGE;
620+
}
621+
for (int i = 0; i < top; i++) {
622+
Arg* arg_now = list_getArg(list, i);
623+
if (arg_isEqual(arg_now, arg)) {
624+
i_remove = i;
625+
args_removeArg(&list->super, arg_now);
626+
break;
627+
}
628+
}
629+
/* move args */
630+
for (int i = i_remove + 1; i < top; i++) {
631+
char buff[11];
632+
char* i_str = fast_itoa(buff, i - 1);
633+
Arg* arg_now = list_getArg(list, i);
634+
arg_setName(arg_now, i_str);
635+
}
636+
args_setInt(&list->super, "top", top - 1);
637+
return PIKA_RES_OK;
638+
}
639+
640+
PIKA_RES list_insert(PikaList* self, int index, Arg* arg) {
641+
int top = args_getInt(&self->super, "top");
642+
if (index > top) {
643+
return PIKA_RES_ERR_OUT_OF_RANGE;
644+
}
645+
/* move args */
646+
for (int i = top - 1; i >= index; i--) {
647+
char buff[11];
648+
char* i_str = fast_itoa(buff, i + 1);
649+
Arg* arg_now = list_getArg(self, i);
650+
arg_setName(arg_now, i_str);
651+
}
652+
char buff[11];
653+
char* i_str = fast_itoa(buff, index);
654+
Arg* arg_to_push = arg_copy(arg);
655+
arg_setName(arg_to_push, i_str);
656+
args_setArg(&self->super, arg_to_push);
657+
args_setInt(&self->super, "top", top + 1);
658+
return PIKA_RES_OK;
659+
}
660+
603661
size_t list_getSize(PikaList* self) {
604662
pika_assert(NULL != self);
605663
return args_getInt(&self->super, "top");

src/dataArgs.h

+3
Original file line numberDiff line numberDiff line change
@@ -189,5 +189,8 @@ PikaDict* args_getDict(Args* self, char* name);
189189

190190
char* strsFormatList(Args* out_buffs, char* fmt, PikaList* list);
191191
char* args_cacheStr(Args* self, char* str);
192+
PIKA_RES list_insert(PikaList* self, int index, Arg* arg);
193+
Arg* list_pop(PikaList* list);
194+
PIKA_RES list_remove(PikaList* list, Arg* arg);
192195

193196
#endif

0 commit comments

Comments
 (0)