Boost logo

Boost :

From: David Abrahams (david.abrahams_at_[hidden])
Date: 2001-11-14 18:00:35


----- Original Message -----
From: "Douglas Gregor" <gregod_at_[hidden]>

> As I see it, there are 3 types of function objects that don't need
> memory allocation within Boost.Function:
> - function pointers
> - unbound pointers to member functions
> - "stateless" function objects
>
> Boost.Function allocates no memory for the first of these (function
> pointers), and the other two are on my TODO list. The last one of these
seems
> to be what you want ("stateless" function objects)

Oh, I'm not sure I mean that they're stateless. What I mean is that they
don't need to survive past the call they're passed into. That's a different
question. For example, here's a specialized thing I kludged up for
boost/python/errors.hpp (as seen in the current CVS state) after realizing
that function wouldn't do what I wanted:

-------

struct object_functor_base
{
    typedef PyObject* result_type;
    virtual PyObject* operator()() const = 0;
 private:
    static void* operator new(std::size_t); // don't allow dynamic
allocation
    void operator delete(void*);
    void operator delete(void*, size_t);
};

template <class T>
struct object_functor : object_functor_base
{
    object_functor(T const& f)
        : m_f(f)
    {
    }

    PyObject* operator()() const
    {
        return m_f();
    }
 private:
    T const& m_f;
};

// Handles exceptions caught just before returning to Python code.
PyObject* handle_exception_impl(object_functor_base const& f);

template <class T>
PyObject* handle_exception(T const& f)
{
    return handle_exception_impl(object_functor<T>(f));
}

--------

You can call handle_exception with an arbitrary function object that has a
"signature" PyObject* f(), and it will work without allocating any memory on
the heap. The bulk of the code (in handle_exception_impl) is not repeated
for each different function object type. handle_exception_impl doesn't store
the function object away anywhere, so it doesn't matter that it receives a
reference.

I would have liked to be able to leverage the function library for this
purpose.

> An alternative that would work right now would be to use a custom
allocator.

How would that help?

-Dave


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk