26#if PY_VERSION_HEX < 0x030b0000 
   46    struct InitOperatorMapping_t {
 
   48        InitOperatorMapping_t() {
 
  117#if PY_VERSION_HEX < 0x03000000 
  134        return (
unsigned long)-1;
 
  136        return (
unsigned long)0;
 
  144            ul = (
unsigned long)i;
 
  147                "can\'t convert negative value to unsigned long");
 
  148            return (
unsigned long)-1;
 
 
  163        return (
unsigned long)0;
 
  174                "can\'t convert negative value to unsigned long long");
 
 
  192    pdef->ml_name  = 
const_cast<char*
>(label);
 
  194    pdef->ml_flags = flags;
 
  195    pdef->ml_doc   = 
nullptr;
 
 
  265    std::string 
opname = 
"operator";
 
 
  300    bool reverse = 
false;
 
 
  358 && 
lcname.find(
"__wrap_iter") == std::string::npos   
 
  374            else { 
fname << 
"not_implemented<"; }
 
 
  412#if PY_VERSION_HEX < 0x03000000 
  435#if PY_VERSION_HEX < 0x03000000 
  458        tmpl_name.append(arg ? 
"double" : 
"float");
 
  462#if PY_VERSION_HEX < 0x03000000 
  473            std::string 
