1313
1414gen_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
1919gen_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
3135gen_template_parse_args = Template ("""const char* keywords[] = { $kw_list, NULL };
3236 if( PyArg_ParseTupleAndKeywords(args, kw, "$fmtspec", (char**)keywords, $parse_arglist)$code_cvt )""" )
3337
3438gen_template_func_body = Template ("""$code_decl
3539 $code_parse
3640 {
37- $code_fcall;
41+ ${code_prelude}ERRWRAP2($ code_fcall) ;
3842 $code_ret;
3943 }
4044""" )
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
187191gen_template_get_prop_algo = Template ("""
188192static 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
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