x
Yes
No
Do you want to visit DriveHQ English website?
Inicio
Características
Precios
Prueba gratuita
Software cliente
Acerca de nosotros
Servidor de archivos
|
Solución de copias de seguridad
|
Servidor FTP
|
Servidor de correo electrónico
|
Alojamiento web
|
Software cliente
Servidor de archivos
Solución de copia de seguridad
Servidor FTP
Servidor de correo electrónico
Alojamiento web
Software cliente
object.hpp - Hosted on DriveHQ Cloud IT Platform
Arriba
Subir
Descargar
Compartir
Publicar
Nueva carpeta
Nuevo archivo
Copiar
Cortar
Eliminar
Pegar
Clasificación
Actualizar
Ruta de la carpeta: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\luabind\luabind\object.hpp
Girar
Efecto
Propiedad
Historial
// Copyright (c) 2005 Daniel Wallin and Arvid Norberg // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT // SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR // ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE // OR OTHER DEALINGS IN THE SOFTWARE. #ifndef LUABIND_OBJECT_050419_HPP #define LUABIND_OBJECT_050419_HPP #include
// detail::push() #include
// detail::push() #include
// value_wrapper_traits specializations #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// REFACTOR #include
// iterator #include
#include
#include
namespace luabind { namespace detail { namespace mpl = boost::mpl; template
void push_aux(lua_State* interpreter, T& value, ConverterGenerator*) { typedef typename boost::mpl::if_< boost::is_reference_wrapper
, BOOST_DEDUCED_TYPENAME boost::unwrap_reference
::type& , T >::type unwrapped_type; typename mpl::apply_wrap2< ConverterGenerator,unwrapped_type,cpp_to_lua >::type cv; cv.apply( interpreter , boost::implicit_cast< BOOST_DEDUCED_TYPENAME boost::unwrap_reference
::type& >(value) ); } template
void push(lua_State* interpreter, T& value, Policies const&) { typedef typename find_conversion_policy< 0 , Policies >::type converter_policy; push_aux(interpreter, value, (converter_policy*)0); } template
void push(lua_State* interpreter, T& value) { push(interpreter, value, null_type()); } } // namespace detail namespace adl { namespace mpl = boost::mpl; template
class object_interface; namespace is_object_interface_aux { typedef char (&yes)[1]; typedef char (&no)[2]; template
yes check(object_interface
*); no check(void*); template
struct impl { BOOST_STATIC_CONSTANT(bool, value = sizeof(is_object_interface_aux::check((T*)0)) == sizeof(yes) ); typedef mpl::bool_
type; }; } // namespace detail template
struct is_object_interface : is_object_interface_aux::impl
::type {}; template
struct enable_binary # ifndef BOOST_NO_SFINAE : boost::enable_if< mpl::or_< is_object_interface
, is_object_interface
> , R > {}; # else { typedef R type; }; # endif template
int binary_interpreter(lua_State*& L, T const& lhs, U const& rhs , boost::mpl::true_, boost::mpl::true_) { L = value_wrapper_traits
::interpreter(lhs); lua_State* L2 = value_wrapper_traits
::interpreter(rhs); // you are comparing objects with different interpreters // that's not allowed. assert(L == L2 || L == 0 || L2 == 0); // if the two objects we compare have different interpreters // then they if (L != L2) return -1; if (L == 0) return 1; return 0; } template
int binary_interpreter(lua_State*& L, T const& x, U const& , boost::mpl::true_, boost::mpl::false_) { L = value_wrapper_traits
::interpreter(x); return 0; } template
int binary_interpreter(lua_State*& L, T const&, U const& x, boost::mpl::false_, boost::mpl::true_) { L = value_wrapper_traits
::interpreter(x); return 0; } template
int binary_interpreter(lua_State*& L, T const& x, U const& y) { return binary_interpreter( L , x , y , is_value_wrapper
() , is_value_wrapper
() ); } #define LUABIND_BINARY_OP_DEF(op, fn) \ template
\ typename enable_binary
::type \ operator op(LHS const& lhs, RHS const& rhs) \ { \ lua_State* L = 0; \ switch (binary_interpreter(L, lhs, rhs)) \ { \ case 1: \ return true; \ case -1: \ return false; \ } \ \ assert(L); \ \ detail::stack_pop pop1(L, 1); \ detail::push(L, lhs); \ detail::stack_pop pop2(L, 1); \ detail::push(L, rhs); \ \ return fn(L, -1, -2) != 0; \ } LUABIND_BINARY_OP_DEF(==, lua_equal) LUABIND_BINARY_OP_DEF(<, lua_lessthan) template
std::ostream& operator<<(std::ostream& os , object_interface
const& v) { using namespace luabind; lua_State* interpreter = value_wrapper_traits
::interpreter( static_cast
(v)); detail::stack_pop pop(interpreter, 1); value_wrapper_traits
::unwrap(interpreter , static_cast
(v)); char const* p = lua_tostring(interpreter, -1); int len = lua_strlen(interpreter, -1); std::copy(p, p + len, std::ostream_iterator
(os)); return os; } #undef LUABIND_BINARY_OP_DEF template
typename enable_binary
::type operator>(LHS const& lhs, RHS const& rhs) { return !(lhs < rhs || lhs == rhs); } template
typename enable_binary
::type operator<=(LHS const& lhs, RHS const& rhs) { return lhs < rhs || lhs == rhs; } template
typename enable_binary
::type operator>=(LHS const& lhs, RHS const& rhs) { return !(lhs < rhs); } template
typename enable_binary
::type operator!=(LHS const& lhs, RHS const& rhs) { return !(lhs < rhs); } template
struct call_proxy; template
class index_proxy; class object; template
class object_interface { public: ~object_interface() {} call_proxy
> operator()(); template
call_proxy< Derived , boost::tuples::tuple
> operator()(A0 const& a0) { typedef boost::tuples::tuple
arguments; return call_proxy
( derived() , arguments(&a0) ); } template
call_proxy< Derived , boost::tuples::tuple
> operator()(A0 const& a0, A1 const& a1) { typedef boost::tuples::tuple
arguments; return call_proxy
( derived() , arguments(&a0, &a1) ); } // The rest of the overloads are PP-generated. #define BOOST_PP_ITERATION_PARAMS_1 (3, \ (3, LUABIND_MAX_ARITY,
)) #include BOOST_PP_ITERATE() private: Derived& derived() { return *static_cast
(this); } Derived const& derived() const { return *static_cast
(this); } }; #ifdef LUABIND_USE_VALUE_WRAPPER_TAG struct iterator_proxy_tag; #endif template
class iterator_proxy : public object_interface
> { public: #ifdef LUABIND_USE_VALUE_WRAPPER_TAG typedef iterator_proxy_tag value_wrapper_tag; #endif iterator_proxy(lua_State* interpreter, handle const& table, handle const& key) : m_interpreter(interpreter) , m_table_index(lua_gettop(interpreter) + 1) , m_key_index(m_table_index + 1) { table.push(m_interpreter); key.push(m_interpreter); } iterator_proxy(iterator_proxy const& other) : m_interpreter(other.m_interpreter) , m_table_index(other.m_table_index) , m_key_index(other.m_key_index) { other.m_interpreter = 0; } ~iterator_proxy() { if (m_interpreter) lua_pop(m_interpreter, 2); } // this will set the value to nil iterator_proxy & operator=(luabind::detail::nil_type) { lua_pushvalue(m_interpreter, m_key_index); lua_pushnil(m_interpreter); AccessPolicy::set(m_interpreter, m_table_index); return *this; } template
iterator_proxy& operator=(T const& value) { lua_pushvalue(m_interpreter, m_key_index); detail::push(m_interpreter, value); AccessPolicy::set(m_interpreter, m_table_index); return *this; } template
index_proxy
> operator[](Key const& key) { return index_proxy
>( *this, m_interpreter, key ); } // This is non-const to prevent conversion on lvalues. operator object(); lua_State* interpreter() const { return m_interpreter; } // TODO: Why is it non-const? void push(lua_State* interpreter) { assert(interpreter == m_interpreter); lua_pushvalue(m_interpreter, m_key_index); AccessPolicy::get(m_interpreter, m_table_index); } private: mutable lua_State* m_interpreter; int m_table_index; int m_key_index; }; } // namespace adl namespace detail { struct basic_access { static void set(lua_State* interpreter, int table) { lua_settable(interpreter, table); } static void get(lua_State* interpreter, int table) { lua_gettable(interpreter, table); } }; struct raw_access { static void set(lua_State* interpreter, int table) { lua_rawset(interpreter, table); } static void get(lua_State* interpreter, int table) { lua_rawget(interpreter, table); } }; template
class basic_iterator : public boost::iterator_facade< basic_iterator
, adl::iterator_proxy
, boost::single_pass_traversal_tag , adl::iterator_proxy
> { public: basic_iterator() : m_interpreter(0) {} template
explicit basic_iterator(ValueWrapper const& value_wrapper) : m_interpreter( value_wrapper_traits
::interpreter(value_wrapper) ) { detail::stack_pop pop(m_interpreter, 1); value_wrapper_traits
::unwrap(m_interpreter, value_wrapper); lua_pushnil(m_interpreter); if (lua_next(m_interpreter, -2) != 0) { detail::stack_pop pop(m_interpreter, 2); handle(m_interpreter, -2).swap(m_key); } else { m_interpreter = 0; return; } handle(m_interpreter, -1).swap(m_table); } adl::object key() const; private: friend class boost::iterator_core_access; void increment() { m_table.push(m_interpreter); m_key.push(m_interpreter); detail::stack_pop pop(m_interpreter, 1); if (lua_next(m_interpreter, -2) != 0) { m_key.replace(m_interpreter, -2); lua_pop(m_interpreter, 2); } else { m_interpreter = 0; handle().swap(m_table); handle().swap(m_key); } } bool equal(basic_iterator const& other) const { if (m_interpreter == 0 && other.m_interpreter == 0) return true; if (m_interpreter != other.m_interpreter) return false; detail::stack_pop pop(m_interpreter, 2); m_key.push(m_interpreter); other.m_key.push(m_interpreter); return lua_equal(m_interpreter, -2, -1) != 0; } adl::iterator_proxy
dereference() const { return adl::iterator_proxy
(m_interpreter, m_table, m_key); } lua_State* m_interpreter; handle m_table; handle m_key; }; // Needed because of some strange ADL issues. #define LUABIND_OPERATOR_ADL_WKND(op) \ inline bool operator op( \ basic_iterator
const& x \ , basic_iterator
const& y) \ { \ return boost::operator op(x, y); \ } \ \ inline bool operator op( \ basic_iterator
const& x \ , basic_iterator
const& y) \ { \ return boost::operator op(x, y); \ } LUABIND_OPERATOR_ADL_WKND(==) LUABIND_OPERATOR_ADL_WKND(!=) #undef LUABIND_OPERATOR_ADL_WKND } // namespace detail namespace adl { #ifdef LUABIND_USE_VALUE_WRAPPER_TAG struct index_proxy_tag; #endif template
class index_proxy : public object_interface
> { public: #ifdef LUABIND_USE_VALUE_WRAPPER_TAG typedef index_proxy_tag value_wrapper_tag; #endif typedef index_proxy
this_type; template
index_proxy(Next const& next, lua_State* interpreter, Key const& key) : m_interpreter(interpreter) , m_key_index(lua_gettop(interpreter) + 1) , m_next(next) { detail::push(m_interpreter, key); } index_proxy(index_proxy const& other) : m_interpreter(other.m_interpreter) , m_key_index(other.m_key_index) , m_next(other.m_next) { other.m_interpreter = 0; } ~index_proxy() { if (m_interpreter) lua_pop(m_interpreter, 1); } // This is non-const to prevent conversion on lvalues. operator object(); // this will set the value to nil this_type& operator=(luabind::detail::nil_type) { value_wrapper_traits
::unwrap(m_interpreter, m_next); detail::stack_pop pop(m_interpreter, 1); lua_pushvalue(m_interpreter, m_key_index); lua_pushnil(m_interpreter); lua_settable(m_interpreter, -3); return *this; } template
this_type& operator=(T const& value) { value_wrapper_traits
::unwrap(m_interpreter, m_next); detail::stack_pop pop(m_interpreter, 1); lua_pushvalue(m_interpreter, m_key_index); detail::push(m_interpreter, value); lua_settable(m_interpreter, -3); return *this; } this_type& operator=(this_type const& value) { value_wrapper_traits
::unwrap(m_interpreter, m_next); detail::stack_pop pop(m_interpreter, 1); lua_pushvalue(m_interpreter, m_key_index); detail::push(m_interpreter, value); lua_settable(m_interpreter, -3); return *this; } template
index_proxy
operator[](T const& key) { return index_proxy
(*this, m_interpreter, key); } void push(lua_State* interpreter); lua_State* interpreter() const { return m_interpreter; } private: struct hidden_type {}; // this_type& operator=(index_proxy
const&); mutable lua_State* m_interpreter; int m_key_index; Next const& m_next; }; } // namespace adl typedef detail::basic_iterator
iterator; typedef detail::basic_iterator
raw_iterator; #ifndef LUABIND_USE_VALUE_WRAPPER_TAG template
struct value_wrapper_traits
> #else template<> struct value_wrapper_traits
#endif { typedef boost::mpl::true_ is_specialized; template
static lua_State* interpreter(adl::index_proxy
const& proxy) { return proxy.interpreter(); } template
static void unwrap(lua_State* interpreter, adl::index_proxy
const& proxy) { const_cast
&>(proxy).push(interpreter); } }; #ifndef LUABIND_USE_VALUE_WRAPPER_TAG template
struct value_wrapper_traits
> #else template<> struct value_wrapper_traits
#endif { typedef boost::mpl::true_ is_specialized; template
static lua_State* interpreter(Proxy const& p) { return p.interpreter(); } template
static void unwrap(lua_State* interpreter, Proxy const& p) { // TODO: Why const_cast? const_cast
(p).push(interpreter); } }; #ifndef LUABIND_USE_VALUE_WRAPPER_TAG template
struct value_wrapper_traits
> #else template<> struct value_wrapper_traits
#endif { typedef boost::mpl::true_ is_specialized; template
static lua_State* interpreter(adl::call_proxy
const& proxy) { return value_wrapper_traits
::interpreter(*proxy.value_wrapper); } template
static void unwrap(lua_State* interpreter, adl::call_proxy
const& proxy) { object result = const_cast
&>(proxy); result.push(result.interpreter()); } }; namespace adl { class object_init { protected: object_init() {} explicit object_init(from_stack const& stack_reference, boost::mpl::true_) : m_handle(stack_reference.interpreter, stack_reference.index) { } template
explicit object_init(ValueWrapper const& value_wrapper, boost::mpl::false_) { lua_State* interpreter = value_wrapper_traits
::interpreter( value_wrapper ); value_wrapper_traits
::unwrap(interpreter, value_wrapper); detail::stack_pop pop(interpreter, 1); handle(interpreter, -1).swap(m_handle); } handle m_handle; }; // An object holds a reference to a Lua value residing // in the registry. class object : public object_interface
{ struct safe_bool_type {}; public: object() {} explicit object(handle const& other) : m_handle(other) {} explicit object(from_stack const& stack_reference) : m_handle(stack_reference.interpreter, stack_reference.index) { } template
object(lua_State* interpreter, T const& value) { detail::push(interpreter, value); detail::stack_pop pop(interpreter, 1); handle(interpreter, -1).swap(m_handle); } template
object(lua_State* interpreter, T const& value, Policies const&) { detail::push(interpreter, value, Policies()); detail::stack_pop pop(interpreter, 1); handle(interpreter, -1).swap(m_handle); } void push(lua_State* interpreter) const; lua_State* interpreter() const; bool is_valid() const; operator safe_bool_type*() const; template
index_proxy
operator[](T const& key) const { return index_proxy
( *this, m_handle.interpreter(), key ); } void swap(object& other) { m_handle.swap(other.m_handle); } private: handle m_handle; }; inline void object::push(lua_State* interpreter) const { m_handle.push(interpreter); } inline lua_State* object::interpreter() const { return m_handle.interpreter(); } inline bool object::is_valid() const { return m_handle.interpreter() != 0; } inline object::operator object::safe_bool_type*() const { return is_valid()?(safe_bool_type*)1:0; } } // namespace adl using adl::object; template<> struct value_wrapper_traits
{ typedef boost::mpl::true_ is_specialized; static lua_State* interpreter(object const& value) { return value.interpreter(); } static void unwrap(lua_State* interpreter, object const& value) { value.push(interpreter); } static bool check(...) { return true; } }; template
inline void adl::index_proxy
::push(lua_State* interpreter) { assert(interpreter == m_interpreter); value_wrapper_traits
::unwrap(m_interpreter, m_next); lua_pushvalue(m_interpreter, m_key_index); lua_gettable(m_interpreter, -2); lua_remove(m_interpreter, -2); } template
inline adl::index_proxy
::operator object() { detail::stack_pop pop(m_interpreter, 1); push(m_interpreter); return object(from_stack(m_interpreter, -1)); } template
adl::iterator_proxy
::operator object() { lua_pushvalue(m_interpreter, m_key_index); AccessPolicy::get(m_interpreter, m_table_index); detail::stack_pop pop(m_interpreter, 1); return object(from_stack(m_interpreter, -1)); } template
object detail::basic_iterator
::key() const { return object(m_key); } namespace detail { template< class T , class ValueWrapper , class Policies , class ErrorPolicy , class ReturnType > ReturnType object_cast_aux( ValueWrapper const& value_wrapper , T* , Policies* , ErrorPolicy* , ReturnType* ) { lua_State* interpreter = value_wrapper_traits
::interpreter( value_wrapper ); #ifndef LUABIND_NO_ERROR_CHECKING if (!interpreter) return ErrorPolicy::handle_error(interpreter, LUABIND_TYPEID(void)); #endif value_wrapper_traits
::unwrap(interpreter, value_wrapper); detail::stack_pop pop(interpreter, 1); typedef typename detail::find_conversion_policy< 0 , Policies >::type converter_generator; typename mpl::apply_wrap2
::type cv; #ifndef LUABIND_NO_ERROR_CHECKING if (cv.match(interpreter, LUABIND_DECORATE_TYPE(T), -1) < 0) { return ErrorPolicy::handle_error(interpreter, LUABIND_TYPEID(T)); } #endif return cv.apply(interpreter, LUABIND_DECORATE_TYPE(T), -1); } template
struct throw_error_policy { static T handle_error(lua_State* interpreter, LUABIND_TYPE_INFO type_info) { #ifndef LUABIND_NO_EXCEPTIONS throw cast_failed(interpreter, type_info); #else cast_failed_callback_fun e = get_cast_failed_callback(); if (e) e(interpreter, type_info); assert(0 && "object_cast failed. If you want to handle this error use " "luabind::set_error_callback()"); std::terminate(); #endif return *(typename boost::remove_reference
::type*)0; } }; template
struct nothrow_error_policy { static boost::optional
handle_error(lua_State*, LUABIND_TYPE_INFO) { return boost::optional
(); } }; } // namespace detail template
T object_cast(ValueWrapper const& value_wrapper) { return detail::object_cast_aux( value_wrapper , (T*)0 , (detail::null_type*)0 , (detail::throw_error_policy
*)0 , (T*)0 ); } template
T object_cast(ValueWrapper const& value_wrapper, Policies const&) { return detail::object_cast_aux( value_wrapper , (T*)0 , (Policies*)0 , (detail::throw_error_policy
*)0 , (T*)0 ); } template
boost::optional
object_cast_nothrow(ValueWrapper const& value_wrapper) { return detail::object_cast_aux( value_wrapper , (T*)0 , (detail::null_type*)0 , (detail::nothrow_error_policy
*)0 , (boost::optional
*)0 ); } template
boost::optional
object_cast_nothrow(ValueWrapper const& value_wrapper, Policies const&) { return detail::object_cast_aux( value_wrapper , (T*)0 , (Policies*)0 , (detail::nothrow_error_policy
*)0 , (boost::optional
*)0 ); } namespace detail { template
struct push_args_from_tuple { template
inline static void apply(lua_State* L, const boost::tuples::cons
& x, const Policies& p) { convert_to_lua_p
(L, *x.get_head(), p); push_args_from_tuple
::apply(L, x.get_tail(), p); } template
inline static void apply(lua_State* L, const boost::tuples::cons
& x) { convert_to_lua(L, *x.get_head()); push_args_from_tuple
::apply(L, x.get_tail()); } template
inline static void apply(lua_State*, const boost::tuples::null_type&, const Policies&) {} inline static void apply(lua_State*, const boost::tuples::null_type&) {} }; } // namespace detail namespace adl { template
struct call_proxy { call_proxy(ValueWrapper& value_wrapper, Arguments arguments) : value_wrapper(&value_wrapper) , arguments(arguments) {} call_proxy(call_proxy const& other) : value_wrapper(other.value_wrapper) , arguments(other.arguments) { other.value_wrapper = 0; } ~call_proxy() { if (value_wrapper) call((detail::null_type*)0); } operator object() { return call((detail::null_type*)0); } template
object operator[](Policies const&) { return call((Policies*)0); } template
object call(Policies*) { lua_State* interpreter = value_wrapper_traits
::interpreter( *value_wrapper ); value_wrapper_traits
::unwrap( interpreter , *value_wrapper ); value_wrapper = 0; detail::push_args_from_tuple<1>::apply(interpreter, arguments, Policies()); if (detail::pcall(interpreter, boost::tuples::length
::value, 1)) { #ifndef LUABIND_NO_EXCEPTIONS throw luabind::error(interpreter); #else error_callback_fun e = get_error_callback(); if (e) e(interpreter); assert(0 && "the lua function threw an error and exceptions are disabled." "if you want to handle this error use luabind::set_error_callback()"); std::terminate(); #endif } detail::stack_pop pop(interpreter, 1); return object(from_stack(interpreter, -1)); } mutable ValueWrapper* value_wrapper; Arguments arguments; }; template
call_proxy
> object_interface
::operator()() { return call_proxy
>( derived() , boost::tuples::tuple<>() ); } } // namespace adl inline object newtable(lua_State* interpreter) { lua_newtable(interpreter); detail::stack_pop pop(interpreter, 1); return object(from_stack(interpreter, -1)); } // this could be optimized by returning a proxy inline object globals(lua_State* interpreter) { lua_pushvalue(interpreter, LUA_GLOBALSINDEX); detail::stack_pop pop(interpreter, 1); return object(from_stack(interpreter, -1)); } // this could be optimized by returning a proxy inline object registry(lua_State* interpreter) { lua_pushvalue(interpreter, LUA_REGISTRYINDEX); detail::stack_pop pop(interpreter, 1); return object(from_stack(interpreter, -1)); } template
inline object gettable(ValueWrapper const& table, K const& key) { lua_State* interpreter = value_wrapper_traits
::interpreter( table ); value_wrapper_traits
::unwrap(interpreter, table); detail::stack_pop pop(interpreter, 2); detail::push(interpreter, key); lua_gettable(interpreter, -2); return object(from_stack(interpreter, -1)); } template
inline void settable(ValueWrapper const& table, K const& key, T const& value) { lua_State* interpreter = value_wrapper_traits
::interpreter( table ); // TODO: Exception safe? value_wrapper_traits
::unwrap(interpreter, table); detail::stack_pop pop(interpreter, 1); detail::push(interpreter, key); detail::push(interpreter, value); lua_settable(interpreter, -3); } template
inline object rawget(ValueWrapper const& table, K const& key) { lua_State* interpreter = value_wrapper_traits
::interpreter( table ); value_wrapper_traits
::unwrap(interpreter, table); detail::stack_pop pop(interpreter, 2); detail::push(interpreter, key); lua_rawget(interpreter, -2); return object(from_stack(interpreter, -1)); } template
inline void rawset(ValueWrapper const& table, K const& key, T const& value) { lua_State* interpreter = value_wrapper_traits
::interpreter( table ); // TODO: Exception safe? value_wrapper_traits
::unwrap(interpreter, table); detail::stack_pop pop(interpreter, 1); detail::push(interpreter, key); detail::push(interpreter, value); lua_rawset(interpreter, -3); } template
inline int type(ValueWrapper const& value) { lua_State* interpreter = value_wrapper_traits
::interpreter( value ); value_wrapper_traits
::unwrap(interpreter, value); detail::stack_pop pop(interpreter, 1); return lua_type(interpreter, -1); } } // namespace luabind #endif // LUABIND_OBJECT_050419_HPP
object.hpp
Dirección de la página
Dirección del archivo
Anterior
20/31
Siguiente
Descargar
( 32 KB )
Comments
Total ratings:
0
Average rating:
No clasificado
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.