PikaStdData_Dict.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. #include "PikaStdData_Dict.h"
  2. #include "BaseObj.h"
  3. #include "PikaObj.h"
  4. #include "PikaStdData_Tuple.h"
  5. #include "PikaStdData_dict_items.h"
  6. #include "PikaStdData_dict_keys.h"
  7. #include "PikaStdLib_SysObj.h"
  8. #include "dataStrs.h"
  9. Arg* PikaStdData_Dict_get(PikaObj* self, char* key) {
  10. Arg* aRet = pikaDict_get(self, key);
  11. if (NULL == aRet) {
  12. obj_setErrorCode(self, PIKA_RES_ERR_ARG_NO_FOUND);
  13. obj_setSysOut(self, "KeyError: %s", key);
  14. return NULL;
  15. }
  16. return arg_copy(pikaDict_get(self, key));
  17. }
  18. void PikaStdData_Dict___init__(PikaObj* self) {
  19. pikaDict_init(self);
  20. }
  21. void PikaStdData_Dict_set(PikaObj* self, char* key, Arg* arg) {
  22. pikaDict_set(self, key, arg_copy(arg));
  23. }
  24. void PikaStdData_Dict_remove(PikaObj* self, char* key) {
  25. Args* dict = obj_getPtr(self, "dict");
  26. Args* keys = obj_getPtr(self, "_keys");
  27. args_removeArg(dict, args_getArg(dict, key));
  28. args_removeArg(keys, args_getArg(keys, key));
  29. }
  30. Arg* PikaStdData_Dict___iter__(PikaObj* self) {
  31. obj_setInt(self, "__iter_i", args_getSize(_OBJ2KEYS(self)));
  32. return arg_newRef(self);
  33. }
  34. Arg* PikaStdData_Dict___next__(PikaObj* self) {
  35. int __iter_i = args_getInt(self->list, "__iter_i") - 1;
  36. if (__iter_i < 0) {
  37. return NULL;
  38. }
  39. Args* keys = _OBJ2KEYS(self);
  40. Arg* res = arg_copy(args_getArgByIndex(keys, __iter_i));
  41. args_setInt(self->list, "__iter_i", __iter_i);
  42. return res;
  43. }
  44. void PikaStdData_Dict___setitem__(PikaObj* self, Arg* __key, Arg* __val) {
  45. PikaStdData_Dict_set(self, arg_getStr(__key), (__val));
  46. }
  47. Arg* PikaStdData_Dict___getitem__(PikaObj* self, Arg* __key) {
  48. return PikaStdData_Dict_get(self, obj_getStr(self, "__key"));
  49. }
  50. void PikaStdData_Dict___del__(PikaObj* self) {
  51. Args* keys = obj_getPtr(self, "_keys");
  52. Args* dict = obj_getPtr(self, "dict");
  53. if (NULL != dict) {
  54. args_deinit(dict);
  55. }
  56. if (NULL != keys) {
  57. args_deinit(keys);
  58. }
  59. }
  60. void PikaStdData_dict_keys___init__(PikaObj* self, PikaObj* dict) {
  61. obj_setPtr(self, "dictptr", dict);
  62. }
  63. PikaObj* PikaStdData_Dict_keys(PikaObj* self) {
  64. PikaObj* dict_keys = newNormalObj(New_PikaStdData_dict_keys);
  65. PikaStdData_dict_keys___init__(dict_keys, self);
  66. return dict_keys;
  67. }
  68. PikaObj* PikaStdData_Dict_items(PikaObj* self) {
  69. PikaObj* dict_items = newNormalObj(New_PikaStdData_dict_items);
  70. PikaStdData_dict_keys___init__(dict_items, self);
  71. return dict_items;
  72. }
  73. Arg* PikaStdData_dict_keys___iter__(PikaObj* self) {
  74. PikaObj* dictptr = obj_getPtr(self, "dictptr");
  75. obj_setInt(self, "__iter_i", args_getSize(_OBJ2KEYS(dictptr)));
  76. return arg_newRef(self);
  77. }
  78. Arg* PikaStdData_dict_keys___next__(PikaObj* self) {
  79. int __iter_i = args_getInt(self->list, "__iter_i") - 1;
  80. if (__iter_i < 0) {
  81. return NULL;
  82. }
  83. PikaObj* dictptr = obj_getPtr(self, "dictptr");
  84. Args* keys = _OBJ2KEYS(dictptr);
  85. Arg* res = arg_copy(args_getArgByIndex(keys, __iter_i));
  86. args_setInt(self->list, "__iter_i", __iter_i);
  87. return res;
  88. }
  89. char* builtins_str(PikaObj* self, Arg* arg);
  90. char* PikaStdData_dict_keys___str__(PikaObj* self) {
  91. Arg* str_arg = arg_newStr("dict_keys([");
  92. arg_deinit(PikaStdData_dict_keys___iter__(self));
  93. int i = 0;
  94. while (PIKA_TRUE) {
  95. Arg* item = PikaStdData_dict_keys___next__(self);
  96. if (NULL == item) {
  97. break;
  98. }
  99. if (i != 0) {
  100. str_arg = arg_strAppend(str_arg, ", ");
  101. }
  102. char* item_str = builtins_str(self, item);
  103. if (arg_getType(item) == ARG_TYPE_STRING) {
  104. str_arg = arg_strAppend(str_arg, "'");
  105. }
  106. str_arg = arg_strAppend(str_arg, item_str);
  107. if (arg_getType(item) == ARG_TYPE_STRING) {
  108. str_arg = arg_strAppend(str_arg, "'");
  109. }
  110. i++;
  111. arg_deinit(item);
  112. }
  113. str_arg = arg_strAppend(str_arg, "])");
  114. obj_setStr(self, "_buf", arg_getStr(str_arg));
  115. arg_deinit(str_arg);
  116. return obj_getStr(self, "_buf");
  117. }
  118. typedef struct {
  119. Arg* buf;
  120. int isFirst;
  121. } DictToStrContext;
  122. int32_t dictToStrEachHandle(PikaObj* self,
  123. Arg* keyEach,
  124. Arg* valEach,
  125. void* context) {
  126. DictToStrContext* ctx = (DictToStrContext*)context;
  127. if (!ctx->isFirst) {
  128. ctx->buf = arg_strAppend(ctx->buf, ", ");
  129. } else {
  130. ctx->isFirst = 0;
  131. }
  132. ctx->buf = arg_strAppend(ctx->buf, "'");
  133. ctx->buf = arg_strAppend(ctx->buf, builtins_str(self, keyEach));
  134. ctx->buf = arg_strAppend(ctx->buf, "'");
  135. ctx->buf = arg_strAppend(ctx->buf, ": ");
  136. if (arg_getType(valEach) == ARG_TYPE_STRING) {
  137. ctx->buf = arg_strAppend(ctx->buf, "'");
  138. }
  139. ctx->buf = arg_strAppend(ctx->buf, builtins_str(self, valEach));
  140. if (arg_getType(valEach) == ARG_TYPE_STRING) {
  141. ctx->buf = arg_strAppend(ctx->buf, "'");
  142. }
  143. return 0;
  144. }
  145. char* PikaStdData_Dict___str__(PikaObj* self) {
  146. DictToStrContext context;
  147. context.buf = arg_newStr("{");
  148. context.isFirst = 1;
  149. pikaDict_forEach(self, dictToStrEachHandle, &context);
  150. context.buf = arg_strAppend(context.buf, "}");
  151. obj_setStr(self, "_buf", arg_getStr(context.buf));
  152. arg_deinit(context.buf);
  153. return obj_getStr(self, "_buf");
  154. }
  155. int PikaStdData_Dict___len__(PikaObj* self) {
  156. Args* dict = _OBJ2DICT(self);
  157. return args_getSize(dict);
  158. }
  159. int PikaStdData_dict_keys___len__(PikaObj* self) {
  160. PikaObj* dictptr = obj_getPtr(self, "dictptr");
  161. Args* keys = _OBJ2KEYS(dictptr);
  162. return args_getSize(keys);
  163. }
  164. int dict_contains(PikaDict* dict, Arg* key) {
  165. Hash hash = hash_time33(arg_getStr(key));
  166. if (args_isArgExist_hash(_OBJ2DICT(dict), hash)) {
  167. return pika_true;
  168. }
  169. return pika_false;
  170. }
  171. int PikaStdData_Dict___contains__(PikaObj* self, Arg* val) {
  172. return dict_contains(self, val);
  173. }
  174. Arg* PikaStdData_dict_items___iter__(PikaObj* self) {
  175. PikaObj* dictptr = obj_getPtr(self, "dictptr");
  176. obj_setInt(self, "__iter_i", args_getSize(_OBJ2KEYS(dictptr)));
  177. return arg_newRef(self);
  178. }
  179. int PikaStdData_dict_items___len__(PikaObj* self) {
  180. PikaObj* dictptr = obj_getPtr(self, "dictptr");
  181. Args* keys = _OBJ2KEYS(dictptr);
  182. return args_getSize(keys);
  183. }
  184. Arg* PikaStdData_dict_items___next__(PikaObj* self) {
  185. int __iter_i = args_getInt(self->list, "__iter_i") - 1;
  186. if (__iter_i < 0) {
  187. return NULL;
  188. }
  189. PikaObj* dictptr = obj_getPtr(self, "dictptr");
  190. Args* keys = _OBJ2KEYS(dictptr);
  191. Args* dict = _OBJ2DICT(dictptr);
  192. Arg* key = args_getArgByIndex(keys, __iter_i);
  193. Arg* val = args_getArgByIndex(dict, __iter_i);
  194. PikaObj* tuple = New_pikaTuple();
  195. pikaList_append(tuple, arg_copy(key));
  196. pikaList_append(tuple, arg_copy(val));
  197. args_setInt(self->list, "__iter_i", __iter_i);
  198. return arg_newObj(tuple);
  199. }
  200. char* PikaStdData_dict_items___str__(PikaObj* self) {
  201. Arg* str_arg = arg_newStr("dict_items([");
  202. int i = 0;
  203. arg_deinit(PikaStdData_dict_items___iter__(self));
  204. while (PIKA_TRUE) {
  205. Arg* item = PikaStdData_dict_items___next__(self);
  206. if (item == NULL) {
  207. break;
  208. }
  209. if (i != 0) {
  210. str_arg = arg_strAppend(str_arg, ", ");
  211. }
  212. char* item_str = builtins_str(self, item);
  213. str_arg = arg_strAppend(str_arg, item_str);
  214. i++;
  215. arg_deinit(item);
  216. }
  217. str_arg = arg_strAppend(str_arg, "])");
  218. obj_setStr(self, "_buf", arg_getStr(str_arg));
  219. arg_deinit(str_arg);
  220. return obj_getStr(self, "_buf");
  221. }
  222. void PikaStdData_Dict_update(PikaObj* self, PikaObj* other) {
  223. PikaObj* context = newNormalObj(New_PikaStdLib_SysObj);
  224. obj_setRef(context, "@other", other);
  225. obj_setRef(context, "@self", self);
  226. /* clang-format off */
  227. PIKA_PYTHON(
  228. for @item in @other:
  229. @self[@item] = @other[@item]
  230. )
  231. /* clang-format on */
  232. const uint8_t
  233. bytes[] =
  234. {
  235. 0x40, 0x00, 0x00, 0x00, /* instruct array size */
  236. 0x10, 0x81, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x04,
  237. 0x0d, 0x00, 0x00, 0x82, 0x11, 0x00, 0x00, 0x04, 0x1e, 0x00,
  238. 0x00, 0x0d, 0x1e, 0x00, 0x00, 0x07, 0x24, 0x00, 0x11, 0x81,
  239. 0x26, 0x00, 0x11, 0x01, 0x1e, 0x00, 0x21, 0x01, 0x01, 0x00,
  240. 0x21, 0x01, 0x1e, 0x00, 0x11, 0x1d, 0x00, 0x00, 0x01, 0x02,
  241. 0x2c, 0x00, 0x01, 0x04, 0x26, 0x00, 0x00, 0x86, 0x38, 0x00,
  242. 0x00, 0x8c, 0x0d, 0x00, /* instruct array */
  243. 0x3b, 0x00, 0x00, 0x00, /* const pool size */
  244. 0x00, 0x40, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x00, 0x69, 0x74,
  245. 0x65, 0x72, 0x00, 0x24, 0x6c, 0x30, 0x00, 0x24, 0x6c, 0x30,
  246. 0x2e, 0x5f, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x5f, 0x00,
  247. 0x40, 0x69, 0x74, 0x65, 0x6d, 0x00, 0x32, 0x00, 0x40, 0x73,
  248. 0x65, 0x6c, 0x66, 0x00, 0x5f, 0x5f, 0x73, 0x65, 0x74, 0x69,
  249. 0x74, 0x65, 0x6d, 0x5f, 0x5f, 0x00, 0x2d, 0x31, 0x00, /* const
  250. pool */
  251. };
  252. pikaVM_runByteCode(context, (uint8_t*)bytes);
  253. obj_deinit(context);
  254. }
  255. int PikaStdData_Dict___eq__(PikaObj* self, Arg* other) {
  256. if (!arg_isObject(other)) {
  257. return 0;
  258. }
  259. PikaObj* oOther = arg_getObj(other);
  260. if (self->constructor != oOther->constructor) {
  261. return 0;
  262. }
  263. if (obj_getSize(self) != obj_getSize(oOther)) {
  264. return 0;
  265. }
  266. for (size_t i = 0; i < obj_getSize(self); i++) {
  267. Arg* key = args_getArgByIndex(_OBJ2KEYS(self), i);
  268. Arg* val = args_getArgByIndex(_OBJ2DICT(self), i);
  269. Arg* oVal = pikaDict_get(oOther, arg_getStr(key));
  270. if (NULL == oVal) {
  271. return 0;
  272. }
  273. if (!arg_isEqual(val, oVal)) {
  274. return 0;
  275. }
  276. }
  277. return 1;
  278. }