tuplelist.h 1.3 KB

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