Re: [luabind] Custom policies [2/2]
Brought to you by:
arvidn,
daniel_wallin
From: Dan P. <dpo...@ar...> - 2008-05-13 16:59:41
|
The only_accepts_values structure was added by me to generate a compile-time error on incorrect use (the other Luabind policies do similar things when they are designed to only take a pointer or reference etc.). Without it, the program would compile if you used a pointer/reference with the policy but Luabind would assert and halt when you tried to use it at run-time. It's a shame the code base is so arcane... I'd love to go and make more sophisticated improvements to it but 90% of the time I don't even know where to begin. :( Dan. From: lua...@li... [mailto:lua...@li...] On Behalf Of Josh Green Sent: Monday, May 12, 2008 5:26 PM To: lua...@li... Subject: Re: [luabind] Custom policies [2/2] Mate, That looks fantastic, awesome work. Sorry I don't have the change to play with the by value/reference stuff.. But I imagine it would either be a template specialisation thing, or you have this type in your conversion policy: struct only_accepts_values {}; I assume that stops Luabind from using the class with references... What happens if you use something else or nothing in it's place? Like I said, awesome work! Josh ________________________________ > Date: Thu, 8 May 2008 16:46:28 -0700 > From: dpo...@ar... > To: lua...@li... > Subject: Re: [luabind] Custom policies [2/2] > > Here's the contents of the new file, cast_policy.hpp: > > #ifndef LUABIND_REINTERPRET_CAST_POLICY_HPP_INCLUDED > #define LUABIND_REINTERPRET_CAST_POLICY_HPP_INCLUDED > > #include <luabind/config.hpp> > #include <luabind/detail/policy.hpp> > > namespace luabind { namespace detail { > > template<class CastFrom, class CastType, class Direction = lua_to_cpp> > struct cast_to > { > template<class T> > T apply(lua_State *L, by_value<T> data, int index) > { > typedef typename find_conversion_policy<1, detail::null_type>::type converter_policy; > typename mpl::apply_wrap2<converter_policy, CastFrom, lua_to_cpp>::type converter; > > return CastType::apply<CastFrom, T>(converter.apply(L, LUABIND_DECORATE_TYPE(CastFrom), index)); > } > > template<class T> > static int match(lua_State* L, by_value<T>, int index) > { > typedef typename find_conversion_policy<1, detail::null_type>::type converter_policy; > typename mpl::apply_wrap2<converter_policy, CastFrom, lua_to_cpp>::type converter; > > return converter.match(L, LUABIND_DECORATE_TYPE(CastFrom), index); > } > > template<class T> > void converter_postcall(lua_State*, T, int) {} > }; > > template<int N, class CastFrom, class CastType> > struct cast_policy : conversion_policy<N> > { > struct only_accepts_values {}; > struct only_converts_from_lua_to_cpp {}; > > static void precall(lua_State*, const index_map&) {} > static void postcall(lua_State*, const index_map&) {} > > template<class T, class Direction> > struct apply > { > //typedef reinterpret_cast_to<CastFrom, Direction> type; > > typedef typename boost::mpl::if_<boost::is_same<Direction, lua_to_cpp> > , typename boost::mpl::if_<boost::is_pointer<T> > , only_accepts_values > , typename boost::mpl::if_<boost::is_reference<T> > , only_accepts_values > , cast_to<CastFrom, CastType, Direction> >::type>::type > , only_converts_from_lua_to_cpp>::type type; > }; > }; > }} > > namespace luabind > { > struct raw_c > { > template<class From, class To> > static To apply(From data) > { > return (To)data; > } > }; > > struct static_c > { > template<class From, class To> > static To apply(From data) > { > return static_cast<To>(data); > } > }; > > struct dynamic_c > { > template<class From, class To> > static To apply(From data) > { > return dynamic_cast<To>(data); > } > }; > > struct reinterpret_c > { > template<class From, class To> > static To apply(From data) > { > return reinterpret_cast<To>(data); > } > }; > > template<class CastFrom, class CastType, int N> > detail::policy_cons<detail::cast_policy<N, CastFrom, CastType>, detail::null_type> > cast(LUABIND_PLACEHOLDER_ARG(N)) > { > return detail::policy_cons<detail::cast_policy<N, CastFrom, CastType>, detail::null_type>(); > } > } > > #endif // LUABIND_REINTERPRET_CAST_POLICY_HPP_INCLUDED > > > Any comments/questions, let me know! > > Dan. > > ------------------------------------------------------------------------ - > This SF.net email is sponsored by the 2008 JavaOne(SM) Conference > Don't miss this year's exciting event. There's still time to save $100. > Use priority code J8TL2D2. > http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/j avaone > _______________________________________________ > luabind-user mailing list > lua...@li... > https://lists.sourceforge.net/lists/listinfo/luabind-user ________________________________ Hotmail on your mobile. Never miss another e-mail with <http://www.livelife.ninemsn.com.au/article.aspx?id=343869> |