Changeset 348


Ignore:
Timestamp:
01/03/15 23:23:41 (10 years ago)
Author:
epyon
Message:
  • added support for dispatch of const member function (duh, shouldn't this be easier?)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/lua/lua_dispatch.hh

    r345 r348  
    4141                                }
    4242                                template <class C, typename... Args, typename... Vs>
    43                                 static void do_call(lua_State* L, C& c, R(C::*func)(Args...), Vs&&... vs)
     43                                static void do_call(lua_State* L, C* c, R(C::*func)(Args...), Vs&&... vs)
    4444                                {
    45                                         push_value(L, (c.*func)(std::forward<Vs>(vs)...));
     45                                        push_value(L, (*c.*func)(std::forward<Vs>(vs)...));
     46                                }
     47                                template <class C, typename... Args, typename... Vs>
     48                                static void do_call( lua_State* L, C const * c, R( C::*func )( Args... ) const, Vs&&... vs )
     49                                {
     50                                        push_value( L, ( *c.*func )( std::forward<Vs>( vs )... ) );
    4651                                }
    4752                        };
     
    5661                                }
    5762                                template <class C, typename... Args, typename... Vs>
    58                                 static void do_call(lua_State*, C& c, void(C::*func)(Args...), Vs&&... vs)
     63                                static void do_call(lua_State*, C* c, void(C::*func)(Args...), Vs&&... vs)
    5964                                {
    60                                         (c.*func)(std::forward<Vs>(vs)...);
     65                                        (*c.*func)(std::forward<Vs>(vs)...);
     66                                }
     67                                template <class C, typename... Args, typename... Vs>
     68                                static void do_call( lua_State*, C const * c, void( C::*func )( Args... ) const, Vs&&... vs )
     69                                {
     70                                        ( *c.*func )( std::forward<Vs>( vs )... );
    6171                                }
    6272                        };
     
    6979
    7080                        template <typename R, class C, typename... Args, typename Head, typename ...Tail, typename... Vs>
    71                         int do_call(lua_State* L, int index, C& c, R(C::*func)(Args...), types<Head, Tail...>, Vs&&... vs)
     81                        int do_call(lua_State* L, int index, C* c, R(C::*func)(Args...), types<Head, Tail...>, Vs&&... vs)
    7282                        {
    7383                                do_call(L, index + 1, c, func, types < Tail... > {}, std::forward<Vs>(vs)..., get_value<Head>(L, index)); return 1;
     84                        }
     85
     86                        template <typename R, class C, typename... Args, typename Head, typename ...Tail, typename... Vs>
     87                        int do_call( lua_State* L, int index, C const * c, R( C::*func )( Args... ) const, types<Head, Tail...>, Vs&&... vs )
     88                        {
     89                                do_call( L, index + 1, c, func, types < Tail... > {}, std::forward<Vs>( vs )..., get_value<Head>( L, index ) ); return 1;
    7490                        }
    7591
     
    8298
    8399                        template <typename R, class C, typename... Args, typename... Vs>
    84                         int do_call(lua_State* L, int, C& c, R(C::*func)(Args...), types<>, Vs&&... vs)
     100                        int do_call(lua_State* L, int, C* c, R(C::*func)(Args...), types<>, Vs&&... vs)
    85101                        {
    86102                                call_and_push<R>::do_call(L, c, func, std::forward<Vs>(vs)...);
     103                                return 1;
     104                        }
     105
     106                        template <typename R, class C, typename... Args, typename... Vs>
     107                        int do_call( lua_State* L, int, C const * c, R( C::*func )( Args... ) const, types<>, Vs&&... vs )
     108                        {
     109                                call_and_push<R>::do_call( L, c, func, std::forward<Vs>( vs )... );
    87110                                return 1;
    88111                        }
     
    95118                        }
    96119                        template < typename R, class C, typename... Args >
    97                         int dispatch(lua_State* L, int index, C& c, R(C::*func)(Args...))
     120                        int dispatch(lua_State* L, int index, C* c, R( C::*func )( Args... ) )
    98121                        {
    99122                                do_call(L, index, c, func, types < Args... > {});
    100123                                return 1;
    101124                        }
     125                        template < typename R, class C, typename... Args >
     126                        int dispatch( lua_State* L, int index, C const * c, R( C::*func )( Args... ) const )
     127                        {
     128                                do_call( L, index, c, func, types < Args... > {} );
     129                                return 1;
     130                        }
     131
    102132
    103133                        template < typename F, F f >
     
    111141                        {
    112142                                C* c = (C*)to_ref_object( L, 1 );
    113                                 return dispatch( L, 2, *c, f );
     143                                return dispatch( L, 2, c, f );
    114144                        }
    115145
     
    118148                        {
    119149                                C* c = (C*)to_pointer( L, nv::lua::detail::upvalue_index(1) );
    120                                 return dispatch( L, 1, *c, f );
     150                                return dispatch( L, 1, c, f );
    121151                        }
    122152                       
Note: See TracChangeset for help on using the changeset viewer.