tuplelist.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #pragma once
  2. #include "common.h"
  3. #include "memory.h"
  4. #include "str.h"
  5. #include "vector.h"
  6. namespace pkpy {
  7. struct List: pod_vector<PyVar, 4>{
  8. using pod_vector<PyVar, 4>::pod_vector;
  9. void _gc_mark(VM*) const;
  10. };
  11. struct Tuple {
  12. static const int INLINED_SIZE = 4;
  13. PyVar* _args;
  14. PyVar _inlined[INLINED_SIZE];
  15. int _size;
  16. Tuple(int n);
  17. Tuple(const Tuple& other);
  18. Tuple(Tuple&& other) noexcept;
  19. Tuple(List&& other) noexcept;
  20. ~Tuple();
  21. Tuple(PyVar, PyVar);
  22. Tuple(PyVar, PyVar, PyVar);
  23. Tuple(PyVar, PyVar, PyVar, PyVar);
  24. bool is_inlined() const { return _args == _inlined; }
  25. PyVar& operator[](int i){ return _args[i]; }
  26. PyVar operator[](int i) const { return _args[i]; }
  27. int size() const { return _size; }
  28. PyVar* begin() const { return _args; }
  29. PyVar* end() const { return _args + _size; }
  30. PyVar* data() const { return _args; }
  31. void _gc_mark(VM*) const;
  32. };
  33. // a lightweight view for function args, it does not own the memory
  34. struct ArgsView{
  35. PyVar* _begin;
  36. PyVar* _end;
  37. ArgsView(PyVar* begin, PyVar* end) : _begin(begin), _end(end) {}
  38. ArgsView(const Tuple& t) : _begin(t.begin()), _end(t.end()) {}
  39. PyVar* begin() const { return _begin; }
  40. PyVar* end() const { return _end; }
  41. int size() const { return _end - _begin; }
  42. bool empty() const { return _begin == _end; }
  43. PyVar operator[](int i) const { return _begin[i]; }
  44. List to_list() const;
  45. Tuple to_tuple() const;
  46. };
  47. } // namespace pkpy