56OverloadLink::OverloadLink()
61void OverloadLink::setNull()
66void OverloadLink::setPyCFunction(PyCFunction iOverload)
68 signature_ = iOverload ? sPyCFunction : sNull;
69 pyCFunction_ = iOverload;
72void OverloadLink::setBinaryfunc(binaryfunc iOverload)
74 signature_ = iOverload ? sBinary : sNull;
75 binaryfunc_ = iOverload;
78void OverloadLink::setTernaryfunc(ternaryfunc iOverload)
80 signature_ = iOverload ? sTernary : sNull;
81 ternaryfunc_ = iOverload;
83void OverloadLink::setSsizeArgfunc(ssizeargfunc iOverload)
85 signature_ = iOverload ? sSsizeArg : sNull;
86 ssizeargfunc_ = iOverload;
88void OverloadLink::setSsizeSsizeArgfunc(ssizessizeargfunc iOverload)
90 signature_ = iOverload ? sSsizeSsizeArg : sNull;
91 ssizessizeargfunc_ = iOverload;
94void OverloadLink::setSsizeObjArgProcfunc(ssizeobjargproc iOverload)
96 signature_ = iOverload ? sSsizeObjArg : sNull;
97 ssizeobjargproc_ = iOverload;
99void OverloadLink::setSsizeSsizeObjArgProcfunc(ssizessizeobjargproc iOverload)
101 signature_ = iOverload ? sSsizeSsizeObjArg : sNull;
102 ssizessizeobjargproc_ = iOverload;
104void OverloadLink::setObjObjProcfunc(objobjproc iOverload)
106 signature_ = iOverload ? sObjObjArg : sNull;
107 objobjproc_ = iOverload;
109void OverloadLink::setObjObjArgProcfunc(objobjargproc iOverload)
111 signature_ = iOverload ? sObjObjArg : sNull;
112 objobjargproc_ = iOverload;
114void OverloadLink::setGetIterFunc(getiterfunc iOverload)
116 signature_ = iOverload ? sGetIterFunc : sNull;
117 getiterfunc_ = iOverload;
119void OverloadLink::setIterNextFunc(iternextfunc iOverload)
121 signature_ = iOverload ? sIterNextFunc : sNull;
122 iternextfunc_ = iOverload;
124void OverloadLink::setArgKwfunc(ternaryfunc iOverload)
126 signature_ = iOverload ? sArgKw : sNull;
127 ternaryfunc_ = iOverload;
130bool OverloadLink::operator ()(PyObject* iSelf, PyObject* iArgs, PyObject*& oResult)
const
132 if (signature_ == sNull)
136 PyObject* temp = call(iSelf, iArgs);
137 if (PyErr_Occurred() && (PyErr_ExceptionMatches(PyExc_TypeError) || PyErr_ExceptionMatches(PyExc_NotImplementedError)))
147PyObject* OverloadLink::call(PyObject* iSelf, PyObject* iArgs)
const
155 return pyCFunction_(iSelf, iArgs);
160 if (decodeTuple(iArgs, arg) != 0)
164 return binaryfunc_(iSelf, arg.get());
170 if (decodeTuple(iArgs, arg1, arg2) != 0)
174 return ternaryfunc_(iSelf, arg1.get(), arg2.get());
180 if (decodeTuple(iArgs, size1) != 0)
184 return ssizeargfunc_(iSelf, size1 );
191 if (decodeTuple(iArgs, size1, size2) != 0)
195 return ssizessizeargfunc_(iSelf, size1, size2 );
202 if (decodeTuple(iArgs, size1, obj1) != 0)
206 return pyBuildSimpleObject(ssizeobjargproc_(iSelf,size1,obj1.get()));
209 case sSsizeSsizeObjArg:
214 if (decodeTuple(iArgs, size1, size2, obj1) != 0)
218 return pyBuildSimpleObject(ssizessizeobjargproc_(iSelf,size1,size2,obj1.get()));
224 if (decodeTuple(iArgs, obj1) != 0)
228 return pyBuildSimpleObject(objobjproc_(iSelf,obj1.get()));
238 const TPyObjPtr args = impl::checkedFastSequence(iArgs, 1, 2);
243 const Py_ssize_t argc = PySequence_Fast_GET_SIZE(args.get());
244 PyObject**
const argv = PySequence_Fast_ITEMS(args.get());
245 PyObject*
const key = argv[0];
246 PyObject*
const value = argc == 2 ? argv[1] : 0;
247 const int ret = objobjargproc_(iSelf, key, value);
255 PyErr_SetString(PyExc_AssertionError,
"OverloadChain: invalid return code.");
261 if (decodeTuple(iArgs) != 0)
265 return getiterfunc_(iSelf);
268 if (decodeTuple(iArgs) != 0)
272 return iternextfunc_(iSelf);
275 return ternaryfunc_(iSelf, iArgs, 0);
278 PyErr_SetString(PyExc_AssertionError,
"OverloadChain: invalid signature type");
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.