You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
63 lines
2.0 KiB
63 lines
2.0 KiB
// 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
|
|
|