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