Skip to content

Commit dadee37

Browse files
author
Roman Donchenko
committed
Adapt Python bindings to the new Ptr.
1 parent 2f942ef commit dadee37

File tree

2 files changed

+50
-40
lines changed

2 files changed

+50
-40
lines changed

modules/python/src2/cv2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,7 @@ bool pyopencv_to(PyObject* obj, cv::flann::SearchParams & value, const char * na
10581058
template <typename T>
10591059
bool pyopencv_to(PyObject *o, Ptr<T>& p, const char *name)
10601060
{
1061-
p = new T();
1061+
p = makePtr<T>();
10621062
return pyopencv_to(o, *p, name);
10631063
}
10641064

modules/python/src2/gen2.py

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,32 @@
1313

1414
gen_template_check_self = Template(""" if(!PyObject_TypeCheck(self, &pyopencv_${name}_Type))
1515
return failmsgp("Incorrect type of self (must be '${name}' or its derivative)");
16-
$cname* _self_ = ${amp}((pyopencv_${name}_t*)self)->v;
16+
$cname* _self_ = ${amp}((pyopencv_${name}_t*)self)->v${get};
1717
""")
1818

1919
gen_template_check_self_algo = Template(""" if(!PyObject_TypeCheck(self, &pyopencv_${name}_Type))
2020
return failmsgp("Incorrect type of self (must be '${name}' or its derivative)");
21-
$cname* _self_ = dynamic_cast<$cname*>(${amp}((pyopencv_${name}_t*)self)->v.obj);
21+
$cname* _self_ = dynamic_cast<$cname*>(${amp}((pyopencv_${name}_t*)self)->v.get());
2222
""")
2323

24-
gen_template_call_constructor = Template("""self = PyObject_NEW(pyopencv_${name}_t, &pyopencv_${name}_Type);
24+
gen_template_call_constructor_prelude = Template("""self = PyObject_NEW(pyopencv_${name}_t, &pyopencv_${name}_Type);
2525
new (&(self->v)) Ptr<$cname>(); // init Ptr with placement new
26-
if(self) ERRWRAP2(self->v = new $cname""")
26+
if(self) """)
2727

28-
gen_template_simple_call_constructor = Template("""self = PyObject_NEW(pyopencv_${name}_t, &pyopencv_${name}_Type);
29-
if(self) ERRWRAP2(self->v = $cname""")
28+
gen_template_call_constructor = Template("""self->v.reset(new ${cname}${args})""")
29+
30+
gen_template_simple_call_constructor_prelude = Template("""self = PyObject_NEW(pyopencv_${name}_t, &pyopencv_${name}_Type);
31+
if(self) """)
32+
33+
gen_template_simple_call_constructor = Template("""self->v = ${cname}${args}""")
3034

3135
gen_template_parse_args = Template("""const char* keywords[] = { $kw_list, NULL };
3236
if( PyArg_ParseTupleAndKeywords(args, kw, "$fmtspec", (char**)keywords, $parse_arglist)$code_cvt )""")
3337

3438
gen_template_func_body = Template("""$code_decl
3539
$code_parse
3640
{
37-
$code_fcall;
41+
${code_prelude}ERRWRAP2($code_fcall);
3842
$code_ret;
3943
}
4044
""")
@@ -124,7 +128,7 @@
124128
failmsg("Expected ${cname} for argument '%%s'", name);
125129
return false;
126130
}
127-
dst = ((pyopencv_${name}_t*)src)->v;
131+
dst = ((pyopencv_${name}_t*)src)->v.dynamicCast<${cname}>();
128132
return true;
129133
}
130134
@@ -187,7 +191,7 @@
187191
gen_template_get_prop_algo = Template("""
188192
static PyObject* pyopencv_${name}_get_${member}(pyopencv_${name}_t* p, void *closure)
189193
{
190-
return pyopencv_from(dynamic_cast<$cname*>(p->v.obj)${access}${member});
194+
return pyopencv_from(dynamic_cast<$cname*>(p->v.get())${access}${member});
191195
}
192196
""")
193197

