PikaStdData_Tuple.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "PikaStdData_Tuple.h"
  2. #include "PikaVM.h"
  3. #include "dataStrs.h"
  4. int PikaStdData_Tuple_len(PikaObj* self) {
  5. return objList_getSize(self);
  6. }
  7. Arg* PikaStdData_Tuple_get(PikaObj* self, int i) {
  8. return objList_get(self, i);
  9. }
  10. void PikaStdData_Tuple___init__(PikaObj* self) {
  11. objList_init(self);
  12. }
  13. Arg* PikaStdData_Tuple___iter__(PikaObj* self) {
  14. obj_setInt(self, "__iter_i", 0);
  15. return arg_newRef(self);
  16. }
  17. Arg* PikaStdData_Tuple___next__(PikaObj* self) {
  18. int __iter_i = args_getInt(self->list, "__iter_i");
  19. Arg* res = PikaStdData_Tuple_get(self, __iter_i);
  20. if (NULL == res) {
  21. return arg_newNone();
  22. }
  23. args_setInt(self->list, "__iter_i", __iter_i + 1);
  24. return res;
  25. }
  26. Arg* PikaStdData_Tuple___getitem__(PikaObj* self, Arg* __key) {
  27. int i = arg_getInt(__key);
  28. PikaList* list = obj_getPtr(self, "list");
  29. if (i < 0 || i >= pikaList_getSize(list)) {
  30. obj_setErrorCode(self, PIKA_RES_ERR_INDEX);
  31. obj_setSysOut(self, "IndexError: index out of range");
  32. return NULL;
  33. }
  34. return PikaStdData_Tuple_get(self, i);
  35. }
  36. void PikaStdData_Tuple___del__(PikaObj* self) {
  37. if (0 == obj_getInt(self, "needfree")) {
  38. return;
  39. }
  40. Args* list = obj_getPtr(self, "list");
  41. args_deinit(list);
  42. }
  43. char* builtins_str(PikaObj* self, Arg* arg);
  44. typedef struct {
  45. Arg* buf;
  46. int count;
  47. } TupleToStrContext;
  48. int32_t tupleToStrEachHandle(PikaObj* self,
  49. int itemIndex,
  50. Arg* itemEach,
  51. void* context) {
  52. TupleToStrContext* ctx = (TupleToStrContext*)context;
  53. char* item_str = builtins_str(self, itemEach);
  54. if (ctx->count != 0) {
  55. ctx->buf = arg_strAppend(ctx->buf, ", ");
  56. }
  57. if (arg_getType(itemEach) == ARG_TYPE_STRING) {
  58. ctx->buf = arg_strAppend(ctx->buf, "'");
  59. }
  60. ctx->buf = arg_strAppend(ctx->buf, item_str);
  61. if (arg_getType(itemEach) == ARG_TYPE_STRING) {
  62. ctx->buf = arg_strAppend(ctx->buf, "'");
  63. }
  64. ctx->count++;
  65. return 0;
  66. }
  67. char* PikaStdData_Tuple___str__(PikaObj* self) {
  68. TupleToStrContext context;
  69. context.buf = arg_newStr("(");
  70. context.count = 0;
  71. objTuple_forEach(self, tupleToStrEachHandle, &context);
  72. if (context.count == 1) {
  73. context.buf = arg_strAppend(context.buf, ",");
  74. }
  75. context.buf = arg_strAppend(context.buf, ")");
  76. obj_setStr(self, "_buf", arg_getStr(context.buf));
  77. arg_deinit(context.buf);
  78. return obj_getStr(self, "_buf");
  79. }
  80. int PikaStdData_Tuple___len__(PikaObj* self) {
  81. return PikaStdData_Tuple_len(self);
  82. }
  83. int PikaStdData_Tuple___contains__(PikaObj* self, Arg* val) {
  84. PikaList* list = obj_getPtr(self, "list");
  85. for (size_t i = 0; i < pikaList_getSize(list); i++) {
  86. Arg* arg = pikaList_getArg(list, i);
  87. if (arg_isEqual(arg, val)) {
  88. return 1;
  89. }
  90. }
  91. return 0;
  92. }