Wrappers |
Suppose you have this function:
std::vector<std::string> names();
But you don't want to to export std::vector<std::string>, you want this function to return a python list of strings. Boost.Python has excellent support for things like that:
list names_wrapper()
{
list result;
// call original function
vector<string> v = names();
// put all the strings inside the python list
vector<string>::iterator it;
for (it = v.begin(); it != v.end(); ++it){
result.append(*it);
}
return result;
}
BOOST_PYTHON_MODULE(test)
{
def("names", &names_wrapper);
}
Nice heh? Pyste supports this mechanism too. You declare the names_wrapper function in a header named "test_wrappers.h" and in the interface file:
Include("test_wrappers.h")
names = Function("names", "test.h")
set_wrapper(names, "names_wrapper")
You can optionally declare the function in the interface file itself:
names_wrapper = Wrapper("names_wrapper",
"""
list names_wrapper()
{
// code to call name() and convert the vector to a list...
}
""")
names = Function("names", "test.h")
set_wrapper(names, names_wrapper)
The same mechanism can be used with member functions too. Just remember that the first parameter of wrappers for member functions is a pointer to the class, as in:
struct C
{
std::vector<std::string> names();
}
list names_wrapper(C* c)
{
// same as before, calling c->names() and converting result to a list
}
And then in the interface file:
C = Class("C", "test.h")
set_wrapper(C.names, "names_wrapper")
Even though Boost.Python accepts either a pointer or a reference to the class in wrappers for member functions as the first parameter, Pyste expects them to be a pointer. Doing otherwise will prevent your code to compile when you set a wrapper for a virtual member function. |
Copyright © 2003 Bruno da Silva de Oliveira
Copyright © 2002-2003 Joel de Guzman
Distributed under
the Boost Software License, Version 1.0. (See accompanying file
LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)