| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- // Copyright Daniel Wallin 2008. Use, modification and distribution is
- // subject to the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #ifndef LUABIND_FORMAT_SIGNATURE_081014_HPP
- # define LUABIND_FORMAT_SIGNATURE_081014_HPP
- # include <luabind/config.hpp>
- # include <luabind/lua_include.hpp>
- # include <luabind/typeid.hpp>
- # include <boost/mpl/begin_end.hpp>
- # include <boost/mpl/next.hpp>
- # include <boost/mpl/size.hpp>
- namespace luabind { namespace adl
- {
- class object;
- class argument;
- template <class Base>
- struct table;
- } // namespace adl
- using adl::object;
- using adl::argument;
- using adl::table;
- } // namespace luabind
- namespace luabind { namespace detail {
- LUABIND_API std::string get_class_name(lua_State* L, type_id const& i);
- template <class T>
- struct type_to_string
- {
- static void get(lua_State* L)
- {
- lua_pushstring(L, get_class_name(L, typeid(T)).c_str());
- }
- };
- template <class T>
- struct type_to_string<T*>
- {
- static void get(lua_State* L)
- {
- type_to_string<T>::get(L);
- lua_pushstring(L, "*");
- lua_concat(L, 2);
- }
- };
- template <class T>
- struct type_to_string<T&>
- {
- static void get(lua_State* L)
- {
- type_to_string<T>::get(L);
- lua_pushstring(L, "&");
- lua_concat(L, 2);
- }
- };
- template <class T>
- struct type_to_string<T const>
- {
- static void get(lua_State* L)
- {
- type_to_string<T>::get(L);
- lua_pushstring(L, " const");
- lua_concat(L, 2);
- }
- };
- # define LUABIND_TYPE_TO_STRING(x) \
- template <> \
- struct type_to_string<x> \
- { \
- static void get(lua_State* L) \
- { \
- lua_pushstring(L, #x); \
- } \
- };
- # define LUABIND_INTEGRAL_TYPE_TO_STRING(x) \
- LUABIND_TYPE_TO_STRING(x) \
- LUABIND_TYPE_TO_STRING(unsigned x)
- LUABIND_INTEGRAL_TYPE_TO_STRING(char)
- LUABIND_INTEGRAL_TYPE_TO_STRING(short)
- LUABIND_INTEGRAL_TYPE_TO_STRING(int)
- LUABIND_INTEGRAL_TYPE_TO_STRING(long)
- LUABIND_TYPE_TO_STRING(void)
- LUABIND_TYPE_TO_STRING(bool)
- LUABIND_TYPE_TO_STRING(std::string)
- LUABIND_TYPE_TO_STRING(lua_State)
- LUABIND_TYPE_TO_STRING(luabind::object)
- LUABIND_TYPE_TO_STRING(luabind::argument)
- # undef LUABIND_INTEGRAL_TYPE_TO_STRING
- # undef LUABIND_TYPE_TO_STRING
- template <class Base>
- struct type_to_string<table<Base> >
- {
- static void get(lua_State* L)
- {
- lua_pushstring(L, "table");
- }
- };
- # ifndef LUABIND_CPP0x
- template <class End>
- void format_signature_aux(lua_State*, bool, End, End)
- {}
- template <class Iter, class End>
- void format_signature_aux(lua_State* L, bool first, Iter, End end)
- {
- if (!first)
- lua_pushstring(L, ",");
- type_to_string<typename Iter::type>::get(L);
- format_signature_aux(L, false, typename mpl::next<Iter>::type(), end);
- }
- template <class Signature>
- void format_signature(lua_State* L, char const* function, Signature)
- {
- typedef typename mpl::begin<Signature>::type first;
- type_to_string<typename first::type>::get(L);
- lua_pushstring(L, " ");
- lua_pushstring(L, function);
- lua_pushstring(L, "(");
- format_signature_aux(
- L
- , true
- , typename mpl::next<first>::type()
- , typename mpl::end<Signature>::type()
- );
- lua_pushstring(L, ")");
- lua_concat(L, static_cast<int>(mpl::size<Signature>()) * 2 + 2);
- }
- # else // LUABIND_CPP0x
- inline void format_signature_aux(lua_State*, vector<>, bool)
- {}
- template <class T, class... Args>
- void format_signature_aux(lua_State* L, vector<T, Args...>, bool first = true)
- {
- if (!first)
- lua_pushstring(L, ",");
- type_to_string<T>::get(L);
- format_signature_aux(L, vector<Args...>(), false);
- }
- template <class R, class... Args>
- void format_signature(lua_State* L, char const* function, vector<R, Args...>)
- {
- type_to_string<R>::get(L);
- lua_pushstring(L, " ");
- lua_pushstring(L, function);
- lua_pushstring(L, "(");
- format_signature_aux(L, vector<R, Args...>());
- lua_pushstring(L, ")");
- lua_concat(L, (sizeof...(Args) + 1) * 2 + 2);
- }
- # endif // LUABIND_CPP0x
- }} // namespace luabind::detail
- #endif // LUABIND_FORMAT_SIGNATURE_081014_HPP
|