X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/f76230157bd427829e49628de37d53f9c8ae7842..0e5b95a8f4bf60e5cb805d25d9d202af80145734:/pgen.c diff --git a/pgen.c b/pgen.c index 3c2a792..e08c6fe 100644 --- a/pgen.c +++ b/pgen.c @@ -921,6 +921,83 @@ static const PyTypeObject pgtest_pytype_skel = { 0 /* @tp_is_gc@ */ }; +/*----- Prime iteration ---------------------------------------------------*/ + +static PyTypeObject *piter_pytype; + +typedef struct piter_pyobj { + PyObject_HEAD + primeiter i; +} piter_pyobj; +#define PITER_I(o) (&((piter_pyobj *)(o))->i) + +static PyObject *piter_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) +{ + piter_pyobj *rc; + mp *n = 0; + static const char *const kwlist[] = { "start", 0 }; + + if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:new", KWLIST, convmp, &n)) + return (0); + rc = (piter_pyobj *)ty->tp_alloc(ty, 0); + primeiter_create(&rc->i, n); + return ((PyObject *)rc); +} + +static void piter_pydealloc(PyObject *me) + { primeiter_destroy(PITER_I(me)); FREEOBJ(me); } + +static PyObject *piter_pynext(PyObject *me) + { return (mp_pywrap(primeiter_next(PITER_I(me), 0))); } + +static const PyTypeObject piter_pytype_skel = { + PyVarObject_HEAD_INIT(0, 0) /* Header */ + "PrimeIter", /* @tp_name@ */ + sizeof(piter_pyobj), /* @tp_basicsize@ */ + 0, /* @tp_itemsize@ */ + + piter_pydealloc, /* @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@ */ + 0, /* @tp_getattro@ */ + 0, /* @tp_setattro@ */ + 0, /* @tp_as_buffer@ */ + Py_TPFLAGS_DEFAULT | /* @tp_flags@ */ + Py_TPFLAGS_BASETYPE, + + /* @tp_doc@ */ + "PrimeIter([start = N]): Prime-number iterator.", + + 0, /* @tp_traverse@ */ + 0, /* @tp_clear@ */ + 0, /* @tp_richcompare@ */ + 0, /* @tp_weaklistoffset@ */ + PyObject_SelfIter, /* @tp_iter@ */ + piter_pynext, /* @tp_iternext@ */ + 0, /* @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@ */ + 0, /* @tp_init@ */ + PyType_GenericAlloc, /* @tp_alloc@ */ + piter_pynew, /* @tp_new@ */ + 0, /* @tp_free@ */ + 0 /* @tp_is_gc@ */ +}; + /*----- Prime generation functions ----------------------------------------*/ void pgenerr(struct excinfo *exc) @@ -1096,11 +1173,10 @@ void pgen_pyinit(void) INITTYPE(pgstep, pgev); INITTYPE(pgjump, pgev); INITTYPE(pgtest, pgev); + INITTYPE(piter, root); addmethods(methods); } -static PyObject *obj; - void pgen_pyinsert(PyObject *mod) { INSERT("PrimeFilter", pfilt_pytype); @@ -1110,10 +1186,11 @@ void pgen_pyinsert(PyObject *mod) INSERT("PrimeGenStepper", pgstep_pytype); INSERT("PrimeGenJumper", pgjump_pytype); INSERT("PrimeGenTester", pgtest_pytype); - INSERT("pgen_nullev", obj = pgev_stdev(0)); + INSERT("pgen_nullev", pgev_stdev(0)); INSERT("pgen_stdev", pgev_stdev(pgen_ev)); INSERT("pgen_spinev", pgev_stdev(pgen_evspin)); INSERT("pgen_subev", pgev_stdev(pgen_subev)); + INSERT("PrimeIter", piter_pytype); setconstants(mod, consts); }