[C++-sig] [Py++] incomplete type and forward declaration

2009-05-29 Thread Werner Joergensen

How can I process such a file classA.hpp using a code generator like 
http://www.language-binding.net/pyplusplus/documentation/tutorials/module_builder/generate_code.py.html?

--8< classA.hpp --
class B;

class A{
public:
  B& dontCareAboutB(){ /*return C::getB();*/ };
  void doSomething(){};
};
--8<--

This class compiles fine with just "g++ -c classA.hpp", but applying the 
pyplusplus code generator followed by bjam throws several errors:
...
/opt/boost_1_39_0/boost/python/type_id.hpp:89: error: invalid use of incomplete 
type ‘struct B’
./classA.hpp:1: error: forward declaration of ‘struct B’
...

If I replace the first line with "class B{}", making B a comple, empty class, 
this example succeeds. But then I run into more troubles if I add the actual 
definition of the real class B from another header file to the python module.

Does a solution with pyplusplus exist, where I don't need to modify the 
classA.hpp header file?

Thanks
Werner



  
___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

[C++-sig] Derived classes problem

2009-05-29 Thread hessiess
I am trying to create a python wrapper for the quad-ren graphics
engine, which relies heavily on derived classes. The problem is
that I cannot create derived classes in python and pass them
to the C++ objects without getting the following error:

Traceback (most recent call last):
  File "test.py", line 79, in 
quad3.set_event_receiver(event)
Boost.Python.ArgumentError: Python argument types in
qr_scene_node.set_event_receiver(qr_quad, ev_receiver)
did not match C++ signature:
set_event_receiver(qr_scene_node {lvalue}, qr_event_receiver*)


C++

#include 
#include 

using namespace boost::python;

struct qr_scene_node_w : qr_scene_node, wrapper
{
void on_register()
{
this->get_override("on_register")();
}

void on_render()
{
this->get_override("on_render")();
}

void on_drop()
{
this->get_override("on_drop")();
}
};

struct qr_event_receiver_w : qr_event_receiver, wrapper
{
bool on_event(qr_event *event, qr_scene_node *node, float time_delta)
{
this->get_override("on_event")();
}
};

BOOST_PYTHON_MODULE(qrpy)
{
class_("vector2d_i")
.def(init())
.def_readwrite("X", &vector2d_i::X)
.def_readwrite("Y", &vector2d_i::Y);

class_("vector2d_f")
.def(init())
.def_readwrite("X", &vector2d_f::X)
.def_readwrite("Y", &vector2d_f::Y);

class_("qr_resource_manager");

class_("qr_renderer")
.def(init())
.def("get_resource_manager", &qr_renderer::get_resource_manager,
return_value_policy())
.def("run",  &qr_renderer::run)
.def("drop", &qr_renderer::drop)
.def("set_total_layers", &qr_renderer::set_total_layers)
.def("set_window_title", &qr_renderer::set_window_title)
.def("get_time_delta",   &qr_renderer::get_time_delta)
.def("get_ticks",&qr_renderer::get_ticks)
.def("get_fps",  &qr_renderer::get_fps)
.def("set_camera_location",  &qr_renderer::set_camera_location)
.def("get_camera_location",  &qr_renderer::get_camera_location)
.def("get_pix_size", &qr_renderer::get_pix_size)
.def("set_bg_sprite",&qr_renderer::set_bg_sprite)
.def("get_bg_sprite",&qr_renderer::get_bg_sprite,
return_value_policy());

class_("qr_scene_node", no_init)
.def("register_node",  &qr_scene_node_w::register_node)
.def("drop",   &qr_scene_node_w::drop)
.def("set_location",   &qr_scene_node_w::set_location)
.def("get_location",   &qr_scene_node_w::get_location)
.def("set_size",   &qr_scene_node_w::set_size)
.def("get_size",   &qr_scene_node_w::get_size)
.def("set_rotation",   &qr_scene_node_w::set_rotation)
.def("get_rotation",   &qr_scene_node_w::get_rotation)
.def("set_layer",  &qr_scene_node_w::set_layer)
.def("get_layer",  &qr_scene_node_w::get_layer)
.def("set_sprite", &qr_scene_node_w::set_sprite)
.def("get_sprite", &qr_scene_node_w::get_sprite,
return_value_policy())
.def("set_event_receiver", &qr_scene_node_w::set_event_receiver)
.def("get_event_receiver", &qr_scene_node_w::get_event_receiver,
return_value_policy())
.def("set_frame",  &qr_scene_node_w::set_frame)
.def("get_frame",  &qr_scene_node_w::get_frame)

.def("add_polygon",&qr_scene_node_w::add_polygon)
.def("clear_mesh", &qr_scene_node_w::clear_mesh)
.def("on_register",&qr_scene_node_w::on_register)
.def("on_render",  &qr_scene_node_w::on_render)
.def("on_drop",&qr_scene_node_w::on_drop);

class_("qr_event_receiver",
no_init)
.def("on_event",   &qr_event_receiver_w::on_event);

class_ >("qr_quad")
.def(init());
}


