mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
support list.pop()
support list.remove() support list.insert()
This commit is contained in:
parent
9c3ca9a3df
commit
52995e6ab2
@ -1,3 +1,6 @@
|
||||
from PikaObj import *
|
||||
|
||||
|
||||
class Tuple:
|
||||
def __init__(self): ...
|
||||
|
||||
@ -36,6 +39,15 @@ class List(Tuple):
|
||||
def reverse(self):
|
||||
"""reverse the list"""
|
||||
|
||||
def pop(self) -> any:
|
||||
"""pop the last element"""
|
||||
|
||||
def remove(self, val: any):
|
||||
"""remove the first element"""
|
||||
|
||||
def insert(self, i: int, arg: any):
|
||||
"""insert an arg before the index"""
|
||||
|
||||
def __setitem__(self, __key: any, __val: any):
|
||||
"""support list[] = val"""
|
||||
|
||||
@ -75,12 +87,14 @@ class dict_keys:
|
||||
def __str__(self) -> str: ...
|
||||
def __len__(self) -> int: ...
|
||||
|
||||
|
||||
class dict_items:
|
||||
def __iter__(self) -> any: ...
|
||||
def __next__(self) -> any: ...
|
||||
def __str__(self) -> str: ...
|
||||
def __len__(self) -> int: ...
|
||||
|
||||
|
||||
class String:
|
||||
def __init__(self, s: str): ...
|
||||
def set(self, s: str): ...
|
||||
|
@ -77,3 +77,22 @@ PikaObj* PikaStdData_List___add__(PikaObj* self, PikaObj* others) {
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
void PikaStdData_List_insert(PikaObj *self, int i, Arg* arg){
|
||||
PikaList* list = obj_getPtr(self, "list");
|
||||
if (PIKA_RES_OK != list_insert(list, i, arg)) {
|
||||
obj_setErrorCode(self, 1);
|
||||
obj_setSysOut(self, "Error: index exceeded lengh of list.");
|
||||
}
|
||||
}
|
||||
|
||||
Arg* PikaStdData_List_pop(PikaObj *self){
|
||||
PikaList* list = obj_getPtr(self, "list");
|
||||
return list_pop(list);
|
||||
}
|
||||
|
||||
void PikaStdData_List_remove(PikaObj *self, Arg* val){
|
||||
PikaList* list = obj_getPtr(self, "list");
|
||||
list_remove(list, val);
|
||||
}
|
||||
|
||||
|
2
port/linux/.vscode/launch.json
vendored
2
port/linux/.vscode/launch.json
vendored
@ -11,7 +11,7 @@
|
||||
"program": "${workspaceFolder}/build/test/pikascript_test",
|
||||
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
|
||||
"args": [
|
||||
// "--gtest_filter=vm.super_val_"
|
||||
// "--gtest_filter=stddata.list_pop_"
|
||||
],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}",
|
||||
|
@ -1,3 +1,6 @@
|
||||
from PikaObj import *
|
||||
|
||||
|
||||
class Tuple:
|
||||
def __init__(self): ...
|
||||
|
||||
@ -36,6 +39,15 @@ class List(Tuple):
|
||||
def reverse(self):
|
||||
"""reverse the list"""
|
||||
|
||||
def pop(self) -> any:
|
||||
"""pop the last element"""
|
||||
|
||||
def remove(self, val: any):
|
||||
"""remove the first element"""
|
||||
|
||||
def insert(self, i: int, arg: any):
|
||||
"""insert an arg before the index"""
|
||||
|
||||
def __setitem__(self, __key: any, __val: any):
|
||||
"""support list[] = val"""
|
||||
|
||||
@ -75,12 +87,14 @@ class dict_keys:
|
||||
def __str__(self) -> str: ...
|
||||
def __len__(self) -> int: ...
|
||||
|
||||
|
||||
class dict_items:
|
||||
def __iter__(self) -> any: ...
|
||||
def __next__(self) -> any: ...
|
||||
def __str__(self) -> str: ...
|
||||
def __len__(self) -> int: ...
|
||||
|
||||
|
||||
class String:
|
||||
def __init__(self, s: str): ...
|
||||
def set(self, s: str): ...
|
||||
|
@ -77,3 +77,22 @@ PikaObj* PikaStdData_List___add__(PikaObj* self, PikaObj* others) {
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
void PikaStdData_List_insert(PikaObj *self, int i, Arg* arg){
|
||||
PikaList* list = obj_getPtr(self, "list");
|
||||
if (PIKA_RES_OK != list_insert(list, i, arg)) {
|
||||
obj_setErrorCode(self, 1);
|
||||
obj_setSysOut(self, "Error: index exceeded lengh of list.");
|
||||
}
|
||||
}
|
||||
|
||||
Arg* PikaStdData_List_pop(PikaObj *self){
|
||||
PikaList* list = obj_getPtr(self, "list");
|
||||
return list_pop(list);
|
||||
}
|
||||
|
||||
void PikaStdData_List_remove(PikaObj *self, Arg* val){
|
||||
PikaList* list = obj_getPtr(self, "list");
|
||||
list_remove(list, val);
|
||||
}
|
||||
|
||||
|
@ -311,4 +311,66 @@ TEST(stddata, bytes_list) {
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(stddata, list_pop_) {
|
||||
/* init */
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
|
||||
/* run */
|
||||
__platform_printf("BEGIN\r\n");
|
||||
obj_run(pikaMain,
|
||||
"l = [1,2,3,4]\n"
|
||||
"l.pop()\n"
|
||||
"l.pop()\n"
|
||||
"l");
|
||||
/* collect */
|
||||
/* assert */
|
||||
EXPECT_STREQ(log_buff[0], "[1, 2]\r\n");
|
||||
EXPECT_STREQ(log_buff[1], "3\r\n");
|
||||
EXPECT_STREQ(log_buff[2], "4\r\n");
|
||||
EXPECT_STREQ(log_buff[3], "BEGIN\r\n");
|
||||
/* deinit */
|
||||
obj_deinit(pikaMain);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(stddata, list_remove_) {
|
||||
/* init */
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
|
||||
/* run */
|
||||
__platform_printf("BEGIN\r\n");
|
||||
obj_run(pikaMain,
|
||||
"l = [1,2,3,4,5]\n"
|
||||
"l.remove(2)\n"
|
||||
"l\n"
|
||||
"l.remove(3)\n"
|
||||
"l");
|
||||
/* collect */
|
||||
/* assert */
|
||||
EXPECT_STREQ(log_buff[1], "[1, 3, 4, 5]\r\n");
|
||||
EXPECT_STREQ(log_buff[0], "[1, 4, 5]\r\n");
|
||||
/* deinit */
|
||||
obj_deinit(pikaMain);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(stddata, list_insert_) {
|
||||
/* init */
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
|
||||
/* run */
|
||||
__platform_printf("BEGIN\r\n");
|
||||
obj_run(pikaMain,
|
||||
"l = [1,2,3]\n"
|
||||
"l.insert(1, 'q')\n"
|
||||
"l");
|
||||
/* collect */
|
||||
/* assert */
|
||||
EXPECT_STREQ(log_buff[1], "BEGIN\r\n");
|
||||
EXPECT_STREQ(log_buff[0], "[1, 'q', 2, 3]\r\n");
|
||||
/* deinit */
|
||||
obj_deinit(pikaMain);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -600,6 +600,64 @@ PIKA_RES list_append(PikaList* self, Arg* arg) {
|
||||
return args_setInt(&self->super, "top", top + 1);
|
||||
}
|
||||
|
||||
Arg* list_pop(PikaList* list) {
|
||||
int top = args_getInt(&list->super, "top");
|
||||
if (top <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
Arg* arg = list_getArg(list, top - 1);
|
||||
Arg* res = arg_copy(arg);
|
||||
args_removeArg(&list->super, arg);
|
||||
args_setInt(&list->super, "top", top - 1);
|
||||
return res;
|
||||
}
|
||||
|
||||
PIKA_RES list_remove(PikaList* list, Arg* arg) {
|
||||
int top = args_getInt(&list->super, "top");
|
||||
int i_remove = 0;
|
||||
if (top <= 0) {
|
||||
return PIKA_RES_ERR_OUT_OF_RANGE;
|
||||
}
|
||||
for (int i = 0; i < top; i++) {
|
||||
Arg* arg_now = list_getArg(list, i);
|
||||
if (arg_isEqual(arg_now, arg)) {
|
||||
i_remove = i;
|
||||
args_removeArg(&list->super, arg_now);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* move args */
|
||||
for (int i = i_remove + 1; i < top; i++) {
|
||||
char buff[11];
|
||||
char* i_str = fast_itoa(buff, i - 1);
|
||||
Arg* arg_now = list_getArg(list, i);
|
||||
arg_setName(arg_now, i_str);
|
||||
}
|
||||
args_setInt(&list->super, "top", top - 1);
|
||||
return PIKA_RES_OK;
|
||||
}
|
||||
|
||||
PIKA_RES list_insert(PikaList* self, int index, Arg* arg) {
|
||||
int top = args_getInt(&self->super, "top");
|
||||
if (index > top) {
|
||||
return PIKA_RES_ERR_OUT_OF_RANGE;
|
||||
}
|
||||
/* move args */
|
||||
for (int i = top - 1; i >= index; i--) {
|
||||
char buff[11];
|
||||
char* i_str = fast_itoa(buff, i + 1);
|
||||
Arg* arg_now = list_getArg(self, i);
|
||||
arg_setName(arg_now, i_str);
|
||||
}
|
||||
char buff[11];
|
||||
char* i_str = fast_itoa(buff, index);
|
||||
Arg* arg_to_push = arg_copy(arg);
|
||||
arg_setName(arg_to_push, i_str);
|
||||
args_setArg(&self->super, arg_to_push);
|
||||
args_setInt(&self->super, "top", top + 1);
|
||||
return PIKA_RES_OK;
|
||||
}
|
||||
|
||||
size_t list_getSize(PikaList* self) {
|
||||
pika_assert(NULL != self);
|
||||
return args_getInt(&self->super, "top");
|
||||
|
@ -189,5 +189,8 @@ PikaDict* args_getDict(Args* self, char* name);
|
||||
|
||||
char* strsFormatList(Args* out_buffs, char* fmt, PikaList* list);
|
||||
char* args_cacheStr(Args* self, char* str);
|
||||
PIKA_RES list_insert(PikaList* self, int index, Arg* arg);
|
||||
Arg* list_pop(PikaList* list);
|
||||
PIKA_RES list_remove(PikaList* list, Arg* arg);
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user