@@ -211,7 +215,7 @@
211215
PyErr_SetString(PyExc_TypeError, "Cannot delete the ${member} attribute");
212216
return -1;
213217
}
214-
return pyopencv_to(value, dynamic_cast<$cname*>(p->v.obj)${access}${member}) ? 0 : -1;
218+
return pyopencv_to(value, dynamic_cast<$cname*>(p->v.get())${access}${member}) ? 0 : -1;
215219
}
216220
""")
217221

@@ -559,39 +563,22 @@ def gen_code(self, all_classes):
559563
if self.classname:
560564
selfinfo = all_classes[self.classname]
561565
if not self.isconstructor:
562-
amp = ""
563-
if selfinfo.issimple:
564-
amp = "&"
566+
amp = "&" if selfinfo.issimple else ""
565567
if selfinfo.isalgorithm:
566568
code += gen_template_check_self_algo.substitute(name=selfinfo.name, cname=selfinfo.cname, amp=amp)
567569
else:
568-
code += gen_template_check_self.substitute(name=selfinfo.name, cname=selfinfo.cname, amp=amp)
570+
get = "" if selfinfo.issimple else ".get()"
571+
code += gen_template_check_self.substitute(name=selfinfo.name, cname=selfinfo.cname, amp=amp, get=get)
569572
fullname = selfinfo.wname + "." + fullname
570573

571574
all_code_variants = []
572575
declno = -1
573576
for v in self.variants:
574577
code_decl = ""
575-
code_fcall = ""
576578
code_ret = ""
577579
code_cvt_list = []
578580

579-
if self.isconstructor:
580-
code_decl += " pyopencv_%s_t* self = 0;\n" % selfinfo.name
581-
templ = gen_template_call_constructor
582-
if selfinfo.issimple:
583-
templ = gen_template_simple_call_constructor
584-
code_fcall = templ.substitute(name=selfinfo.name, cname=selfinfo.cname)
585-
else:
586-
code_fcall = "ERRWRAP2( "
587-
if v.rettype:
588-
code_decl += " " + v.rettype + " retval;\n"
589-
code_fcall += "retval = "
590-
if ismethod:
591-
code_fcall += "_self_->" + self.cname
592-
else:
593-
code_fcall += self.cname
594-
code_fcall += "("
581+
code_args = "("
595582
all_cargs = []
596583
parse_arglist = []
597584

@@ -605,9 +592,9 @@ def gen_code(self, all_classes):
605592
if not defval and a.tp.endswith("*"):
606593
defval = 0
607594
assert defval
608-
if not code_fcall.endswith("("):
609-
code_fcall += ", "
610-
code_fcall += defval
595+
if not code_args.endswith("("):
596+
code_args += ", "
597+
code_args += defval
611598
all_cargs.append([[None, ""], ""])
612599
continue
613600
tp1 = tp = a.tp
@@ -649,11 +636,34 @@ def gen_code(self, all_classes):
649636
else:
650637
code_decl += " %s %s;\n" % (amapping[0], a.name)
651638

652-
if not code_fcall.endswith("("):
653-
code_fcall += ", "
654-
code_fcall += amp + a.name
639+
if not code_args.endswith("("):
640+
code_args += ", "
641+
code_args += amp + a.name
642+
643+
code_args += ")"
644+
645+
if self.isconstructor:
646+
code_decl += " pyopencv_%s_t* self = 0;\n" % selfinfo.name
647+
if selfinfo.issimple:
648+
templ_prelude = gen_template_simple_call_constructor_prelude
649+
templ = gen_template_simple_call_constructor
650+
else:
651+
templ_prelude = gen_template_call_constructor_prelude
652+
templ = gen_template_call_constructor
655653

656-
code_fcall += "))"
654+
code_prelude = templ_prelude.substitute(name=selfinfo.name, cname=selfinfo.cname)
655+
code_fcall = templ.substitute(name=selfinfo.name, cname=selfinfo.cname, args=code_args)
656+
else:
657+
code_prelude = ""
658+
code_fcall = ""
659+
if v.rettype:
660+
code_decl += " " + v.rettype + " retval;\n"
661+
code_fcall += "retval = "
662+
if ismethod:
663+
code_fcall += "_self_->" + self.cname
664+
else:
665+
code_fcall += self.cname
666+
code_fcall += code_args
657667

658668
if code_cvt_list:
659669
code_cvt_list = [""] + code_cvt_list
@@ -706,7 +716,7 @@ def gen_code(self, all_classes):
706716
(fmtspec, ", ".join(["pyopencv_from(" + aname + ")" for aname, argno in v.py_outlist]))
707717

708718
all_code_variants.append(gen_template_func_body.substitute(code_decl=code_decl,
709-
code_parse=code_parse, code_fcall=code_fcall, code_ret=code_ret))
719+
code_parse=code_parse, code_prelude=code_prelude, code_fcall=code_fcall, code_ret=code_ret))
710720

711721
if len(all_code_variants)==1:
712722
# if the function/method has only 1 signature, then just put it

0 commit comments

Comments
 (0)