PikaStdData_Tuple.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "PikaStdData_Tuple.h"
  2. #include "PikaVM.h"
  3. #include "dataStrs.h"
  4. int PikaStdData_Tuple_len(PikaObj* self) {
  5. return pikaList_getSize(self);
  6. }
  7. Arg* PikaStdData_Tuple_get(PikaObj* self, int i) {
  8. return arg_copy(pikaList_get(self, i));
  9. }
  10. void PikaStdData_Tuple___init__(PikaObj* self) {
  11. pikaList_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. if (i < 0 || i >= pikaList_getSize(self)) {
  29. obj_setErrorCode(self, PIKA_RES_ERR_INDEX);
  30. obj_setSysOut(self, "IndexError: index out of range");
  31. return NULL;
  32. }
  33. return PikaStdData_Tuple_get(self, i);
  34. }
  35. void PikaStdData_Tuple___del__(PikaObj* self) {
  36. if (0 == obj_getInt(self, "needfree")) {
  37. return;
  38. }
  39. Args* list = _OBJ2LIST(self);
  40. args_deinit(list);
  41. }
  42. char* builtins_str(PikaObj* self, Arg* arg);
  43. typedef struct {
  44. Arg* buf;
  45. int count;
  46. } TupleToStrContext;
  47. int32_t tupleToStrEachHandle(PikaObj* self,
  48. int itemIndex,
  49. Arg* itemEach,
  50. void* context) {
  51. TupleToStrContext* ctx = (TupleToStrContext*)context;
  52. char* item_str = builtins_str(self, itemEach);
  53. if (ctx->count != 0) {
  54. ctx->buf = arg_strAppend(ctx->buf, ", ");
  55. }
  56. if (arg_getType(itemEach) == ARG_TYPE_STRING) {
  57. ctx->buf = arg_strAppend(ctx->buf, "'");
  58. }
  59. ctx->buf = arg_strAppend(ctx->buf, item_str);
  60. if (arg_getType(itemEach) == ARG_TYPE_STRING) {
  61. ctx->buf = arg_strAppend(ctx->buf, "'");
  62. }
  63. ctx->count++;
  64. return 0;
  65. }
  66. char* PikaStdData_Tuple___str__(PikaObj* self) {
  67. TupleToStrContext context;
  68. context.buf = arg_newStr("(");
  69. context.count = 0;
  70. pikaTuple_forEach(self, tupleToStrEachHandle, &context);
  71. if (context.count == 1) {
  72. context.buf = arg_strAppend(context.buf, ",");
  73. }
  74. context.buf = arg_strAppend(context.buf, ")");
  75. obj_setStr(self, "_buf", arg_getStr(context.buf));
  76. arg_deinit(context.buf);
  77. return obj_getStr(self, "_buf");
  78. }
  79. int PikaStdData_Tuple___len__(PikaObj* self) {
  80. return PikaStdData_Tuple_len(self);
  81. }
  82. PikaObj* PikaStdData_Tuple___add__(PikaObj* self, PikaObj* others) {
  83. PikaObj* res = New_PikaTuple();
  84. for (size_t i = 0; i < pikaList_getSize(self); i++) {
  85. Arg* arg = pikaList_get(self, i);
  86. pikaList_append(res, arg_copy(arg));
  87. }
  88. for (size_t i = 0; i < pikaList_getSize(others); i++) {
  89. Arg* arg = pikaList_get(others, i);
  90. pikaList_append(res, arg_copy(arg));
  91. }
  92. return res;
  93. }
  94. int PikaStdData_Tuple___eq__(PikaObj* self, Arg* other) {
  95. if (!arg_isObject(other)) {
  96. return 0;
  97. }
  98. PikaObj* oOther = arg_getObj(other);
  99. if (self->constructor != oOther->constructor) {
  100. return 0;
  101. }
  102. if (obj_getSize(self) != obj_getSize(oOther)) {
  103. return 0;
  104. }
  105. for (size_t i = 0; i < pikaList_getSize(self); i++) {
  106. Arg* arg = pikaList_get(self, i);
  107. Arg* otherArg = pikaList_get(oOther, i);
  108. if (!arg_isEqual(arg, otherArg)) {
  109. return 0;
  110. }
  111. }
  112. return 1;
  113. }
  114. PikaObj* PikaStdData_Tuple___mul__(PikaObj* self, int n) {
  115. PikaObj* res = New_PikaTuple();
  116. for (int i = 0; i < n; i++) {
  117. for (size_t j = 0; j < pikaList_getSize(self); j++) {
  118. Arg* arg = pikaList_get(self, j);
  119. pikaList_append(res, arg_copy(arg));
  120. }
  121. }
  122. return res;
  123. }