Update of /cvsroot/luabind/luabind/luabind/luabind/detail
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29680/luabind/detail
Modified Files:
Tag: beta7-devel2
policy.hpp property.hpp
Log Message:
def_readwrite and def_readonly will now return references if the bound memeber type is not a primitive type
Index: property.hpp
===================================================================
RCS file: /cvsroot/luabind/luabind/luabind/luabind/detail/property.hpp,v
retrieving revision 1.11
retrieving revision 1.11.2.1
diff -u -d -r1.11 -r1.11.2.1
--- property.hpp 7 Aug 2004 13:37:10 -0000 1.11
+++ property.hpp 24 Oct 2005 09:44:00 -0000 1.11.2.1
@@ -25,6 +25,8 @@
#define LUABIND_PROPERTY_HPP_INCLUDED
#include <luabind/config.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/mpl/eval_if.hpp>
namespace luabind { namespace detail
{
@@ -126,7 +128,6 @@
return set_matcher<Param, Policy>::apply;
}
- // TODO: add support for policies
template<class T, class D, class Policies>
struct auto_set : Policies
{
@@ -167,7 +168,15 @@
}
};
- // TODO: add support for policies
+ // if the input type is a value_converter, it will produce
+ // a reference converter
+ template<class ConverterPolicy, class D>
+ struct make_reference_converter
+ {
+ typedef typename ConverterPolicy::template generate_converter<
+ typename boost::add_reference<D>::type, cpp_to_lua>::type type;
+ };
+
template<class T, class D, class Policies>
struct auto_get : Policies
{
@@ -194,7 +203,16 @@
T* ptr = reinterpret_cast<T*>(static_cast<char*>(raw_ptr) + pointer_offset);
typedef typename find_conversion_policy<0,Policies>::type converter_policy;
- typename converter_policy::template generate_converter<D,cpp_to_lua>::type converter;
+ typedef typename converter_policy::template generate_converter<D,cpp_to_lua>::type converter1_t;
+ typedef typename boost::mpl::eval_if<
+ typename converter1_t::is_value_converter
+ , make_reference_converter<converter_policy, D>
+ , converter1_t>::type converter2_t;
+
+ // TODO: If this yields a reference converter, return_internal_reference policy
+ // should be automatically added
+
+ converter2_t converter;
converter.apply(L, ptr->*member);
int nret = lua_gettop(L) - nargs;
Index: policy.hpp
===================================================================
RCS file: /cvsroot/luabind/luabind/luabind/luabind/detail/policy.hpp,v
retrieving revision 1.50.2.7
retrieving revision 1.50.2.8
diff -u -d -r1.50.2.7 -r1.50.2.8
--- policy.hpp 23 Oct 2005 21:37:16 -0000 1.50.2.7
+++ policy.hpp 24 Oct 2005 09:44:00 -0000 1.50.2.8
@@ -262,6 +262,7 @@
template<>
struct primitive_converter<cpp_to_lua>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef primitive_converter type;
void apply(lua_State* L, int v) { lua_pushnumber(L, (lua_Number)v); }
@@ -294,6 +295,7 @@
template<>
struct primitive_converter<lua_to_cpp>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef primitive_converter type;
#define PRIMITIVE_CONVERTER(prim) \
@@ -391,6 +393,7 @@
template<>
struct user_defined_converter<lua_to_cpp>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef user_defined_converter type;
template<class T>
@@ -460,6 +463,7 @@
template<>
struct pointer_converter<cpp_to_lua>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef pointer_converter type;
template<class T>
@@ -495,6 +499,7 @@
template<>
struct pointer_converter<lua_to_cpp>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef pointer_converter type;
// TODO: does the pointer converter need this?!
@@ -560,6 +565,7 @@
template<>
struct value_converter<cpp_to_lua>
{
+ typedef boost::mpl::bool_<true> is_value_converter;
typedef value_converter type;
template<class T>
@@ -625,6 +631,7 @@
template<>
struct value_converter<lua_to_cpp>
{
+ typedef boost::mpl::bool_<true> is_value_converter;
typedef value_converter type;
template<class T>
@@ -700,6 +707,7 @@
template<>
struct const_pointer_converter<cpp_to_lua>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef const_pointer_converter type;
template<class T>
@@ -738,6 +746,7 @@
struct const_pointer_converter<lua_to_cpp>
: private pointer_converter<lua_to_cpp>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef const_pointer_converter type;
template<class T>
@@ -777,6 +786,7 @@
template<>
struct ref_converter<cpp_to_lua>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef ref_converter type;
template<class T>
@@ -808,6 +818,7 @@
template<>
struct ref_converter<lua_to_cpp>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef ref_converter type;
template<class T>
@@ -835,6 +846,7 @@
template<>
struct const_ref_converter<cpp_to_lua>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef const_ref_converter type;
template<class T>
@@ -885,6 +897,7 @@
template<>
struct const_ref_converter<lua_to_cpp>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef const_ref_converter type;
// TODO: align!
@@ -966,6 +979,7 @@
template<class Direction = cpp_to_lua>
struct enum_converter
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef enum_converter type;
void apply(lua_State* L, int val)
@@ -977,6 +991,7 @@
template<>
struct enum_converter<lua_to_cpp>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef enum_converter type;
template<class T>
@@ -1051,6 +1066,7 @@
template<>
struct value_wrapper_converter<lua_to_cpp>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef value_wrapper_converter type;
template<class T>
@@ -1085,6 +1101,7 @@
template<>
struct value_wrapper_converter<cpp_to_lua>
{
+ typedef boost::mpl::bool_<false> is_value_converter;
typedef value_wrapper_converter type;
template<class T>
|