cinap_lenrekadd hg and python4bb9e2215 years agoHistory
1370 lines · 32.6 KB · C
RawDownload
 	i += deque->leftindex;	n = i / BLOCKLEN;	i %= BLOCKLEN;	if (index <= halflen) {		b = deque->leftblock;		while (n--)			b = b->rightlink;	} else {		n = (deque->leftindex + 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){	int rv; 	rv = deque_clear(deque);	assert (rv != -1);	Py_RETURN_NONE;} PyDoc_STRVAR(clear_doc, "Remove all elements from the deque."); static voiddeque_dealloc(dequeobject *deque){	PyObject_GC_UnTrack(deque);	if (deque->weakreflist != NULL)		PyObject_ClearWeakRefs((PyObject *) deque);	if (deque->leftblock != NULL) {		deque_clear(deque);		assert(deque->leftblock != NULL);		PyMem_Free(deque->leftblock);	}	deque->leftblock = NULL;	deque->rightblock = NULL;	deque->ob_type->tp_free(deque);} static intdeque_traverse(dequeobject *deque, visitproc visit, void *arg){	block *b;	PyObject *item;	int index;	int indexlo = deque->leftindex; 	for (b = deque->leftblock; b != NULL; b = b->rightlink) {		const int indexhi = b == deque->rightblock ?					 deque->rightindex :				    	 BLOCKLEN - 1; 		for (index = indexlo; index <= indexhi; ++index) {			item = b->data[index];			Py_VISIT(item);		}		indexlo = 0;	}	return 0;} static longdeque_nohash(PyObject *self){	PyErr_SetString(PyExc_TypeError, "deque objects are unhashable");	return -1;} static PyObject *deque_copy(PyObject *deque){	return PyObject_CallFunctionObjArgs((PyObject *)(deque->ob_type),		deque, NULL);} PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque."); static PyObject *deque_reduce(dequeobject *deque){	PyObject *dict, *result, *it; 	dict = PyObject_GetAttrString((PyObject *)deque, "__dict__");	if (dict == NULL) {		PyErr_Clear();		dict = Py_None;		Py_INCREF(dict);	}	it = PyObject_GetIter((PyObject *)deque);	if (it == NULL) {		Py_DECREF(dict);		return NULL;	}	result = Py_BuildValue("O()ON", deque->ob_type, dict, it);	Py_DECREF(dict);	return result;} PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); static PyObject *deque_repr(PyObject *deque){	PyObject *aslist, *result, *fmt;	int i; 	i = Py_ReprEnter(deque);	if (i != 0) {		if (i < 0)			return NULL;		return PyString_FromString("[...]");	} 	aslist = PySequence_List(deque);	if (aslist == NULL) {		Py_ReprLeave(deque);		return NULL;	} 	fmt = PyString_FromString("deque(%r)");	if (fmt == NULL) {		Py_DECREF(aslist);		Py_ReprLeave(deque);		return NULL;	}	result = PyString_Format(fmt, aslist);	Py_DECREF(fmt);	Py_DECREF(aslist);	Py_ReprLeave(deque);	return result;} static intdeque_tp_print(PyObject *deque, FILE *fp, int flags){	PyObject *it, *item;	char *emit = "";	/* No separator emitted on first pass */	char *separator = ", ";	int i; 	i = Py_ReprEnter(deque);	if (i != 0) {		if (i < 0)			return i;		fputs("[...]", fp);		return 0;	} 	it = PyObject_GetIter(deque);	if (it == NULL)		return -1; 	fputs("deque([", fp);	while ((item = PyIter_Next(it)) != NULL) {		fputs(emit, fp);		emit = separator;		if (PyObject_Print(item, fp, 0) != 0) {			Py_DECREF(item);			Py_DECREF(it);			Py_ReprLeave(deque);			return -1;		}		Py_DECREF(item);	}	Py_ReprLeave(deque);	Py_DECREF(it);	if (PyErr_Occurred())		return -1;	fputs("])", fp);	return 0;} static PyObject *deque_richcompare(PyObject *v, PyObject *w, int op){	PyObject *it1=NULL, *it2=NULL, *x, *y;	int b, vs, ws, cmp=-1; 	if (!PyObject_TypeCheck(v, &deque_type) ||	    !PyObject_TypeCheck(w, &deque_type)) {		Py_INCREF(Py_NotImplemented);		return Py_NotImplemented;	} 	/* Shortcuts */	vs = ((dequeobject *)v)->len;	ws = ((dequeobject *)w)->len;	if (op == Py_EQ) {		if (v == w)			Py_RETURN_TRUE;		if (vs != ws)			Py_RETURN_FALSE;	}	if (op == Py_NE) {		if (v == w)			Py_RETURN_FALSE;		if (vs != ws)			Py_RETURN_TRUE;	} 	/* Search for the first index where items are different */	it1 = PyObject_GetIter(v);	if (it1 == NULL)		goto done;	it2 = PyObject_GetIter(w);	if (it2 == NULL)		goto done;	for (;;) {		x = PyIter_Next(it1);		if (x == NULL && PyErr_Occurred())			goto done;		y = PyIter_Next(it2);		if (x == NULL || y == NULL)			break;		b = PyObject_RichCompareBool(x, y, Py_EQ);		if (b == 0) {			cmp = PyObject_RichCompareBool(x, y, op);			Py_DECREF(x);			Py_DECREF(y);			goto done;		}		Py_DECREF(x);		Py_DECREF(y);		if (b == -1)			goto done;	}	/* We reached the end of one deque or both */	Py_XDECREF(x);	Py_XDECREF(y);	if (PyErr_Occurred())		goto done;	switch (op) {	case Py_LT: cmp = y != NULL; break;  /* if w was longer */	case Py_LE: cmp = x == NULL; break;  /* if v was not longer */	case Py_EQ: cmp = x == y;    break;  /* if we reached the end of both */	case Py_NE: cmp = x != y;    break;  /* if one deque continues */	case Py_GT: cmp = x != NULL; break;  /* if v was longer */	case Py_GE: cmp = y == NULL; break;  /* if w was not longer */	} done:	Py_XDECREF(it1);	Py_XDECREF(it2);	if (cmp == 1)		Py_RETURN_TRUE;	if (cmp == 0)		Py_RETURN_FALSE;	return NULL;} static intdeque_init(dequeobject *deque, PyObject *args, PyObject *kwds){	PyObject *iterable = NULL; 	if (!PyArg_UnpackTuple(args, "deque", 0, 1, &iterable))		return -1; 	if (iterable != NULL) {		PyObject *rv = deque_extend(deque, iterable);		if (rv == NULL)			return -1;		Py_DECREF(rv);	}	return 0;} static PySequenceMethods deque_as_sequence = {	(lenfunc)deque_len,		/* sq_length */	0,				/* sq_concat */	0,				/* sq_repeat */	(ssizeargfunc)deque_item,	/* sq_item */	0,				/* sq_slice */	(ssizeobjargproc)deque_ass_item,	/* sq_ass_item */}; /* deque object ********************************************************/ 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[] = {	{"append",		(PyCFunction)deque_append,		METH_O,		 append_doc},	{"appendleft",		(PyCFunction)deque_appendleft,		METH_O,		 appendleft_doc},	{"clear",		(PyCFunction)deque_clearmethod,		METH_NOARGS,	 clear_doc},	{"__copy__",		(PyCFunction)deque_copy,		METH_NOARGS,	 copy_doc},	{"extend",		(PyCFunction)deque_extend,		METH_O,		 extend_doc},	{"extendleft",		(PyCFunction)deque_extendleft,		METH_O,		 extendleft_doc},	{"pop",			(PyCFunction)deque_pop,		METH_NOARGS,	 pop_doc},	{"popleft",		(PyCFunction)deque_popleft,		METH_NOARGS,	 popleft_doc},	{"__reduce__",	(PyCFunction)deque_reduce,		METH_NOARGS,	 reduce_doc},	{"remove",		(PyCFunction)deque_remove,		METH_O,		 remove_doc},	{"__reversed__",	(PyCFunction)deque_reviter,		METH_NOARGS,	 reversed_doc},	{"rotate",		(PyCFunction)deque_rotate,		METH_VARARGS,	rotate_doc},	{NULL,		NULL}	/* sentinel */}; PyDoc_STRVAR(deque_doc,"deque(iterable) --> deque object\n\\n\Build an ordered collection accessible from endpoints only."); static PyTypeObject deque_type = {	PyObject_HEAD_INIT(NULL)	0,				/* ob_size */	"collections.deque",		/* tp_name */	sizeof(dequeobject),		/* tp_basicsize */	0,				/* tp_itemsize */	/* methods */	(destructor)deque_dealloc,	/* tp_dealloc */	deque_tp_print,			/* tp_print */	0,				/* tp_getattr */	0,				/* tp_setattr */	0,				/* tp_compare */	deque_repr,			/* tp_repr */	0,				/* tp_as_number */	&deque_as_sequence,		/* tp_as_sequence */	0,				/* tp_as_mapping */	deque_nohash,			/* tp_hash */	0,				/* tp_call */	0,				/* tp_str */	PyObject_GenericGetAttr,	/* tp_getattro */	0,				/* tp_setattro */	0,				/* tp_as_buffer */	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |		Py_TPFLAGS_HAVE_WEAKREFS,	/* tp_flags */	deque_doc,			/* tp_doc */	(traverseproc)deque_traverse,	/* tp_traverse */	(inquiry)deque_clear,		/* tp_clear */	(richcmpfunc)deque_richcompare,	/* tp_richcompare */	offsetof(dequeobject, weakreflist),	/* tp_weaklistoffset*/	(getiterfunc)deque_iter,	/* tp_iter */	0,				/* tp_iternext */	deque_methods,			/* tp_methods */	0,				/* tp_members */	0,				/* tp_getset */	0,				/* tp_base */	0,				/* tp_dict */	0,				/* tp_descr_get */	0,				/* tp_descr_set */	0,				/* tp_dictoffset */	(initproc)deque_init,		/* tp_init */	PyType_GenericAlloc,		/* tp_alloc */	deque_new,			/* tp_new */	PyObject_GC_Del,		/* tp_free */}; /*********************** Deque Iterator **************************/ typedef struct {	PyObject_HEAD	int index;	block *b;	dequeobject *deque;	long state;	/* state when the iterator is created */	int counter;    /* number of items remaining for iteration */} dequeiterobject; PyTypeObject dequeiter_type; static PyObject *deque_iter(dequeobject *deque){	dequeiterobject *it; 	it = PyObject_New(dequeiterobject, &dequeiter_type);	if (it == NULL)		return NULL;	it->b = deque->leftblock;	it->index = deque->leftindex;	Py_INCREF(deque);	it->deque = deque;	it->state = deque->state;	it->counter = deque->len;	return (PyObject *)it;} static voiddequeiter_dealloc(dequeiterobject *dio){	Py_XDECREF(dio->deque);	dio->ob_type->tp_free(dio);} static PyObject *dequeiter_next(dequeiterobject *it){	PyObject *item; 	if (it->deque->state != it->state) {		it->counter = 0;		PyErr_SetString(PyExc_RuntimeError,				"deque mutated during iteration");		return NULL;	}	if (it->counter == 0)		return NULL;        	assert (!(it->b == it->deque->rightblock &&		  it->index > it->deque->rightindex)); 	item = it->b->data[it->index];	it->index++;	it->counter--;	if (it->index == BLOCKLEN && it->counter > 0) {		assert (it->b->rightlink != NULL);		it->b = it->b->rightlink;		it->index = 0;	}	Py_INCREF(item);	return item;} static PyObject *dequeiter_len(dequeiterobject *it){	return PyInt_FromLong(it->counter);} PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it))."); static PyMethodDef dequeiter_methods[] = {	{"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc}, 	{NULL,		NULL}		/* sentinel */}; PyTypeObject dequeiter_type = {	PyObject_HEAD_INIT(NULL)	0,					/* ob_size */	"deque_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)dequeiter_next,		/* tp_iternext */	dequeiter_methods,			/* tp_methods */	0,}; /*********************** 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->state = deque->state;

Lines 501–1000 of 1370. Previous lines

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t