/*******************************************************************
file name : LUA_Util.h
author : Clark/陈泽丹
created : 2013-2-2
purpose : 在不改动原有方式的前提下, 简化Lua与C++互相调用的函数接口
*********************************************************************/
#ifndef __LUAUTIL_H__
#define __LUAUTIL_H__
#define TYPELIST_1(T1) \
Lua_Typelist<T1, Lua_NullType>
#define TYPELIST_2(T1, T2) \
Lua_Typelist<T1, TYPELIST_1(T2) >
#define TYPELIST_3(T1, T2, T3) \
Lua_Typelist<T1, TYPELIST_2(T2, T3) >
#define TYPELIST_4(T1, T2, T3, T4) \
Lua_Typelist<T1, TYPELIST_3(T2, T3, T4) >
#define TYPELIST_5(T1, T2, T3, T4, T5) \
Lua_Typelist<T1, TYPELIST_4(T2, T3, T4, T5) >
#define TYPELIST_6(T1, T2, T3, T4, T5, T6) \
Lua_Typelist<T1, TYPELIST_5(T2, T3, T4, T5, T6) >
#define TYPELIST_7(T1, T2, T3, T4, T5, T6, T7) \
Lua_Typelist<T1, TYPELIST_6(T2, T3, T4, T5, T6, T7) >
#define TYPELIST_8(T1, T2, T3, T4, T5, T6, T7, T8) \
Lua_Typelist<T1, TYPELIST_7(T2, T3, T4, T5, T6, T7, T8) >
//并排参数用
#define GET_TYPELIST_PAR1( Par ) \
Par.head
#define GET_TYPELIST_PAR2( Par ) \
Par.head, GET_TYPELIST_PAR1( Par.tail )
#define GET_TYPELIST_PAR3( Par ) \
Par.head, GET_TYPELIST_PAR2( Par.tail )
#define GET_TYPELIST_PAR4( Par ) \
Par.head, GET_TYPELIST_PAR3( Par.tail )
#define GET_TYPELIST_PAR5( Par ) \
Par.head, GET_TYPELIST_PAR4( Par.tail )
#define GET_TYPELIST_PAR6( Par ) \
Par.head, GET_TYPELIST_PAR5( Par.tail )
#define GET_TYPELIST_PAR7( Par ) \
Par.head, GET_TYPELIST_PAR6( Par.tail )
#define GET_TYPELIST_PAR8( Par ) \
Par.head, GET_TYPELIST_PAR7( Par.tail )
struct Lua_RunFun
{
template<class _Ret, int>
struct RunFun
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
g_pTrace->TraceErrorLn("执行LUA时, 调用API找不到相应的适配函数");
}
};
template<>
struct RunFun<void, 1>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_fun( GET_TYPELIST_PAR1(par) );
}
};
template<>
struct RunFun<void, 2>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_fun( GET_TYPELIST_PAR2(par) );
}
};
template<>
struct RunFun<void, 3>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_fun( GET_TYPELIST_PAR3(par) );
}
};
template<>
struct RunFun<void, 4>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_fun( GET_TYPELIST_PAR4(par) );
}
};
template<>
struct RunFun<void, 5>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_fun( GET_TYPELIST_PAR5(par) );
}
};
template<>
struct RunFun<void, 6>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_fun( GET_TYPELIST_PAR6(par) );
}
};
template<>
struct RunFun<void, 7>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_fun( GET_TYPELIST_PAR7(par) );
}
};
template<>
struct RunFun<void, 8>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_fun( GET_TYPELIST_PAR8(par) );
}
};
//------------------------------
template< class _R >
struct RunFun<_R, 1>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_R _r = _fun( GET_TYPELIST_PAR1(par) );
Lua_SetPar(_r, _tolua_S);
}
};
template< class _R >
struct RunFun<_R, 2>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_R _r = _fun( GET_TYPELIST_PAR2(par) );
Lua_SetPar(_r, _tolua_S);
}
};
template< class _R >
struct RunFun<_R, 3>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_R _r = _fun( GET_TYPELIST_PAR3(par) );
Lua_SetPar(_r, _tolua_S);
}
};
template< class _R >
struct RunFun<_R, 4>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_R _r = _fun( GET_TYPELIST_PAR4(par) );
Lua_SetPar(_r, _tolua_S);
}
};
template< class _R >
struct RunFun<_R, 5>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_R _r = _fun( GET_TYPELIST_PAR5(par) );
Lua_SetPar(_r, _tolua_S);
}
};
template< class _R >
struct RunFun<_R, 6>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_R _r = _fun( GET_TYPELIST_PAR6(par) );
Lua_SetPar(_r, _tolua_S);
}
};
template< class _R >
struct RunFun<_R, 7>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_R _r = _fun( GET_TYPELIST_PAR7(par) );
Lua_SetPar(_r, _tolua_S);
}
};
template< class _R >
struct RunFun<_R, 8>
{
template< class _Fun, class _TL >
void operator()(_Fun _fun, _TL& par, lua_State* _tolua_S)
{
_R _r = _fun( GET_TYPELIST_PAR8(par) );
Lua_SetPar(_r, _tolua_S);
}
};
};
#endif // __LUAUTIL_H__
/*******************************************************************
file name : LUA_And_C.h
author : Clark/陈泽丹
created : 2013-2-2
purpose : 在不改动原有方式的前提下, 简化Lua与C++互相调用的函数接口
*********************************************************************/
#ifndef __LUA_AND_C_H__
#define __LUA_AND_C_H__
#include "LUA_Util.h"
#ifndef __cplusplus
#include "stdlib.h"
#endif
#include "string.h"
#include "tolua++.h"
//-----------------------------------------------------------
template< class _Type >
struct Lua_IsType
{
// 获得Lua传出来的参数
bool operator()(lua_State* _tolua_S, int _lo, tolua_Error& _tolua_err){ return false; }
};
template<>
struct Lua_IsType<char*>
{
// 获得Lua传出来的参数
bool operator()(lua_State* _tolua_S, int _lo, tolua_Error& _tolua_err)
{
return tolua_isstring(_tolua_S, _lo, 0, &_tolua_err);
}
};
template<>
struct Lua_IsType<long>
{
// 获得Lua传出来的参数
bool operator()(lua_State* _tolua_S, int _lo, tolua_Error& _tolua_err)
{
return tolua_isnumber(_tolua_S, _lo, 0, &_tolua_err);
}
};
template<>
struct Lua_IsType<bool>
{
// 获得Lua传出来的参数
bool operator()(lua_State* _tolua_S, int _lo, tolua_Error& _tolua_err)
{
return tolua_isboolean(_tolua_S, _lo, 0, &_tolua_err);
}
};
//-------------------------------
// 获得Lua传出来的参数
template< class _Type >
bool Lua_GetPar(_Type*& _val, lua_State* _tolua_S, int _lo)
{
return false;
}
// 获得Lua传出来的参数
bool Lua_GetPar(char*& _val, lua_State* _tolua_S, int _lo)
{
_val = ((char*) tolua_tostring(_tolua_S,_lo,0));
return true;
}
// 获得Lua传出来的参数
bool Lua_GetPar(long& _val, lua_State* _tolua_S, int _lo)
{
_val = ((long) tolua_tonumber(_tolua_S,_lo,0));
return true;
}
// 获得Lua传出来的参数
bool Lua_GetPar(bool& _val, lua_State* _tolua_S, int _lo)
{
_val = ((bool) tolua_toboolean(_tolua_S, _lo, 0));
return true;
}
//-------------------------------
// 传进Lua的参数
template< class _Type >
bool Lua_SetPar(_Type*& _val, lua_State* _tolua_S)
{
return false;
}
// 获得Lua传出来的参数
bool Lua_SetPar(char*& _val, lua_State* _tolua_S)
{
tolua_pushstring(_tolua_S, _val);
return true;
}
// 获得Lua传出来的参数
bool Lua_SetPar(long& _val, lua_State* _tolua_S)
{
tolua_pushnumber(_tolua_S, _val);
return true;
}
// 获得Lua传出来的参数
bool Lua_SetPar(bool& _val, lua_State* _tolua_S)
{
tolua_pushboolean(_tolua_S, _val);
return true;
}
//--------------------------------------------------
struct Lua_NullType{};
template <class T, class U>
struct Lua_Typelist
{
typedef T Head;
typedef U Tail;
Head head;
Tail tail;
};
//获得相关参数
template< class TList >
struct Lua_GetLength
{
enum { Ret = 1 + Lua_GetLength< TList::Tail >::Ret };
};
template<>
struct Lua_GetLength<Lua_NullType>
{
enum { Ret = 0 };
};
//-------------------------------
template< class Ret, class _TypeList >
class API_Fun
{
public:
template< class _Fun >
int operator()(lua_State* _tolua_S, _Fun _fun, const char* _error_txt)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if( !checkPar<_TypeList>()(_tolua_S, 1, tolua_err) )
goto tolua_lerror;
#endif
try
{
getPar<_TypeList>()(_m_data, _tolua_S, 1);
Lua_RunFun::RunFun< Ret, Lua_GetLength<_TypeList>::Ret > runfun;
runfun(_fun, _m_data, _tolua_S);
}
catch (...)
{
g_pTrace->TraceErrorLn(_error_txt);
throw;
return 1;
}
return 0;
tolua_lerror:
#ifndef TOLUA_RELEASE
tolua_error(_tolua_S, _error_txt, &tolua_err);
return 0;
#endif
}
private:
//检查类型是否正确
template< class _TL >
struct checkPar
{
bool operator()(lua_State* _tolua_S, int _lo, tolua_Error& _tolua_err)
{
if( Lua_IsType<_TL::Head>()(_tolua_S, _lo, _tolua_err) )
return checkPar<_TL::Tail>()(_tolua_S, _lo+1, _tolua_err);
return false;
}
};
template<>
struct checkPar<Lua_NullType>
{
bool operator()(lua_State* _tolua_S, int _lo, tolua_Error& _tolua_err)
{
return tolua_isnoobj(_tolua_S, _lo, &_tolua_err);
}
};
//获得相关参数
template< class _TL >
struct getPar
{
bool operator()(_TL& par, lua_State* _tolua_S, int _lo)
{
if( Lua_GetPar(par.head, _tolua_S, _lo) )
return getPar<_TL::Tail>()(par.tail, _tolua_S, _lo+1);
return false;
}
};
template<>
struct getPar<Lua_NullType>
{
bool operator()(Lua_NullType& par, lua_State* _tolua_S, int _lo)
{
return true;
}
};
private:
_TypeList _m_data;
};
#endif // __LUA_AND_C_H__