3
0
mirror of https://github.com/triqs/dft_tools synced 2024-12-25 05:43:40 +01:00

Add unary operators in python wrapper

This is useful to add unary operators to the number_protocol.
This commit is contained in:
Michel Ferrero 2014-05-21 16:34:41 +02:00
parent d3c1b9779d
commit df09891219

View File

@ -115,6 +115,8 @@ static PyObject* ${c.py_type}___str__ (PyObject *self);
% for op_name, op in c.number_protocol.items():
%if op.arity == 2:
static PyObject * ${c.py_type}_${op_name} (PyObject* v, PyObject *w);
%elif op.arity ==1:
static PyObject * ${c.py_type}_${op_name} (PyObject *v);
%endif
%endfor
@ -234,6 +236,8 @@ static PyNumberMethods ${c.py_type}_as_number = {
%for op_name in ["add", "subtract", "multiply", "divide", "remainder", "divmod", "power", "negative", "positive", "absolute", "nonzero", "invert", "lshift", "rshift", "and", "xor", "or", "coerce", "int", "long", "float", "oct", "hex", "inplace_add", "inplace_subtract", "inplace_multiply", "inplace_divide", "inplace_remainder", "inplace_power", "inplace_lshift", "inplace_rshift", "inplace_and", "inplace_xor", "inplace_or", "floor_divide ", "true_divide ", "inplace_floor_divide ", "inplace_true_divide ", "index "] :
% if op_name in c.number_protocol and c.number_protocol[op_name].arity==2 :
(binaryfunc)${c.py_type}_${op_name}, /*nb_${op_name}*/
%elif op_name in c.number_protocol and c.number_protocol[op_name].arity==1 :
(unaryfunc)${c.py_type}_${op_name}, /*nb_${op_name}*/
%else :
0, /*nb_${op_name}*/
%endif
@ -859,6 +863,23 @@ static PyObject * ${c.py_type}_${op_name} (PyObject* v, PyObject *w){
PyErr_SetString(PyExc_RuntimeError,"Error: no C++ overload found in implementation of operator ${overload.calling_pattern()} ");
return NULL;
}
%elif op.arity == 1:
static PyObject * ${c.py_type}_${op_name} (PyObject *v){
%for overload in op.overloads :
if (py_converter<${overload.args[0][0]}>::is_convertible(v,false)) {
try {
${regular_type_if_view_else_type(overload.rtype)} r = ${overload.calling_pattern()}(convert_from_python<${overload.args[0][0]}>(v));
return convert_to_python(std::move(r)); // in two steps to force type for expression templates in C++
}
CATCH_AND_RETURN("in calling C++ overload \n ${overload.c_signature()} \nin implementation of operator ${overload.calling_pattern()} ", NULL)
}
%endfor
PyErr_SetString(PyExc_RuntimeError,"Error: no C++ overload found in implementation of operator ${overload.calling_pattern()} ");
return NULL;
}
%endif
%endfor