[Python-checkins] python/dist/src/Modules collectionsmodule.c, 1.9, 1.10

rhettinger at users.sourceforge.net rhettinger at users.sourceforge.net
Mon Mar 1 18:16:23 EST 2004


Update of /cvsroot/python/python/dist/src/Modules
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4871/modules

Modified Files:
	collectionsmodule.c 
Log Message:
Replace left(), right(), and __reversed__() with the more general purpose
__getitem__() and __setitem__().  

Simplifies the API, reduces the code size, adds flexibility, and makes
deques work with bisect.bisect(), random.shuffle(), and random.sample().



Index: collectionsmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/collectionsmodule.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** collectionsmodule.c	29 Feb 2004 15:40:53 -0000	1.9
--- collectionsmodule.c	1 Mar 2004 23:16:20 -0000	1.10
***************
*** 178,213 ****
  
  static PyObject *
- deque_right(dequeobject *deque, PyObject *unused)
- {
- 	PyObject *item;
- 
- 	if (deque->len == 0) {
- 		PyErr_SetString(PyExc_IndexError, "deque is empty");
- 		return NULL;
- 	}
- 	item = deque->rightblock->data[deque->rightindex];
- 	Py_INCREF(item);
- 	return item;
- }
- 
- PyDoc_STRVAR(right_doc, "Return the rightmost element.");
- 
- static PyObject *
- deque_left(dequeobject *deque, PyObject *unused)
- {
- 	PyObject *item;
- 
- 	if (deque->len == 0) {
- 		PyErr_SetString(PyExc_IndexError, "deque is empty");
- 		return NULL;
- 	}
- 	item = deque->leftblock->data[deque->leftindex];
- 	Py_INCREF(item);
- 	return item;
- }
- 
- PyDoc_STRVAR(left_doc, "Return the leftmost element.");
- 
- static PyObject *
  deque_extend(dequeobject *deque, PyObject *iterable)
  {
--- 178,181 ----
***************
*** 347,350 ****
--- 315,381 ----
  
  static PyObject *
+ deque_item(dequeobject *deque, int i)
+ {
+ 	block *b;
+ 	PyObject *item;
+ 	int n;
+ 
+ 	if (i < 0 || i >= deque->len) {
+ 		PyErr_SetString(PyExc_IndexError,
+ 				"deque index out of range");
+ 		return NULL;
+ 	}
+ 
+ 	i += deque->leftindex;
+ 	n = i / BLOCKLEN;
+ 	i %= BLOCKLEN;
+ 	if (i < (deque->len >> 1)) {
+ 		b = deque->leftblock;
+ 		while (n--)
+ 			b = b->rightlink;
+ 	} else {
+ 		n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;
+ 		b = deque->rightblock;
+ 		while (n--)
+ 			b = b->leftlink;
+ 	}
+ 	item = b->data[i];
+ 	Py_INCREF(item);
+ 	return item;
+ }
+ 
+ static int
+ deque_ass_item(dequeobject *deque, int i, PyObject *v)
+ {
+ 	PyObject *old_value;
+ 	block *b;
+ 	int n;
+ 
+ 	if (i < 0 || i >= deque->len) {
+ 		PyErr_SetString(PyExc_IndexError,
+ 				"deque index out of range");
+ 		return -1;
+ 	}
+ 	i += deque->leftindex;
+ 	n = i / BLOCKLEN;
+ 	i %= BLOCKLEN;
+ 	if (i < (deque->len >> 1)) {
+ 		b = deque->leftblock;
+ 		while (n--)
+ 			b = b->rightlink;
+ 	} else {
+ 		n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;
+ 		b = deque->rightblock;
+ 		while (n--)
+ 			b = b->leftlink;
+ 	}
+ 	Py_INCREF(v);
+ 	old_value = b->data[i];
+ 	b->data[i] = v;
+ 	Py_DECREF(old_value);
+ 	return 0;
+ }
+ 
+ static PyObject *
  deque_clearmethod(dequeobject *deque)
  {
***************
*** 372,376 ****
  
  static int
! set_traverse(dequeobject *deque, visitproc visit, void *arg)
  {
  	block * b = deque->leftblock;
--- 403,407 ----
  
  static int
! deque_traverse(dequeobject *deque, visitproc visit, void *arg)
  {
  	block * b = deque->leftblock;
***************
*** 598,601 ****
--- 629,636 ----
  	(inquiry)deque_len,		/* sq_length */
  	0,				/* sq_concat */
+ 	0,				/* sq_repeat */
+ 	(intargfunc)deque_item,		/* sq_item */
+ 	0,				/* sq_slice */
+ 	(intobjargproc)deque_ass_item,	/* sq_ass_item */
  };
  
***************
*** 603,609 ****
  
  static PyObject *deque_iter(dequeobject *deque);
- static PyObject *deque_reviter(dequeobject *deque);
- PyDoc_STRVAR(reversed_doc, 
- 	"D.__reversed__() -- return a reverse iterator over the deque");
  
  static PyMethodDef deque_methods[] = {
--- 638,641 ----
***************
*** 620,625 ****
  	{"extendleft",	(PyCFunction)deque_extendleft,	
  		METH_O,		 extendleft_doc},
- 	{"left",		(PyCFunction)deque_left,	
- 		METH_NOARGS,	 left_doc},
  	{"pop",			(PyCFunction)deque_pop,	
  		METH_NOARGS,	 pop_doc},
--- 652,655 ----
***************
*** 628,635 ****
  	{"__reduce__",	(PyCFunction)deque_reduce,	
  		METH_NOARGS,	 reduce_doc},
- 	{"__reversed__",	(PyCFunction)deque_reviter,	
- 		METH_NOARGS,	 reversed_doc},
- 	{"right",		(PyCFunction)deque_right,	
- 		METH_NOARGS,	 right_doc},
  	{"rotate",		(PyCFunction)deque_rotate,	
  		METH_VARARGS,	rotate_doc},
--- 658,661 ----
***************
*** 666,670 ****
  	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,	/* tp_flags */
  	deque_doc,			/* tp_doc */
! 	(traverseproc)set_traverse,	/* tp_traverse */
  	(inquiry)deque_clear,		/* tp_clear */
  	(richcmpfunc)deque_richcompare,	/* tp_richcompare */
--- 692,696 ----
  	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,	/* tp_flags */
  	deque_doc,			/* tp_doc */
! 	(traverseproc)deque_traverse,	/* tp_traverse */
  	(inquiry)deque_clear,		/* tp_clear */
  	(richcmpfunc)deque_richcompare,	/* tp_richcompare */
***************
*** 778,858 ****
  };
  
- /*********************** Deque Reverse Iterator **************************/
- 
- PyTypeObject dequereviter_type;
- 
- static PyObject *
- deque_reviter(dequeobject *deque)
- {
- 	dequeiterobject *it;
- 
- 	it = PyObject_New(dequeiterobject, &dequereviter_type);
- 	if (it == NULL)
- 		return NULL;
- 	it->b = deque->rightblock;
- 	it->index = deque->rightindex;
- 	Py_INCREF(deque);
- 	it->deque = deque;
- 	it->len = deque->len;
- 	return (PyObject *)it;
- }
- 
- static PyObject *
- dequereviter_next(dequeiterobject *it)
- {
- 	PyObject *item;
- 	if (it->b == it->deque->leftblock && it->index < it->deque->leftindex)
- 		return NULL;
- 
- 	if (it->len != it->deque->len) {
- 		it->len = -1; /* Make this state sticky */
- 		PyErr_SetString(PyExc_RuntimeError,
- 				"deque changed size during iteration");
- 		return NULL;
- 	}
- 
- 	item = it->b->data[it->index];
- 	it->index--;
- 	if (it->index == -1 && it->b->leftlink != NULL) {
- 		it->b = it->b->leftlink;
- 		it->index = BLOCKLEN - 1;
- 	}
- 	Py_INCREF(item);
- 	return item;
- }
- 
- PyTypeObject dequereviter_type = {
- 	PyObject_HEAD_INIT(NULL)
- 	0,					/* ob_size */
- 	"deque_reverse_iterator",		/* tp_name */
- 	sizeof(dequeiterobject),		/* tp_basicsize */
- 	0,					/* tp_itemsize */
- 	/* methods */
- 	(destructor)dequeiter_dealloc,		/* tp_dealloc */
- 	0,					/* tp_print */
- 	0,					/* tp_getattr */
- 	0,					/* tp_setattr */
- 	0,					/* tp_compare */
- 	0,					/* tp_repr */
- 	0,					/* tp_as_number */
- 	0,					/* tp_as_sequence */
- 	0,					/* tp_as_mapping */
- 	0,					/* tp_hash */
- 	0,					/* tp_call */
- 	0,					/* tp_str */
- 	PyObject_GenericGetAttr,		/* tp_getattro */
- 	0,					/* tp_setattro */
- 	0,					/* tp_as_buffer */
- 	Py_TPFLAGS_DEFAULT,			/* tp_flags */
- 	0,					/* tp_doc */
- 	0,					/* tp_traverse */
- 	0,					/* tp_clear */
- 	0,					/* tp_richcompare */
- 	0,					/* tp_weaklistoffset */
- 	PyObject_SelfIter,			/* tp_iter */
- 	(iternextfunc)dequereviter_next,	/* tp_iternext */
- 	0,
- };
- 
  /* module level code ********************************************************/
  
--- 804,807 ----
***************
*** 876,882 ****
  		return;	
  
- 	if (PyType_Ready(&dequereviter_type) < 0)
- 		return;
- 
  	return;
  }
--- 825,828 ----




More information about the Python-checkins mailing list