Wrappers

| 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)