From: Mark K. <swi...@di...> - 2008-04-23 16:16:48
|
I'm trying to remove one layer of indirection from some c++ classes that use smart pointers. For example, I have a class that returns an auto_ptr wrapped object (abbreviated below): class SearchRequest; typedef std::auto_ptr<SearchRequest> SearchRequestAPtr; class SearchResultSet; typedef std::auto_ptr<SearchResultSet> SearchResultSetAPtr; class RetsSession { public: SearchRequestAPtr CreateSearchRequest( std::string searchType, std::string searchClass, std::string query); SearchResultSetAPtr Search(SearchRequest * request); }; When I directly use the auto_ptr wrapped objects from PHP, I get: $request = $session->CreateSearchRequest("Property", "ResidentialProperty", "(ListPrice=300000-)"); debug_zval_dump($request); object(SearchRequestAPtr)#3 (1) refcount(2){ ["_cPtr"]=> resource(9) of type (_p_std__auto_ptrT_SearchRequest_t) refcount(1) } OK .. the CreateSearchRequest returns an auto_ptr wrapped request. I then try to reference it to invoke the search: $result = $session->Search($request); Fatal error: Type error in argument 2 of RetsSession_Search. Expected SWIGTYPE_p_SearchRequest in /private/tmp/librets.php on line 190 So, PHP doesn't dereference the auto_ptr, I tried to write various typemaps to help it along and the following comes closest (note, this is part of a macro where TYPE would be "SearchRequest" or "SearchResultSet"): %typemap(out) std::auto_ptr<TYPE> { zval *z_var; MAKE_STD_ZVAL(z_var); SWIG_SetPointerZval(z_var, (void *) $1.release(), $descriptor (TYPE *), $owner); *$result = *z_var; } That appears to unwrap the auto_ptr in the c++ layer. But, when returned to the PHP, it then gets rewrapped in the generated librets.php (again, only pertinent parts shown): class RetsSession { public $_cPtr=null; function CreateSearchRequest($searchType,$searchClass,$query) { $r=RetsSession_CreateSearchRequest($this->_cPtr, $searchType,$searchClass,$query); return is_resource($r) ? new SearchRequestAPtr($r) : $r; } } How does one do this properly or am I out of luck with smart pointers in PHP? TIA! Regards, M. "swig/php rookie" -- Mark Klein PGP Key Available www.dis.com |