#ifndef Py_LISTOBJECT_H #define Py_LISTOBJECT_H #include "third_party/python/Include/object.h" COSMOPOLITAN_C_START_ /* clang-format off */ /* List object interface Another generally useful object type is a list of object pointers. This is a mutable type: the list items can be changed, and items can be added or removed. Out-of-range indices or non-list objects are ignored. *** WARNING *** PyList_SetItem does not increment the new item's reference count, but does decrement the reference count of the item it replaces, if not nil. It does *decrement* the reference count if it is *not* inserted in the list. Similarly, PyList_GetItem does not increment the returned item's reference count. */ #ifndef Py_LIMITED_API typedef struct { PyObject_VAR_HEAD /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ PyObject **ob_item; /* ob_item contains space for 'allocated' elements. The number * currently in use is ob_size. * Invariants: * 0 <= ob_size <= allocated * len(list) == ob_size * ob_item == NULL implies ob_size == allocated == 0 * list.sort() temporarily sets allocated to -1 to detect mutations. * * Items must normally not be NULL, except during construction when * the list is not yet visible outside the function that builds it. */ Py_ssize_t allocated; } PyListObject; #endif extern PyTypeObject PyList_Type; extern PyTypeObject PyListIter_Type; extern PyTypeObject PyListRevIter_Type; extern PyTypeObject PySortWrapper_Type; #define PyList_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) #define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type) PyObject * PyList_New(Py_ssize_t size); Py_ssize_t PyList_Size(PyObject *); PyObject * PyList_GetItem(PyObject *, Py_ssize_t); int PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); int PyList_Insert(PyObject *, Py_ssize_t, PyObject *); int PyList_Append(PyObject *, PyObject *); PyObject * PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); int PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); int PyList_Sort(PyObject *); int PyList_Reverse(PyObject *); PyObject * PyList_AsTuple(PyObject *); #ifndef Py_LIMITED_API PyObject * _PyList_Extend(PyListObject *, PyObject *); int PyList_ClearFreeList(void); void _PyList_DebugMallocStats(FILE *out); #endif /* Macro, trading safety for speed */ #ifndef Py_LIMITED_API #define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i]) #define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v)) #define PyList_GET_SIZE(op) Py_SIZE(op) #define _PyList_ITEMS(op) (((PyListObject *)(op))->ob_item) #endif COSMOPOLITAN_C_END_ #endif /* !Py_LISTOBJECT_H */