[C++-sig] wrapper & HeldType

Roman Yakovenko roman.yakovenko at gmail.com
Sun Oct 16 08:33:08 CEST 2005


Sorry I forgot to attach files.

On 10/16/05, Roman Yakovenko <roman.yakovenko at gmail.com> wrote:
> On 10/12/05, David Abrahams <dave at boost-consulting.com> wrote:
>
> > Could you please post a minimal, complete example that you think
> > should work?
>
> Yes of course. See attached files.
>
> C++ code to be exported
>
> smart_pointers_to_be_exported.hpp
> smart_pointers_to_be_exported.cpp
>
> boost.python wrappers:
>
> smart_pointers.cpp
>
> In order to show my point file smart_pointers.cpp could not be compiled.
> If you want it to be compiled uncomment PyObject* argument in wrapper
> constructors.
>
> An other way you can see my point to update boost.python unittests to
> use wrapper
> class.
>
> > Thanks,
> > Dave
> >
> > --
> > Dave Abrahams
> > Boost Consulting
> > www.boost-consulting.com
>
> Thanks for help
>
> Roman Yakovenko
>
-------------- next part --------------
#ifndef __smart_pointers_to_be_exported_hpp__
#define __smart_pointers_to_be_exported_hpp__
#include <memory>
#include "boost/shared_ptr.hpp"

namespace smart_pointers{

struct base{
    base() : base_value(19) {}
    int base_value;
    virtual int get_base_value(){ return base_value; }
};

struct data : base{
    data() : value(11){}
    int value;
    virtual int get_value(){ return value; }
};

typedef std::auto_ptr< base > base_a_ptr;
typedef boost::shared_ptr< base > base_s_ptr;

typedef std::auto_ptr< data > data_a_ptr;
typedef boost::shared_ptr< data > data_s_ptr;
    
data_a_ptr create_auto();
data_s_ptr create_shared();

int ref_auto( data_a_ptr& a );
int ref_shared( data_s_ptr& a );

int val_auto( data_a_ptr a );
int val_shared( data_s_ptr a );

int const_ref_auto( const data_a_ptr& a );
int const_ref_shared( const data_s_ptr& a );

int ref_auto_base_value( base_a_ptr& a );
int ref_shared_base_value( base_s_ptr& a );

int val_auto_base_value( base_a_ptr a );
int val_shared_base_value( base_s_ptr a );

int const_ref_auto_base_value( const base_a_ptr& a );
int const_ref_shared_base_value( const base_s_ptr& a );
    
}    

#endif//__smart_pointers_to_be_exported_hpp__
-------------- next part --------------
#include "smart_pointers_to_be_exported.hpp"

namespace smart_pointers{
   
data_a_ptr create_auto(){ return data_a_ptr( new data() ); }
data_s_ptr create_shared(){ return data_s_ptr( new data() ); }

int ref_auto( data_a_ptr& a ){ return a->get_value(); }
int ref_shared( data_s_ptr& a ){ return a->get_value(); }

int val_auto( data_a_ptr a ){ return a->get_value(); }
int val_shared( data_s_ptr a ){ return a->get_value(); }

int const_ref_auto( const data_a_ptr& a ){ return a->get_value(); }
int const_ref_shared( const data_s_ptr& a ){ return a->get_value(); }

int ref_auto_base_value( base_a_ptr& a ){ return a->get_base_value(); }
int ref_shared_base_value( base_s_ptr& a ){ return a->get_base_value(); }

int val_auto_base_value( base_a_ptr a ){ return a->get_base_value(); }
int val_shared_base_value( base_s_ptr a ){ return a->get_base_value(); }

int const_ref_auto_base_value( const base_a_ptr& a ){ return a->get_base_value(); }
int const_ref_shared_base_value( const base_s_ptr& a ){ return a->get_base_value(); }
   
    
}    
-------------- next part --------------
//std directories: ['d:\\boost_cvs', 'c:\\python\\include']
//user defined directories: ['d:\\pygccxml_sources\\source\\pyplusplus']

#include "boost/python.hpp"

#include "unittests/data/smart_pointers_to_be_exported.hpp"

namespace bp = boost::python;

struct base_wrapper : smart_pointers::base, bp::wrapper< smart_pointers::base > {

    base_wrapper(/*PyObject**/, smart_pointers::base const & arg )
    : smart_pointers::base( arg )
      , bp::wrapper< smart_pointers::base >()
    {}

    base_wrapper(/*PyObject**/ )
    : smart_pointers::base( )
      , bp::wrapper< smart_pointers::base >()
    {}

    virtual int get_base_value(  ){
        if( bp::override get_base_value = this->get_override( "get_base_value" ) )
            return get_base_value(  );
        else
            return smart_pointers::base::get_base_value(  );
    }
    
    virtual int default_get_base_value(  ){
        return this->smart_pointers::base::get_base_value( );
    }

};

struct data_wrapper : smart_pointers::data, bp::wrapper< smart_pointers::data > {

    data_wrapper(/*PyObject**/, smart_pointers::data const & arg )
    : smart_pointers::data( arg )
      , bp::wrapper< smart_pointers::data >()
    {}

    data_wrapper(/*PyObject**/ )
    : smart_pointers::data( )
      , bp::wrapper< smart_pointers::data >()
    {}

    virtual int get_value(  ){
        if( bp::override get_value = this->get_override( "get_value" ) )
            return get_value(  );
        else
            return smart_pointers::data::get_value(  );
    }
    
    virtual int default_get_value(  ){
        return this->smart_pointers::data::get_value( );
    }

};

BOOST_PYTHON_MODULE(smart_pointers){
    bp::class_< smart_pointers::base, base_wrapper, boost::shared_ptr< smart_pointers::base > >( "base" )    
        .def( bp::init< >()[bp::default_call_policies()] )    
        .def( "get_base_value"
                , &smart_pointers::base::get_base_value
                , &::base_wrapper::default_get_base_value
                , bp::default_call_policies() )    
        .def_readwrite( "base_value", &smart_pointers::base::base_value );

    bp::register_ptr_to_python< boost::shared_ptr< smart_pointers::base > >();

    bp::register_ptr_to_python< std::auto_ptr< smart_pointers::base > >();

    bp::class_< smart_pointers::data, data_wrapper, bp::bases< smart_pointers::base >, boost::shared_ptr< smart_pointers::data > >( "data" )    
        .def( bp::init< >()[bp::default_call_policies()] )    
        .def( "get_value"
                , &smart_pointers::data::get_value
                , &::data_wrapper::default_get_value
                , bp::default_call_policies() )    
        .def_readwrite( "value", &smart_pointers::data::value );

    bp::register_ptr_to_python< boost::shared_ptr< smart_pointers::data > >();

    bp::implicitly_convertible< boost::shared_ptr< smart_pointers::data >, boost::shared_ptr< smart_pointers::base > >();

    bp::register_ptr_to_python< std::auto_ptr< smart_pointers::data > >();

    bp::implicitly_convertible< std::auto_ptr< smart_pointers::data >, std::auto_ptr< smart_pointers::base > >();

}


More information about the Cplusplus-sig mailing list