[Python-checkins] python/dist/src/Objects rangeobject.c,2.37,2.38

rhettinger@users.sourceforge.net rhettinger@users.sourceforge.net
Wed, 05 Jun 2002 13:08:50 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv21219

Modified Files:
	rangeobject.c 
Log Message:
SF 564601 adding rangeiterobject to make xrange() iterate like range(). 


Index: rangeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/rangeobject.c,v
retrieving revision 2.37
retrieving revision 2.38
diff -C2 -d -r2.37 -r2.38
*** rangeobject.c	4 Jun 2002 18:45:50 -0000	2.37
--- rangeobject.c	5 Jun 2002 20:08:48 -0000	2.38
***************
*** 9,14 ****
  	long	step;
  	long	len;
- 	long	index;
- 	int	used;	/* Set to 1 if called by range_getiter */	
  } rangeobject;
  
--- 9,12 ----
***************
*** 46,51 ****
  	obj->len   = len;
  	obj->step  = step;
- 	obj->index = 0;
- 	obj->used = 0;	
  
  	return (PyObject *) obj;
--- 44,47 ----
***************
*** 91,132 ****
  }
  
- static PyObject *
- range_getiter(rangeobject *r)
- {
- 	rangeobject *obj;
- 	if (r->used == 0 || r->index >= r->len) { 
- 		Py_INCREF(r);
- 		r->used = 1;
- 		r->index = 0;
- 		return (PyObject *)r;
- 	}
- 
- 	obj = PyObject_NEW(rangeobject, &PyRange_Type);
- 	if (obj == NULL)
- 		return NULL;
- 
- 	obj->start = r->start;
- 	obj->len   = r->len;
- 	obj->step  = r->step;
- 	obj->index = 0;
- 	obj->used = 1;
- 	return (PyObject *) obj;
- }
- 
- static PyObject *
- range_next(rangeobject *r)
- {
- 	if (r->index < r->len) 
- 		return PyInt_FromLong(r->start + (r->index++) * r->step);
- 	PyErr_SetObject(PyExc_StopIteration, Py_None);
- 	return NULL;
- }
- 
- static PyMethodDef range_methods[] = {
-         {"next",        (PyCFunction)range_next, METH_NOARGS,
-          "it.next() -- get the next value, or raise StopIteration"},
-         {NULL,          NULL}           /* sentinel */
- };
- 
  static PySequenceMethods range_as_sequence = {
  	(inquiry)range_length,	/* sq_length */
--- 87,90 ----
***************
*** 137,140 ****
--- 95,100 ----
  };
  
+ staticforward PyObject * range_iter(PyObject *seq);
+ 
  PyTypeObject PyRange_Type = {
  	PyObject_HEAD_INIT(&PyType_Type)
***************
*** 155,159 ****
  	0,				/* tp_call */
  	0,				/* tp_str */
! 	PyObject_GenericGetAttr,	/* tp_getattro */
  	0,				/* tp_setattro */
  	0,				/* tp_as_buffer */
--- 115,119 ----
  	0,				/* tp_call */
  	0,				/* tp_str */
! 	0,				/* tp_getattro */
  	0,				/* tp_setattro */
  	0,				/* tp_as_buffer */
***************
*** 164,169 ****
  	0,				/* tp_richcompare */
  	0,				/* tp_weaklistoffset */
! 	(getiterfunc)range_getiter,	/* tp_iter */
! 	(iternextfunc)range_next,	/* tp_iternext */
! 	range_methods,			/* tp_methods */	
  };
--- 124,214 ----
  	0,				/* tp_richcompare */
  	0,				/* tp_weaklistoffset */
! 	(getiterfunc)range_iter,	/* tp_iter */	
  };
+ 
+ /*********************** Xrange Iterator **************************/
+ 
+ typedef struct {
+ 	PyObject_HEAD
+ 	long	index;
+ 	long	start;
+ 	long	step;
+ 	long	len;
+ } rangeiterobject;
+ 
+ PyTypeObject Pyrangeiter_Type;
+ 
+ PyObject *
+ range_iter(PyObject *seq)
+ {
+ 	rangeiterobject *it;
+ 
+ 	if (!PyRange_Check(seq)) {
+ 		PyErr_BadInternalCall();
+ 		return NULL;
+ 	}
+ 	it = PyObject_New(rangeiterobject, &Pyrangeiter_Type);
+ 	if (it == NULL)
+ 		return NULL;
+ 	it->index = 0;
+ 	it->start = ((rangeobject *)seq)->start;
+ 	it->step = ((rangeobject *)seq)->step;
+ 	it->len = ((rangeobject *)seq)->len;
+ 	return (PyObject *)it;
+ }
+ 
+ static PyObject *
+ rangeiter_getiter(PyObject *it)
+ {
+ 	Py_INCREF(it);
+ 	return it;
+ }
+ 
+ static PyObject *
+ rangeiter_next(rangeiterobject *r)
+ {
+ 	if (r->index < r->len) 
+ 		return PyInt_FromLong(r->start + (r->index++) * r->step);
+ 	PyErr_SetObject(PyExc_StopIteration, Py_None);
+ 	return NULL;
+ }
+ 
+ static PyMethodDef rangeiter_methods[] = {
+ 	{"next",        (PyCFunction)rangeiter_next,     METH_NOARGS,
+ 	 "it.next() -- get the next value, or raise StopIteration"},
+ 	{NULL,          NULL}           /* sentinel */
+ };
+ 
+ PyTypeObject Pyrangeiter_Type = {
+ 	PyObject_HEAD_INIT(&PyType_Type)
+ 	0,                                      /* ob_size */
+ 	"rangeiterator",                         /* tp_name */
+ 	sizeof(rangeiterobject),                 /* tp_basicsize */
+ 	0,                                      /* tp_itemsize */
+ 	/* methods */
+ 	(destructor)PyObject_Del,		/* 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 */
+ 	(getiterfunc)rangeiter_getiter,		/* tp_iter */
+ 	(iternextfunc)rangeiter_next,		/* tp_iternext */
+ 	rangeiter_methods,			/* tp_methods */
+ };
+