z.add_declaration_code(''' static boost::shared_ptr<cv::NAryMatNDIterator> NAryMatNDIterator__init1__(std::vector<cv::MatND> const &arrays) { std::vector<cv::MatND const *> buf_arrays(arrays.size()); for(size_t i_arrays = 0; i_arrays<arrays.size(); ++i_arrays) buf_arrays[i_arrays] = (cv::MatND const *)&(arrays[i_arrays]); return boost::shared_ptr<cv::NAryMatNDIterator>(new cv::NAryMatNDIterator((cv::MatND const * *)(&buf_arrays[0]), arrays.size())); } ''') z.add_registration_code( 'def("__init__", bp::make_constructor(&NAryMatNDIterator__init1__, bp::default_call_policies(), (bp::arg("arrays"))))' ) z.mem_fun('init')._transformer_creators.append( FT.input_as_list_of_Matlike('arrays', 'count')) z.add_wrapper_code(''' NAryMatNDIterator_wrapper const &iter() { return *this; } bp::object next() { if(idx >= nplanes) { PyErr_SetString(PyExc_StopIteration, "No more plane."); throw bp::error_already_set(); } bp::object result(planes); if(idx >= nplanes-1) ++idx; else ++(*this); return result; }
for t in ('ptr', 'hdr'): # wait until requested z.var(t).exclude() sb.cc.write(''' CV_MAX_ARR = 10 CV_NO_DEPTH_CHECK = 1 CV_NO_CN_CHECK = 2 CV_NO_SIZE_CHECK = 4 ''') # cvInitNArrayIterator z = sb.mb.free_fun('cvInitNArrayIterator') z.include() z._transformer_creators.append(FT.input_as_list_of_Matlike('arrs', 'count')) # functions for z in ('cvNextNArraySlice', 'cvGetElemType'): sb.mb.free_fun(z).include() # Arithmetic, logic and comparison operations sb.cc.write(''' #----------------------------------------------------------------------------- # Arithmetic, logic and comparison operations #----------------------------------------------------------------------------- ''')
z.include() for t in ('ptr', 'hdr'): # wait until requested z.var(t).exclude() sb.cc.write(''' CV_MAX_ARR = 10 CV_NO_DEPTH_CHECK = 1 CV_NO_CN_CHECK = 2 CV_NO_SIZE_CHECK = 4 ''') # cvInitNArrayIterator z = sb.mb.free_fun('cvInitNArrayIterator') z.include() z._transformer_creators.append(FT.input_as_list_of_Matlike('arrs', 'count')) # functions for z in ('cvNextNArraySlice', 'cvGetElemType'): sb.mb.free_fun(z).include() # Arithmetic, logic and comparison operations sb.cc.write(''' #----------------------------------------------------------------------------- # Arithmetic, logic and comparison operations #----------------------------------------------------------------------------- ''') # Math operations
z = sb.mb.class_('NAryMatNDIterator') sb.init_class(z) z.constructors(lambda x: "MatND const *" in x.partial_decl_string).exclude() # don't need them z.add_declaration_code(''' static boost::shared_ptr<cv::NAryMatNDIterator> NAryMatNDIterator__init1__(std::vector<cv::MatND> const &arrays) { std::vector<cv::MatND const *> buf_arrays(arrays.size()); for(size_t i_arrays = 0; i_arrays<arrays.size(); ++i_arrays) buf_arrays[i_arrays] = (cv::MatND const *)&(arrays[i_arrays]); return boost::shared_ptr<cv::NAryMatNDIterator>(new cv::NAryMatNDIterator((cv::MatND const * *)(&buf_arrays[0]), arrays.size())); } ''') z.add_registration_code('def("__init__", bp::make_constructor(&NAryMatNDIterator__init1__, bp::default_call_policies(), (bp::arg("arrays"))))') z.mem_fun('init')._transformer_creators.append(FT.input_as_list_of_Matlike('arrays', 'count')) z.add_wrapper_code(''' NAryMatNDIterator_wrapper const &iter() { return *this; } bp::object next() { if(idx >= nplanes) { PyErr_SetString(PyExc_StopIteration, "No more plane."); throw bp::error_already_set(); } bp::object result(planes); if(idx >= nplanes-1) ++idx; else ++(*this); return result; }