}
#define UNOP(name, check) \
- static PyObject *femeth_##name(PyObject *me, PyObject *arg) { \
+ static PyObject *femeth_##name(PyObject *me) { \
field *f = FE_F(me); \
mp *x = FE_X(me); \
- if (!PyArg_ParseTuple(arg, ":" #name)) return (0); \
if (!f->ops->name) TYERR(#name " not supported for this field"); \
check \
x = f->ops->name(f, MP_NEW, x); \
UNOP(hlv, ; )
#undef UNOP
-static PyObject *feget_field(PyObject *me, void *hunoz)
- { RETURN_OBJ(FE_FOBJ(me)); }
-
static PyObject *feget_value(PyObject *me, void *hunoz)
{
mp *x = F_OUT(FE_F(me), MP_NEW, FE_X(me));
return (mp_pywrap(x));
}
+static const PyMemberDef fe_pymembers[] = {
+#define MEMBERSTRUCT fe_pyobj
+ MEMRNM(field, T_OBJECT, ob_type, READONLY,
+ "X.field -> field containing X")
+#undef MEMBERSTRUCT
+ { 0 }
+};
+
static const PyGetSetDef fe_pygetset[] = {
#define GETSETNAME(op, name) fe##op##_##name
- GET (field, "X.field -> field containing X")
GET (value, "X.value -> `natural' MP/GF representation of X")
GET (_value, "X._value -> internal MP/GF representation of X")
#undef GETSETNAME
static const PyMethodDef fe_pymethods[] = {
#define METHNAME(func) femeth_##func
- METH (inv, "X.inv() -> X^{-1}")
- METH (sqr, "X.sqr() -> X^2")
- METH (sqrt, "X.sqrt() -> sqrt(X)")
- METH (quadsolve, "X.quadsolve() -> Y where Y^2 + Y = X (binary only)")
- METH (dbl, "X.dbl() -> 2 * X (prime only)")
- METH (tpl, "X.tpl() -> 3 * X (prime only)")
- METH (qdl, "X.qdl() -> 4 * X (prime only)")
- METH (hlv, "X.hlv() -> X/2 (prime only)")
+ NAMETH(inv, "X.inv() -> X^{-1}")
+ NAMETH(sqr, "X.sqr() -> X^2")
+ NAMETH(sqrt, "X.sqrt() -> sqrt(X)")
+ NAMETH(quadsolve, "X.quadsolve() -> Y where Y^2 + Y = X (binary only)")
+ NAMETH(dbl, "X.dbl() -> 2 * X (prime only)")
+ NAMETH(tpl, "X.tpl() -> 3 * X (prime only)")
+ NAMETH(qdl, "X.qdl() -> 4 * X (prime only)")
+ NAMETH(hlv, "X.hlv() -> X/2 (prime only)")
#undef METHNAME
{ 0 }
};
0, /* @nb_inplace_true_divide@ */
};
-static PyTypeObject fe_pytype_skel = {
+static const PyTypeObject fe_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
"FE", /* @tp_name@ */
sizeof(fe_pyobj), /* @tp_basicsize@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
PYMETHODS(fe), /* @tp_methods@ */
- 0, /* @tp_members@ */
+ PYMEMBERS(fe), /* @tp_members@ */
PYGETSET(fe), /* @tp_getset@ */
0, /* @tp_base@ */
0, /* @tp_dict@ */
return (fe_pywrap(me, xx));
}
+static PyObject *fmeth_parse(PyObject *me, PyObject *arg)
+{
+ field *f;
+ char *p;
+ PyObject *rc = 0;
+ qd_parse qd;
+
+ if (!PyArg_ParseTuple(arg, "s:parse", &p)) goto end;
+ qd.p = p; qd.e = 0;
+ if ((f = field_parse(&qd)) == 0) VALERR(qd.e);
+ rc = Py_BuildValue("(Ns)", field_pywrap(f), qd.p);
+end:
+ return (rc);
+}
+
static void field_pydealloc(PyObject *me)
{
F_DESTROY(FIELD_F(me));
#define METHNAME(name) fmeth_##name
METH (_adopt, "F._adopt(X) -> FE")
KWMETH(rand, "F.rand([rng = rand]) -> FE, uniformly distributed")
+ SMTH (parse, "parse(STR) -> F, REST")
#undef METHNAME
{ 0 }
};
-static PyTypeObject field_pytype_skel = {
+static const PyTypeObject field_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
"Field", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
#undef GETSETNAME
};
-static PyTypeObject primefield_pytype_skel = {
+static const PyTypeObject primefield_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
"PrimeField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
return (0);
}
-static PyTypeObject niceprimefield_pytype_skel = {
+static const PyTypeObject niceprimefield_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
"NicePrimeField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
{ 0 }
};
-static PyTypeObject binfield_pytype_skel = {
+static const PyTypeObject binfield_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
"BinField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
return (0);
}
-static PyTypeObject binpolyfield_pytype_skel = {
+static const PyTypeObject binpolyfield_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
"BinPolyField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
{ 0 }
};
-static PyTypeObject binnormfield_pytype_skel = {
+static const PyTypeObject binnormfield_pytype_skel = {
PyObject_HEAD_INIT(0) 0, /* Header */
"BinNormField", /* @tp_name@ */
sizeof(field_pyobj), /* @tp_basicsize@ */
/*----- Setup -------------------------------------------------------------*/
-static PyObject *meth__Field_parse(PyObject *me, PyObject *arg)
-{
- field *f;
- char *p;
- PyObject *rc = 0;
- qd_parse qd;
-
- if (!PyArg_ParseTuple(arg, "Os:parse", &me, &p))
- goto end;
- qd.p = p;
- qd.e = 0;
- if ((f = field_parse(&qd)) == 0)
- VALERR(qd.e);
- rc = Py_BuildValue("(Ns)", field_pywrap(f), qd.p);
-end:
- return (rc);
-}
-
-static const PyMethodDef methods[] = {
-#define METHNAME(func) meth_##func
- METH (_Field_parse, "parse(STR) -> F, REST")
-#undef METHNAME
+static const struct nameval consts[] = {
+ CONST(FTY_PRIME), CONST(FTY_BINARY),
{ 0 }
};
INITTYPE(binfield, field);
INITTYPE(binpolyfield, binfield);
INITTYPE(binnormfield, binfield);
- addmethods(methods);
}
void field_pyinsert(PyObject *mod)
INSERT("BinField", binfield_pytype);
INSERT("BinPolyField", binpolyfield_pytype);
INSERT("BinNormField", binnormfield_pytype);
+ setconstants(mod, consts);
}
/*----- That's all, folks -------------------------------------------------*/