10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi/* List object interface */
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi/*
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiAnother generally useful object type is an list of object pointers.
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiThis is a mutable type: the list items can be changed, and items can be
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiadded or removed.  Out-of-range indices or non-list objects are ignored.
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi*** WARNING *** PyList_SetItem does not increment the new item's reference
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yicount, but does decrement the reference count of the item it replaces,
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif not nil.  It does *decrement* the reference count if it is *not*
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiinserted in the list.  Similarly, PyList_GetItem does not increment the
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yireturned item's reference count.
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi*/
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#ifndef Py_LISTOBJECT_H
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#define Py_LISTOBJECT_H
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#ifdef __cplusplus
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiextern "C" {
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#endif
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitypedef struct {
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    PyObject_VAR_HEAD
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    PyObject **ob_item;
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    /* ob_item contains space for 'allocated' elements.  The number
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi     * currently in use is ob_size.
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi     * Invariants:
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi     *     0 <= ob_size <= allocated
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi     *     len(list) == ob_size
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi     *     ob_item == NULL implies ob_size == allocated == 0
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi     * list.sort() temporarily sets allocated to -1 to detect mutations.
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi     *
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi     * Items must normally not be NULL, except during construction when
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi     * the list is not yet visible outside the function that builds it.
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi     */
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    Py_ssize_t allocated;
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi} PyListObject;
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_DATA(PyTypeObject) PyList_Type;
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#define PyList_Check(op) \
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi		PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS)
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type)
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size);
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *);
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t);
500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *);
510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *);
520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *);
530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t);
540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *);
550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(int) PyList_Sort(PyObject *);
560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(int) PyList_Reverse(PyObject *);
570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *);
580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiPyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *);
590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi/* Macro, trading safety for speed */
610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i])
620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v))
630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#define PyList_GET_SIZE(op)    Py_SIZE(op)
640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#ifdef __cplusplus
660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi}
670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#endif
680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi#endif /* !Py_LISTOBJECT_H */
69