[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