dict.hpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #pragma once
  2. #include "pocketpy/objects/base.hpp"
  3. #include "pocketpy/objects/tuplelist.hpp"
  4. #include "pocketpy/objects/dict.h"
  5. namespace pkpy {
  6. struct Dict : private pkpy_Dict {
  7. Dict() {
  8. pkpy_Dict__ctor(this);
  9. }
  10. Dict(Dict&& other) {
  11. std::memcpy(this, &other, sizeof(Dict));
  12. pkpy_Dict__ctor(&other);
  13. }
  14. Dict(const Dict& other) {
  15. // OPTIMIZEME: reduce copy
  16. auto clone = pkpy_Dict__copy(&other);
  17. std::memcpy(this, &clone, sizeof(Dict));
  18. }
  19. Dict& operator= (const Dict&) = delete;
  20. Dict& operator= (Dict&&) = delete;
  21. int size() const { return count; }
  22. void set(VM* vm, PyVar key, PyVar val) {
  23. pkpy_Dict__set(this, vm, *(pkpy_Var*)(&key), *(pkpy_Var*)(&val));
  24. }
  25. PyVar try_get(VM* vm, PyVar key) const {
  26. auto res = pkpy_Dict__try_get(this, vm, *(pkpy_Var*)(&key));
  27. if (!res) return nullptr;
  28. return *(const PyVar*)(res);
  29. }
  30. bool contains(VM* vm, PyVar key) const {
  31. return pkpy_Dict__contains(this, vm, *(pkpy_Var*)(&key));
  32. }
  33. bool del(VM* vm, PyVar key) {
  34. return pkpy_Dict__del(this, vm, *(pkpy_Var*)(&key));
  35. }
  36. void update(VM* vm, const Dict& other) {
  37. pkpy_Dict__update(this, vm, &other);
  38. }
  39. template <typename __Func>
  40. void apply(__Func f) const {
  41. pkpy_DictIter it = iter();
  42. PyVar key, val;
  43. while(pkpy_DictIter__next(&it, (pkpy_Var*)(&key), (pkpy_Var*)(&val))) {
  44. f(key, val);
  45. }
  46. }
  47. Tuple keys() const {
  48. Tuple res(count);
  49. pkpy_DictIter it = iter();
  50. PyVar key, val;
  51. int i = 0;
  52. while(pkpy_DictIter__next(&it, (pkpy_Var*)(&key), (pkpy_Var*)(&val))) {
  53. res[i++] = key;
  54. }
  55. return res;
  56. }
  57. Tuple values() const {
  58. Tuple res(count);
  59. pkpy_DictIter it = iter();
  60. PyVar key, val;
  61. int i = 0;
  62. while(pkpy_DictIter__next(&it, (pkpy_Var*)(&key), (pkpy_Var*)(&val))) {
  63. res[i++] = val;
  64. }
  65. return res;
  66. }
  67. pkpy_DictIter iter() const {
  68. return pkpy_Dict__iter(this);
  69. }
  70. void clear() {
  71. pkpy_Dict__clear(this);
  72. }
  73. ~Dict() {
  74. pkpy_Dict__dtor(this);
  75. }
  76. void _gc_mark(VM*) const;
  77. };
  78. } // namespace pkpy