| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- #pragma once
- #include "common.h"
- #include "memory.h"
- #include "str.h"
- #include "vector.h"
- namespace pkpy {
- using List = pod_vector<PyObject*, 4>;
- struct Tuple {
- PyObject** _args;
- PyObject* _inlined[3];
- int _size;
- Tuple(int n);
- Tuple(const Tuple& other);
- Tuple(Tuple&& other) noexcept;
- Tuple(List&& other) noexcept;
- ~Tuple();
- Tuple(PyObject*, PyObject*);
- Tuple(PyObject*, PyObject*, PyObject*);
- Tuple(PyObject*, PyObject*, PyObject*, PyObject*);
- bool is_inlined() const { return _args == _inlined; }
- PyObject*& operator[](int i){ return _args[i]; }
- PyObject* operator[](int i) const { return _args[i]; }
- int size() const { return _size; }
- PyObject** begin() const { return _args; }
- PyObject** end() const { return _args + _size; }
- PyObject** data() const { return _args; }
- };
- // a lightweight view for function args, it does not own the memory
- struct ArgsView{
- PyObject** _begin;
- PyObject** _end;
- ArgsView(PyObject** begin, PyObject** end) : _begin(begin), _end(end) {}
- ArgsView(const Tuple& t) : _begin(t.begin()), _end(t.end()) {}
- PyObject** begin() const { return _begin; }
- PyObject** end() const { return _end; }
- int size() const { return _end - _begin; }
- bool empty() const { return _begin == _end; }
- PyObject* operator[](int i) const { return _begin[i]; }
- List to_list() const;
- Tuple to_tuple() const;
- };
- } // namespace pkpy
|