[C++-sig] Pyplusplus - anonymous union
Jan Langer
jan at langernetz.de
Wed Aug 2 15:42:11 CEST 2006
Roman Yakovenko wrote:
>>I'm using pyplusplus to generate python-bindings for a C API.
>
> mb = module_builder_t( ... )
> #The code in subversion does it for you
> mb.classes( name='' ).exclude()
>
> Next code is copied from Python-OGRE bindings:
>
> [...]
>
> This should work.
>
> P.S. You project is 3rd project that need this feature, may be this is a time
> to implement it :-)
Thank you. Actually this behavior does not work like I want, but gave me
more insight into the workings of pyplusplus. I now use a different
strategy. First, I generate a union wrapper to give the anonymous union
a name. Then, I provide getter and setter functions for each union
member and getter/setter for the union itself. The access to the union
members and the union is then accomplished by the .add_property calls. I
paste the relevant boost.python code below. However, I omit the
pyplusplus code, but in case someone is interested I can send it, too.
Jan
//-------------------------------------------------
// library code
typedef struct
{
IntT offset;
IntT dataType;
union {
StringT sdata;
IntT idata;
} u;
} F_TextItemT;
// boost.python code
union F_TextItemT_union
{
StringT sdata;
IntT idata;
};
StringT get_F_TextItemT_union_sdata (union_wrapper <F_TextItemT_union>
const &t)
{
return t.u.sdata;
}
void set_F_TextItemT_union_sdata (union_wrapper <F_TextItemT_union> &t,
StringT const &v)
{
t.u.sdata = v;
}
IntT get_F_TextItemT_union_idata (union_wrapper <F_TextItemT_union>
const &t)
{
return t.u.idata;
}
void set_F_TextItemT_union_idata (union_wrapper <F_TextItemT_union> &t,
IntT const &v)
{
t.u.idata = v;
}
union_wrapper <F_TextItemT_union> get_F_TextItemT_u (F_TextItemT const &t)
{
union_wrapper <F_TextItemT_union> uw;
assert(sizeof(uw.u) == sizeof(uw.u));
std::memcpy(&uw.u,&t.u,sizeof(uw.u));
return uw;
}
void set_F_TextItemT_u (F_TextItemT &t, union_wrapper
<F_TextItemT_union> const &uw)
{
assert(sizeof(uw.u) == sizeof(t.u));
std::memcpy(&t.u,&uw.u,sizeof(uw.u));
}
BOOST_PYTHON_MODULE(pyfdk){
if( true ){
typedef bp::class_< F_TextItemT > F_TextItemT_exposer_t;
F_TextItemT_exposer_t F_TextItemT_exposer =
F_TextItemT_exposer_t( "F_TextItemT" );
bp::scope F_TextItemT_scope( F_TextItemT_exposer );
bp::class_ <union_wrapper <F_TextItemT_union > >
("F_TextItemT_union")
.add_property ("sdata",
bp::make_function
(&get_F_TextItemT_union_sdata,bp::return_value_policy
<bp::return_by_value> ()),
&set_F_TextItemT_union_sdata)
.add_property ("idata",
bp::make_function
(&get_F_TextItemT_union_idata,bp::return_value_policy
<bp::return_by_value> ()),
&set_F_TextItemT_union_idata)
;
F_TextItemT_exposer.def_readwrite( "offset", &F_TextItemT::offset );
F_TextItemT_exposer.def_readwrite( "dataType",
&F_TextItemT::dataType );
F_TextItemT_exposer.add_property("u",
&get_F_TextItemT_u,
&set_F_TextItemT_u);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 252 bytes
Desc: OpenPGP digital signature
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20060802/a5623158/attachment.pgp>
More information about the Cplusplus-sig
mailing list