// Copyright David Abrahams 2002. | |
// 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) | |
#ifndef INSTANCE_HOLDER_DWA2002517_HPP | |
# define INSTANCE_HOLDER_DWA2002517_HPP | |
# include <boost/python/detail/prefix.hpp> | |
# include <boost/utility.hpp> | |
# include <boost/python/type_id.hpp> | |
# include <cstddef> | |
namespace boost { namespace python { | |
// Base class for all holders | |
struct BOOST_PYTHON_DECL instance_holder : private noncopyable | |
{ | |
public: | |
instance_holder(); | |
virtual ~instance_holder(); | |
// return the next holder in a chain | |
instance_holder* next() const; | |
// When the derived holder actually holds by [smart] pointer and | |
// null_ptr_only is set, only report that the type is held when | |
// the pointer is null. This is needed for proper shared_ptr | |
// support, to prevent holding shared_ptrs from being found when | |
// converting from python so that we can use the conversion method | |
// that always holds the Python object. | |
virtual void* holds(type_info, bool null_ptr_only) = 0; | |
void install(PyObject* inst) throw(); | |
// These functions should probably be located elsewhere. | |
// Allocate storage for an object of the given size at the given | |
// offset in the Python instance<> object if bytes are available | |
// there. Otherwise allocate size bytes of heap memory. | |
static void* allocate(PyObject*, std::size_t offset, std::size_t size); | |
// Deallocate storage from the heap if it was not carved out of | |
// the given Python object by allocate(), above. | |
static void deallocate(PyObject*, void* storage) throw(); | |
private: | |
instance_holder* m_next; | |
}; | |
// This macro is needed for implementation of derived holders | |
# define BOOST_PYTHON_UNFORWARD(N,ignored) (typename unforward<A##N>::type)(a##N) | |
// | |
// implementation | |
// | |
inline instance_holder* instance_holder::next() const | |
{ | |
return m_next; | |
} | |
}} // namespace boost::python | |
#endif // INSTANCE_HOLDER_DWA2002517_HPP |