subtype{
"std::initializer_list<"};
 
  486    if (CPPScope_Check(
tn)) {
 
  491            if (CPPInstance_Check(
pyobj)) {
 
  492                if (
pyobj->fFlags & CPPInstance::kIsRValue)
 
  524                    std::ostringstream 
tpn;
 
  557    for (
auto nn : {PyStrings::gCppName, PyStrings::gName}) {
 
 
  607                    "could not construct C++ name from provided template argument.");
 
 
  630    const std::vector<std::string>& 
argtypes, std::ostringstream& code)
 
  638        code << 
"    CPYCPPYY_STATIC std::unique_ptr<CPyCppyy::Converter, std::function<void(CPyCppyy::Converter*)>> " 
  639                     "retconv{CPyCppyy::CreateConverter(\"" 
  640             << 
retType << 
"\"), CPyCppyy::DestroyConverter};\n";
 
  644        code << 
"    CPYCPPYY_STATIC std::vector<std::unique_ptr<CPyCppyy::Converter, std::function<void(CPyCppyy::Converter*)>>> argcvs;\n" 
  645             << 
"    if (argcvs.empty()) {\n" 
  646             << 
"      argcvs.reserve(" << 
nArgs << 
");\n";
 
  647        for (
int i = 0; i < 
nArgs; ++i) {
 
  649            code << 
"      argcvs.emplace_back(CPyCppyy::CreateConverter(\"";
 
  650            const std::string& at = 
argtypes[i];
 
  652            const std::string& 
cpd = TypeManip::compound(
res_at);
 
  665            code << 
"\"), CPyCppyy::DestroyConverter);\n";
 
  672        code << 
"    " << 
retType << 
" ret{};\n";
 
  675    code << 
"    PyGILState_STATE state = PyGILState_Ensure();\n";
 
  679        code << 
"    std::vector<PyObject*> pyargs;\n";
 
  680        code << 
"    pyargs.reserve(" << 
nArgs << 
");\n" 
  682        for (
int i = 0; i < 
nArgs; ++i) {
 
  683            code << 
"      pyargs.emplace_back(argcvs[" << i << 
"]->FromMemory((void*)";
 
  685            code << 
"arg" << i << 
"));\n" 
  686                 << 
"      if (!pyargs.back()) throw " << i << 
";\n";
 
  688        code << 
"    } catch(int) {\n" 
  689             << 
"      for (auto pyarg : pyargs) Py_XDECREF(pyarg);\n" 
  690             << 
"      CPyCppyy::PyException pyexc; PyGILState_Release(state); throw pyexc;\n" 
 
  702        code << 
"    for (auto pyarg : pyargs) Py_DECREF(pyarg);\n";
 
  703    code << 
"    bool cOk = (bool)pyresult;\n" 
  704            "    if (pyresult) {\n";
 
  708        code << 
"      if (!CPyCppyy::Instance_IsLively(pyresult))\n" 
  712    code << (
isVoid ? 
"" : 
"        cOk = retconv->ToMemory(pyresult, (void*)&ret);\n")
 
  713         <<                
"        Py_DECREF(pyresult);\n    }\n";
 
  714    if (
isPtr) code << 
"  }\n";
 
  715    code << 
"    if (!cOk) {"      
  719            " /* do nothing */ }\n" 
  721            " CPyCppyy::PyException pyexc; PyGILState_Release(state); throw pyexc; }\n" 
  723            "    PyGILState_Release(state);\n" 
  725    code << (
isVoid ? 
";\n  }\n" : 
" ret;\n  }\n");
 
 
  748        std::ostringstream 
fname;
 
  751        std::ostringstream code;
 
  752        code << 
"namespace __cppyy_internal { std::function<" 
  754             << 
"(intptr_t faddr) { return (" << 
retType << 
"(*)" << 
signature << 
")faddr;} }";
 
  778        ((
CPPInstance*)func)->fFlags |= CPPInstance::kIsLValue;
 
 
  834                || (
sizeof(
long int) == 
sizeof(
int) && ((
tc == 
'I' && 
strchr(
bufinfo.format, 
'L')) ||
 
  845                        "buffer itemsize (%ld) does not match expected size (%d)", 
bufinfo.itemsize, 
size);
 
  853                else if (buf && 
bufinfo.ndim == 1)
 
  883#if PY_VERSION_HEX < 0x03000000 
  893        if (buf && 
check == 
true) {
 
  905            } 
else if (buflen == 
size) {
 
  915                    (
char*)
"%s and given element size (%ld) do not match needed (%d)",
 
 
  935    if (8 < 
name.size() && 
name.substr(0, 8) == 
"operator") {
 
  936        std::string 
op = 
name.substr(8, std::string::npos);
 
  939        std::string::size_type start = 0, end = 
op.size();
 
  940        while (start < end && 
isspace(
op[start])) ++start;
 
  941        while (start < end && 
isspace(
op[end-1])) --end;
 
  942        op = 
op.substr(start, end - start);
 
  959        } 
else if (
op == 
"*") {
 
  965        } 
else if (
op == 
"/") {
 
  969        } 
else if (
op == 
"+") {
 
  975        } 
else if (
op == 
"-") {
 
  981        } 
else if (
op == 
"++") {
 
  985        } 
else if (
op == 
"--") {
 
 
 1000    std::string 
clname = 
"<unknown>";
 
 
 1022        std::string 
tt = 
"<int>::";
 
 1023        for (
auto c : {
"std::vector", 
"std::list", 
"std::deque"}) {
 
 1024            for (
auto i : {
"iterator", 
"const_iterator"}) {
 
 1026                auto pos = 
itname.find(
'<');
 
 1027                if (pos != std::string::npos)
 
 1033    auto pos = classname.find(
'<');
 
 1034    if (pos != std::string::npos)
 
 
 1059#if PY_VERSION_HEX >= 0x02030000 
 
 1136            } 
else if (
e.fValue) {
 
 
 1169            "#include \"CPyCppyy/API.h\"\n" 
 1172            "#include \"CPyCppyy/DispatchPtr.h\"\n" 
 1173            "#include \"CPyCppyy/PyException.h\"\n" 
 
PyDictEntry *(* dict_lookup_func)(PyDictObject *, PyObject *, long)
 
#define CPyCppyy_PyText_InternFromString
 
#define CPyCppyy_PyText_Append
 
#define CPyCppyy_PyText_AsString
 
#define CPyCppyy_PyText_AppendAndDel
 
void CPyCppyy_PyBuffer_Release(PyObject *, Py_buffer *view)
 
#define CPyCppyy_PyText_FromFormat
 
#define CPyCppyy_PyText_FromString
 
#define CPyCppyy_PyText_Check
 
unsigned long long PY_ULONG_LONG
 
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
static std::set< std::string > sIteratorTypes
 
static TC2POperatorMapping_t gC2POperatorMapping
 
static CPyCppyy::PyCallable * BuildOperator(const std::string &lcname, const std::string &rcname, const char *op, Cppyy::TCppScope_t scope, bool reverse=false)
 
static std::set< std::string > gOpRemove
 
static std::map< std::string, PyObject * > sStdFuncMakerLookup
 
static std::set< std::string > gOpSkip
 
static std::map< void *, PyObject * > sStdFuncLookup
 
static bool AddTypeName(std::string &tmpl_name, PyObject *tn, PyObject *arg, CPyCppyy::Utility::ArgPreference pref, int *pcnt=nullptr)
 
static bool check_scope(const std::string &name)
 
std::map< std::string, std::string > TC2POperatorMapping_t
 
static std::string AnnotationAsText(PyObject *pyobj)
 
const_iterator begin() const
 
const_iterator end() const
 
std::string clean_type(const std::string &cppname, bool template_strip=true, bool const_strip=true)
 
PyCallable * FindBinaryOperator(PyObject *left, PyObject *right, const char *op, Cppyy::TCppScope_t scope=0)
 
void ConstructCallbackPreamble(const std::string &retType, const std::vector< std::string > &argtypes, std::ostringstream &code)
 
void ConstructCallbackReturn(const std::string &retType, int nArgs, std::ostringstream &code)
 
Py_ssize_t GetBuffer(PyObject *pyobject, char tc, int size, void *&buf, bool check=true)
 
std::string ConstructTemplateArgs(PyObject *pyname, PyObject *tpArgs, PyObject *args=nullptr, ArgPreference=kNone, int argoff=0, int *pcnt=nullptr)
 
PyObject * FuncPtr2StdFunction(const std::string &retType, const std::string &signature, void *address)
 
PyCallable * FindUnaryOperator(PyObject *pyclass, const char *op)
 
size_t FetchError(std::vector< PyError_t > &, bool is_cpp=false)
 
std::string MapOperatorName(const std::string &name, bool bTakesParames, bool *stubbed=nullptr)
 
void SetDetailedException(std::vector< PyError_t > &errors, PyObject *topmsg, PyObject *defexc)
 
bool InitProxy(PyObject *module, PyTypeObject *pytype, const char *name)
 
bool AddToClass(PyObject *pyclass, const char *label, PyCFunction cfunc, int flags=METH_VARARGS)
 
bool IsSTLIterator(const std::string &classname)
 
std::string ClassName(PyObject *pyobj)
 
PyObject * PyErr_Occurred_WithGIL()
 
CPPOverload * CPPOverload_New(const std::string &name, std::vector< PyCallable * > &methods)
 
unsigned long PyLongOrInt_AsULong(PyObject *pyobject)
 
PyObject * gDefaultObject
 
PyObject * CustomInstanceMethod_New(PyObject *func, PyObject *self, PyObject *pyclass)
 
dict_lookup_func gDictLookupOrg
 
PyObject * CreateScopeProxy(Cppyy::TCppScope_t, const unsigned flags=0)
 
bool CPPOverload_Check(T *object)
 
bool CPPScope_Check(T *object)
 
PY_ULONG_LONG PyLongOrInt_AsULong64(PyObject *pyobject)
 
bool CPPInstance_Check(T *object)
 
PyObject * gNullPtrObject
 
RPY_EXPORTED bool Compile(const std::string &code, bool silent=false)
 
RPY_EXPORTED TCppScope_t gGlobalScope
 
RPY_EXPORTED TCppMethod_t GetMethodTemplate(TCppScope_t scope, const std::string &name, const std::string &proto)
 
RPY_EXPORTED std::string ResolveName(const std::string &cppitem_name)
 
RPY_EXPORTED std::string GetScopedFinalName(TCppType_t type)
 
RPY_EXPORTED TCppMethod_t GetMethod(TCppScope_t scope, TCppIndex_t imeth)
 
RPY_EXPORTED TCppScope_t GetScope(const std::string &scope_name)
 
RPY_EXPORTED TCppIndex_t GetGlobalOperator(TCppType_t scope, const std::string &lc, const std::string &rc, const std::string &op)
 
static void Clear(PyError_t &e)