| 
									
										
										
										
											1991-02-19 12:39:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | /* List object interface */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | Another generally useful object type is an 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-12 11:45:45 +00:00
										 |  |  | *** WARNING *** PyList_SetItem does not increment the new item's reference | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 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* | 
					
						
							| 
									
										
										
										
											1995-01-12 11:45:45 +00:00
										 |  |  | inserted in the list.  Similarly, PyList_GetItem does not increment the | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | returned item's reference count. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  | #ifndef Py_LISTOBJECT_H
 | 
					
						
							|  |  |  | #define Py_LISTOBJECT_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  |     PyObject_VAR_HEAD | 
					
						
							| 
									
										
										
										
											2004-08-01 22:45:27 +00:00
										 |  |  |     /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */ | 
					
						
							| 
									
										
										
										
											2000-07-09 00:20:36 +00:00
										 |  |  |     PyObject **ob_item; | 
					
						
							| 
									
										
										
										
											2004-07-29 03:29:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* 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 | 
					
						
							| 
									
										
										
										
											2004-07-29 12:40:23 +00:00
										 |  |  |      * list.sort() temporarily sets allocated to -1 to detect mutations. | 
					
						
							| 
									
										
										
										
											2004-10-28 16:32:00 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * Items must normally not be NULL, except during construction when | 
					
						
							|  |  |  |      * the list is not yet visible outside the function that builds it. | 
					
						
							| 
									
										
										
										
											2004-07-29 03:29:15 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
											  
											
												* Optimized list appends and pops by making fewer calls the underlying system
  realloc().  This is achieved by tracking the overallocation size in a new
  field and using that information to skip calls to realloc() whenever
  possible.
* Simplified and tightened the amount of overallocation.  For larger lists,
  this overallocates by 1/8th (compared to the previous scheme which ranged
  between 1/4th to 1/32nd over-allocation).  For smaller lists (n<6), the
  maximum overallocation is one byte (formerly it could be upto eight bytes).
  This saves memory in applications with large numbers of small lists.
* Eliminated the NRESIZE macro in favor of a new, static list_resize function
  that encapsulates the resizing logic.  Coverting this back to macro would
  give a small (under 1%) speed-up.  This was too small to warrant the loss
  of readability, maintainability, and de-coupling.
* Some functions using NRESIZE had grown unnecessarily complex in their
  efforts to bend to the macro's calling pattern.  With the new list_resize
  function in place, those other functions could be simplified.  That is
  being saved for a separate patch.
* The ob_item==NULL check could be eliminated from the new list_resize
  function.  This would entail finding each piece of code that sets ob_item
  to NULL and adding a new line to invalidate the overallocation tracking
  field.  Rather than impose a new requirement on other pieces of list code,
  it was preferred to leave the NULL check in place and retain the benefits
  of decoupling, maintainability and information hiding (only PyList_New()
  and list_sort() need to know about the new field).  This approach also
  reduces the odds of breaking an extension module.
(Collaborative effort by Raymond Hettinger, Hye-Shik Chang, Tim Peters,
 and Armin Rigo.)
											
										 
											2004-02-13 11:36:39 +00:00
										 |  |  |     int allocated; | 
					
						
							| 
									
										
										
										
											1995-01-12 11:45:45 +00:00
										 |  |  | } PyListObject; | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-12 07:21:58 +00:00
										 |  |  | PyAPI_DATA(PyTypeObject) PyList_Type; | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | #define PyList_Check(op) PyObject_TypeCheck(op, &PyList_Type)
 | 
					
						
							| 
									
										
										
										
											2001-10-05 20:41:38 +00:00
										 |  |  | #define PyList_CheckExact(op) ((op)->ob_type == &PyList_Type)
 | 
					
						
							| 
									
										
										
										
											1990-10-14 12:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-12 07:21:58 +00:00
										 |  |  | PyAPI_FUNC(PyObject *) PyList_New(int size); | 
					
						
							|  |  |  | PyAPI_FUNC(int) PyList_Size(PyObject *); | 
					
						
							|  |  |  | PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, int); | 
					
						
							|  |  |  | PyAPI_FUNC(int) PyList_SetItem(PyObject *, int, PyObject *); | 
					
						
							|  |  |  | PyAPI_FUNC(int) PyList_Insert(PyObject *, int, PyObject *); | 
					
						
							|  |  |  | PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); | 
					
						
							|  |  |  | PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, int, int); | 
					
						
							|  |  |  | PyAPI_FUNC(int) PyList_SetSlice(PyObject *, int, int, PyObject *); | 
					
						
							|  |  |  | PyAPI_FUNC(int) PyList_Sort(PyObject *); | 
					
						
							|  |  |  | PyAPI_FUNC(int) PyList_Reverse(PyObject *); | 
					
						
							|  |  |  | PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *); | 
					
						
							| 
									
										
										
										
											2004-03-11 09:13:12 +00:00
										 |  |  | PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); | 
					
						
							| 
									
										
										
										
											1990-12-20 15:06:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Macro, trading safety for speed */ | 
					
						
							| 
									
										
										
										
											1997-01-06 22:42:00 +00:00
										 |  |  | #define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i])
 | 
					
						
							| 
									
										
										
										
											1998-04-24 18:22:02 +00:00
										 |  |  | #define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v))
 | 
					
						
							| 
									
										
										
										
											1997-01-06 22:42:00 +00:00
										 |  |  | #define PyList_GET_SIZE(op)    (((PyListObject *)(op))->ob_size)
 | 
					
						
							| 
									
										
										
										
											1993-07-28 09:05:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_LISTOBJECT_H */
 |