/usr/include/luabind/detail
Edit: /usr/include/luabind/detail/instance_holder.hpp (3108B)
// Copyright Daniel Wallin 2008. Use, modification and distribution is
// subject to 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 LUABIND_INSTANCE_HOLDER_081024_HPP
# define LUABIND_INSTANCE_HOLDER_081024_HPP
# include
# include
# include
# include
# include
namespace luabind { namespace detail {
class instance_holder
{
public:
instance_holder(bool is_pointee_const)
: m_pointee_const(is_pointee_const)
{}
virtual ~instance_holder()
{}
virtual std::pair get(
cast_graph const& casts, class_id target) const = 0;
virtual void release() = 0;
bool pointee_const() const
{
return m_pointee_const;
}
private:
bool m_pointee_const;
};
namespace mpl = boost::mpl;
inline mpl::false_ check_const_pointer(void*)
{
return mpl::false_();
}
inline mpl::true_ check_const_pointer(void const*)
{
return mpl::true_();
}
template
#ifdef LUABIND_USE_CXX11
void release_ownership(std::unique_ptr& p)
#else
void release_ownership(std::auto_ptr& p)
#endif
{
p.release();
}
template
void release_ownership(P const&)
{
throw std::runtime_error(
"luabind: smart pointer does not allow ownership transfer");
}
template
class_id static_class_id(T*)
{
return registered_class::id;
}
template
class pointer_holder : public instance_holder
{
public:
pointer_holder(
P p, class_id dynamic_id, void* dynamic_ptr
)
: instance_holder(check_const_pointer(false ? get_pointer(p) : 0))
#ifdef LUABIND_USE_CXX11
, m_p(std::move(p))
#else
, m_p(p)
#endif
, m_weak(0)
, m_dynamic_id(dynamic_id)
, m_dynamic_ptr(dynamic_ptr)
{}
std::pair get(cast_graph const& casts, class_id target) const
{
if (target == registered_class::id)
return std::pair(&this->m_p, 0);
void* naked_ptr = const_cast(static_cast(
m_weak ? m_weak : get_pointer(m_p)));
if (!naked_ptr)
return std::pair(static_cast(0), 0);
return casts.cast(
naked_ptr
, static_class_id(false ? get_pointer(m_p) : 0)
, target
, m_dynamic_id
, m_dynamic_ptr
);
}
void release()
{
m_weak = const_cast(static_cast(
get_pointer(m_p)));
release_ownership(m_p);
}
private:
mutable P m_p;
// weak will hold a possibly stale pointer to the object owned
// by p once p has released it's owership. This is a workaround
// to make adopt() work with virtual function wrapper classes.
void* m_weak;
class_id m_dynamic_id;
void* m_dynamic_ptr;
};
}} // namespace luabind::detail
#endif // LUABIND_INSTANCE_HOLDER_081024_HPP