Python

import qrpy
false = bool(0)
true  = bool(1)

#create renderer + get resource manager
renderer = qrpy.qr_renderer(qrpy.vector2d_i(4, 3),
10, false, qrpy.vector2d_i(0, 0))
res_man = renderer.get_resource_manager()

#event receiver
class ev_receiver(qrpy.qr_event_receiver):
def __init__(self):
return

def on_event(self, event, node, time_delta):
print event

event = ev_receiver()

quad = qrpy.qr_quad(res_man, 0)
quad.set_event_receiver(event) #error

___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig


Re: [C++-sig] libboost_python-gcc43-mt.so or without "mt"?

2009-05-29 Thread Neal Becker
Werner Joergensen wrote:

> 
> Dear list participants,
> 
> I have installed boost including the python lib using the boostrap.sh
> installation script, and now I have  the following libraries under /lib
> (linux system): libboost_python-gcc43-mt-1_39.a
> libboost_python-gcc43-mt-1_39.so libboost_python-gcc43-mt-1_39.so.1.39.0
> libboost_python-gcc43-mt.a
> libboost_python-gcc43-mt.so
> 
> However when I build a python extension module with bjam, and when I
> import the newly built module in python, the problem is:
> $ ipython
> In [1]: import myModule
> ImportError: libboost_python-gcc43-1_39.so.1.39.0: cannot open shared
> object file: No such file or directory
> 
> Of course, I can copy and rename the mt-libraries to the expected library
> name. But is there a possibility to build the python extension so that the
> exististing libboost_python-gcc43-mt.so will be linked instead of some
> other name? Can I configure which libboost_python will be used somewhere
> in boost-build.jam or user-config.jam or Jamroot?
> 
> Thanks
> Werner

Here's what I do

1. Get updated 1.39 from svn (the --layout=tagged option was just added, at 
my request).
Then,

I use:

bjam -sICU_PATH=/usr -sEXPAT_INCLUDE=/usr -sEXPAT_LIBPATH=/usr/lib64 --
layout=tagged threading=single,multi stage 

You will then have (sorry for ugly formatting):

 -rw-rw-r-- 1 nbecker nbecker  161294 2009-05-18 15:17 libboost_date_time.a
  -rw-rw-r-- 1 nbecker nbecker  161294 2009-05-18 15:17 libboost_date_time-
mt.a
  lrwxrwxrwx 1 nbecker nbecker  31 2009-05-18 15:17 libboost_date_time-
mt.so -> libboost_date_time-mt.so.1.40.0
  -rwxrwxr-x 1 nbecker nbecker   76680 2009-05-18 15:17 libboost_date_time-
mt.so.1.40.0
  lrwxrwxrwx 1 nbecker nbecker  28 2009-05-18 15:17 
libboost_date_time.so -> libboost_date_time.so.1.40.0
  -rwxrwxr-x 1 nbecker nbecker   76648 2009-05-18 15:17 
libboost_date_time.so.1.40.0
 ...



___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig