On 9/4/07, <b class="gmail_sendername">Furkan Kuru</b> &lt;<a href="mailto:furkankuru@gmail.com">furkankuru@gmail.com</a>&gt; wrote:<div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hello,<br><br>Is there a way to expose structs containing pointers of their types?</blockquote><div><br>There is another problem here <br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Let&#39;s say, I have a very simple doubly-linked list.<br><br>struct Node {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node* next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node* prev;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int value;<br>};<br><br>I expose it like this:<br><br>class_&lt;Node&gt;(&quot;Node&quot;)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def_readwrite(&quot;value&quot;, &amp;Node::value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def_readwrite(&quot;next&quot;, &amp;Node::next)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.def_readwrite(&quot;prev&quot;, &amp;Node::prev);<br><br>When I try to access the next and prev attributes of a Node instance in python,
<br>I get this error:<br><br>TypeError: No to_python (by-value) converter found for C++ type: struct Node *</blockquote><div><br><br>If you would have access to Py++, it would generate the right code for you.&nbsp; <br><br>Here is cut and paste of the relevant code from the unittests:
<br><br><br>struct tree_node_t{
<br>&nbsp;&nbsp;&nbsp; ...
<br>&nbsp;&nbsp;&nbsp; tree_node_t *left;
<br>&nbsp;&nbsp;&nbsp; ... <br>};
<br><br></div>struct tree_node_t_wrapper : tree_node_t, bp::wrapper&lt; tree_node_t &gt; {<br>&nbsp;&nbsp; ...<br><br>&nbsp;&nbsp;&nbsp; static tree_node_t * get_right(tree_node_t const &amp; inst ){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return inst.right;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; 
<br>&nbsp;&nbsp;&nbsp; static void set_right( tree_node_t &amp; inst, tree_node_t * new_value ){ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inst.right = new_value;<br>&nbsp;&nbsp;&nbsp; }<br><br>};<br><br></div><br>&nbsp;&nbsp; { //::tree_node_t
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef bp::class_&lt; tree_node_t_wrapper &gt; tree_node_t_exposer_t;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree_node_t_exposer_t tree_node_t_exposer = tree_node_t_exposer_t( &quot;tree_node_t&quot;, &quot;documentation&quot;, bp::init&lt; bp::optional&lt; member_variables::pointers::tree_node_t const * &gt; &gt;(( bp::arg(&quot;parent&quot;)=bp::object() ), &quot;documentation&quot;) );
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bp::scope tree_node_t_scope( tree_node_t_exposer );
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree_node_t_exposer.add_property( &quot;right&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , bp::make_function( (::tree_node_t * (*)( ::tree_node_t const &amp; ))(&amp;tree_node_t_wrapper::get_right), bp::return_internal_reference&lt; &gt;() )
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , bp::make_function( (void (*)( ::tree_node_t &amp;,::tree_node_t * ))(&amp;tree_node_t_wrapper::set_right), bp::with_custodian_and_ward_postcall&lt; 1, 2 &gt;() ));
<br>&nbsp;&nbsp;&nbsp; }<br><br>Pay attention to used call policies. They are very important.<br><br>HTH<br clear="all"><br>-- <br>Roman Yakovenko<br>C++ Python language binding<br><a href="http://www.language-binding.net/">http://www.language-binding.net/
</a>