/usr/include/luabind/detail
Edit: /usr/include/luabind/detail/constructor.hpp (3691B)
// 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)
#if !BOOST_PP_IS_ITERATING
# ifndef LUABIND_DETAIL_CONSTRUCTOR_081018_HPP
# define LUABIND_DETAIL_CONSTRUCTOR_081018_HPP
# include
# include
# include
# include
# include
# include
# include
# include
namespace luabind { namespace detail {
inline void inject_backref(lua_State*, void*, void*)
{}
template
void inject_backref(lua_State* L, T* p, wrap_base*)
{
weak_ref(get_main_thread(L), L, 1).swap(wrap_access::ref(*p));
}
template
struct construct_aux;
template
struct construct
: construct_aux::value - 2, T, Pointer, Signature>
{};
template
struct construct_aux<0, T, Pointer, Signature>
{
typedef pointer_holder holder_type;
void operator()(argument const& self_) const
{
object_rep* self = touserdata(self_);
#ifdef LUABIND_USE_CXX11
std::unique_ptr instance(new T);
#else
std::auto_ptr instance(new T);
#endif
inject_backref(self_.interpreter(), instance.get(), instance.get());
void* naked_ptr = instance.get();
Pointer ptr(instance.release());
void* storage = self->allocate(sizeof(holder_type));
self->set_instance(new (storage) holder_type(
#ifdef LUABIND_USE_CXX11
std::move(ptr), registered_class::id, naked_ptr));
#else
ptr, registered_class::id, naked_ptr));
#endif
}
};
# define BOOST_PP_ITERATION_PARAMS_1 \
(3, (1, LUABIND_MAX_ARITY, ))
# include BOOST_PP_ITERATE()
}} // namespace luabind::detail
# endif // LUABIND_DETAIL_CONSTRUCTOR_081018_HPP
#else // !BOOST_PP_IS_ITERATING
# define N BOOST_PP_ITERATION()
template
struct construct_aux
{
typedef typename mpl::begin::type first;
typedef typename mpl::next::type iter0;
# define BOOST_PP_LOCAL_MACRO(n) \
typedef typename mpl::next< \
BOOST_PP_CAT(iter,BOOST_PP_DEC(n))>::type BOOST_PP_CAT(iter,n); \
typedef typename BOOST_PP_CAT(iter,n)::type BOOST_PP_CAT(a,BOOST_PP_DEC(n));
# define BOOST_PP_LOCAL_LIMITS (1,N)
# include BOOST_PP_LOCAL_ITERATE()
typedef pointer_holder holder_type;
void operator()(argument const& self_, BOOST_PP_ENUM_BINARY_PARAMS(N,a,_)) const
{
object_rep* self = touserdata(self_);
#ifdef LUABIND_USE_CXX11
std::unique_ptr instance(new T(BOOST_PP_ENUM_PARAMS(N,_)));
#else
std::auto_ptr instance(new T(BOOST_PP_ENUM_PARAMS(N,_)));
#endif
inject_backref(self_.interpreter(), instance.get(), instance.get());
void* naked_ptr = instance.get();
Pointer ptr(instance.release());
void* storage = self->allocate(sizeof(holder_type));
self->set_instance(new (storage) holder_type(
#ifdef LUABIND_USE_CXX11
std::move(ptr), registered_class::id, naked_ptr));
#else
ptr, registered_class::id, naked_ptr));
#endif
}
};
# undef N
#endif