From e0aca030c0ea0e129eefaccc036d5b727beadb57 Mon Sep 17 00:00:00 2001 From: Evan Wies Date: Tue, 24 Nov 2009 11:44:35 +0100 Subject: [PATCH] Add Lua function class_names() giving a list of registered types. --- luabind/class_info.hpp | 3 +++ luabind/detail/class_registry.hpp | 5 +++++ src/class_info.cpp | 22 +++++++++++++++++++++- test/test_class_info.cpp | 5 +++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/luabind/class_info.hpp b/luabind/class_info.hpp index a9b966e..a4f18a8 100755 --- a/luabind/class_info.hpp +++ b/luabind/class_info.hpp @@ -40,6 +40,9 @@ namespace luabind LUABIND_API class_info get_class_info(argument const&); + // returns a table of bound class names + LUABIND_API object get_class_names(lua_State* L); + LUABIND_API void bind_class_info(lua_State*); } diff --git a/luabind/detail/class_registry.hpp b/luabind/detail/class_registry.hpp index 4d7740d..12ed03c 100644 --- a/luabind/detail/class_registry.hpp +++ b/luabind/detail/class_registry.hpp @@ -51,6 +51,11 @@ namespace luabind { namespace detail class_rep* find_class(type_id const& info) const; + std::map const& get_classes() const + { + return m_classes; + } + private: std::map m_classes; diff --git a/src/class_info.cpp b/src/class_info.cpp index 57b5260..d5d4ce8 100755 --- a/src/class_info.cpp +++ b/src/class_info.cpp @@ -26,6 +26,7 @@ #include #include +#include namespace luabind { @@ -84,6 +85,24 @@ namespace luabind return result; } + LUABIND_API object get_class_names(lua_State* L) + { + detail::class_registry* reg = detail::class_registry::get_registry(L); + + std::map const& classes = reg->get_classes(); + + object result = newtable(L); + std::size_t index = 1; + + for (std::map::const_iterator iter = classes.begin(); + iter != classes.end(); ++iter) + { + result[index++] = iter->second->name(); + } + + return result; + } + LUABIND_API void bind_class_info(lua_State* L) { module(L) @@ -93,7 +112,8 @@ namespace luabind .def_readonly("methods", &class_info::methods) .def_readonly("attributes", &class_info::attributes), - def("class_info", &get_class_info) + def("class_info", &get_class_info), + def("class_names", &get_class_names) ]; } } diff --git a/test/test_class_info.cpp b/test/test_class_info.cpp index 4356948..81c133e 100644 --- a/test/test_class_info.cpp +++ b/test/test_class_info.cpp @@ -37,5 +37,10 @@ void test_main(lua_State* L) "assert(info.methods['__init'] == x.__init)\n" "assert(info.attributes[1] == 'y')\n" "assert(info.attributes[2] == 'x')\n" + "names = class_names()\n" + "assert(type(names) == 'table')\n" + "assert(#names == 2)\n" + "assert(names[1] == 'X' or names[2] == 'X')\n" + "assert(names[1] == 'class_info_data' or names[2] == 'class_info_data')\n" ); } -- 2.11.4.GIT