1 //------------------------------------------------------------------------------
3 https://github.com/vinniefalco/LuaBridge
5 Copyright 2016, Robin Gareus <robin@gareus.org>
6 Copyright 2012, Vinnie Falco <vinnie.falco@gmail.com>
7 Copyright 2007, Nathan Reed
9 License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
11 Permission is hereby granted, free of charge, to any person obtaining a copy
12 of this software and associated documentation files (the "Software"), to deal
13 in the Software without restriction, including without limitation the rights
14 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 copies of the Software, and to permit persons to whom the Software is
16 furnished to do so, subject to the following conditions:
18 The above copyright notice and this permission notice shall be included in all
19 copies or substantial portions of the Software.
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 //==============================================================================
35 #include <type_traits>
42 std::string type_name()
44 typedef typename std::remove_reference<T>::type TR;
45 std::unique_ptr<char, void(*)(void*)> own
47 abi::__cxa_demangle(typeid(TR).name(), nullptr,
51 std::string r = own != nullptr ? own.get() : typeid(TR).name();
52 if (std::is_const<TR>::value)
54 if (std::is_volatile<TR>::value)
56 if (std::is_lvalue_reference<T>::value)
58 else if (std::is_rvalue_reference<T>::value)
65 #ifdef LUADOCOUT // lua
67 #define KEYEND "\"] = "
70 #define KEYEND "\" : "
73 #define CLASSDOC(TYPE, LUANAME, DECL, PARENTDECL) \
74 if (LuaBindingDoc::printBindings ()) { \
75 std::cout << "{ " << KEYSTA << "type" << KEYEND << " \"" << TYPE << "\",\n"; \
76 std::cout << " " << KEYSTA << "lua" << KEYEND << " \"" << LUANAME << "\",\n"; \
77 std::cout << " " << KEYSTA << "decl" << KEYEND << " \"" << DECL << "\",\n"; \
78 std::cout << " " << KEYSTA << "parent" << KEYEND << "\"" << PARENTDECL << "\"\n"; \
79 std::cout << "},\n"; \
82 #define PRINTDOC(TYPE, LUANAME, RETVAL, DECL) \
83 if (LuaBindingDoc::printBindings ()) { \
84 std::cout << "{ " << KEYSTA << "type" << KEYEND << " \"" << TYPE << "\",\n"; \
85 std::cout << " " << KEYSTA << "lua" << KEYEND << " \"" << LUANAME << "\",\n"; \
86 if (!(RETVAL).empty()) { \
87 std::cout << " " << KEYSTA << "ret" << KEYEND << " \"" << (RETVAL) << "\",\n"; \
89 std::cout << " " << KEYSTA << "decl" << KEYEND << " \"" << DECL << "\"\n"; \
90 std::cout << "},\n"; \
93 #define FUNDOC(TYPE, NAME, FUNCTOR) \
94 PRINTDOC(TYPE, _name << NAME, \
95 type_name< typename FuncTraits <FUNCTOR>::ReturnType >(), \
96 type_name< typename FuncTraits <FUNCTOR>::DeclType >())
98 #define DATADOC(TYPE, NAME, FUNCTOR) \
99 PRINTDOC(TYPE, _name << NAME, \
101 type_name< decltype(FUNCTOR) >())\
106 #define CLASSDOC(TYPE, LUANAME, DECL, PARENTDECL)
107 #define PRINTDOC(TYPE, LUANAME, RETVAL, DECL)
108 #define FUNDOC(TYPE, NAME, FUNCTOR)
109 #define DATADOC(TYPE, NAME, FUNCTOR)
113 /** Provides C++ to Lua registration capabilities.
115 This class is not instantiated directly, call `getGlobalNamespace` to start
116 the registration process.
121 Namespace& operator= (Namespace const& other);
124 int mutable m_stackSize;
127 //============================================================================
131 VF: This function looks handy, why aren't we using it?
134 static int luaError (lua_State* L, std::string message)
136 assert (lua_isstring (L, lua_upvalueindex (1)));
139 // Get information on the caller's caller to format the message,
140 // so the error appears to originate from the Lua source.
142 int result = lua_getstack (L, 2, &ar);
145 lua_getinfo (L, "Sl", &ar);
147 if (ar.currentline != -1)
149 // poor mans int to string to avoid <strstrream>.
150 lua_pushnumber (L, ar.currentline);
151 s = s + ":" + lua_tostring (L, -1) + ": ";
158 return luaL_error (L, s.c_str ());
162 //----------------------------------------------------------------------------
166 void pop (int n) const
168 if (m_stackSize >= n && lua_gettop (L) >= n)
175 throw std::logic_error ("invalid stack");
181 Factored base to reduce template instantiations.
186 ClassBase& operator= (ClassBase const& other);
189 friend class Namespace;
192 int mutable m_stackSize;
196 const Namespace* _parent;
200 //--------------------------------------------------------------------------
202 __index metamethod for a class.
204 This implements member functions, data members, and property members.
205 Functions are stored in the metatable and const metatable. Data members
206 and property members are in the __propget table.
208 If the key is not found, the search proceeds up the hierarchy of base
211 static int indexMetaMethod (lua_State* L)
215 assert (lua_isuserdata (L, 1)); // warn on security bypass
216 lua_getmetatable (L, 1); // get metatable for object
219 lua_pushvalue (L, 2); // push key arg2
220 lua_rawget (L, -2); // lookup key in metatable
221 if (lua_iscfunction (L, -1)) // ensure its a cfunction
223 lua_remove (L, -2); // remove metatable
227 else if (lua_isnil (L, -1))
234 throw std::logic_error ("not a cfunction");
237 rawgetfield (L, -1, "__propget"); // get __propget table
238 if (lua_istable (L, -1)) // ensure it is a table
240 lua_pushvalue (L, 2); // push key arg2
241 lua_rawget (L, -2); // lookup key in __propget
242 lua_remove (L, -2); // remove __propget
243 if (lua_iscfunction (L, -1)) // ensure its a cfunction
245 lua_remove (L, -2); // remove metatable
246 lua_pushvalue (L, 1); // push class arg1
251 else if (lua_isnil (L, -1))
259 // We only put cfunctions into __propget.
260 throw std::logic_error ("not a cfunction");
267 // __propget is missing, or not a table.
268 throw std::logic_error ("missing __propget table");
271 // Repeat the lookup in the __parent metafield,
272 // or return nil if the field doesn't exist.
273 rawgetfield (L, -1, "__parent");
274 if (lua_istable (L, -1))
276 // Remove metatable and repeat the search in __parent.
279 else if (lua_isnil (L, -1))
288 throw std::logic_error ("__parent is not a table");
295 //--------------------------------------------------------------------------
297 __newindex metamethod for classes.
299 This supports writable variables and properties on class objects. The
300 corresponding object is passed in the first parameter to the set function.
302 static int newindexMetaMethod (lua_State* L)
306 lua_getmetatable (L, 1);
311 rawgetfield (L, -1, "__propset");
312 if (!lua_isnil (L, -1))
314 lua_pushvalue (L, 2);
316 if (!lua_isnil (L, -1))
318 // found it, call the setFunction.
319 assert (lua_isfunction (L, -1));
320 lua_pushvalue (L, 1);
321 lua_pushvalue (L, 3);
330 // Repeat the lookup in the __parent metafield.
331 rawgetfield (L, -1, "__parent");
332 if (lua_isnil (L, -1))
334 // Either the property or __parent must exist.
335 result = luaL_error (L,
336 "no member named '%s'", lua_tostring (L, 2));
344 //--------------------------------------------------------------------------
346 Create the const table.
348 void createConstTable (char const* name)
351 lua_pushvalue (L, -1);
352 lua_setmetatable (L, -2);
353 lua_pushboolean (L, 1);
354 lua_rawsetp (L, -2, getIdentityKey ());
355 lua_pushstring (L, (std::string ("const ") + name).c_str ());
356 rawsetfield (L, -2, "__type");
357 lua_pushcfunction (L, &indexMetaMethod);
358 rawsetfield (L, -2, "__index");
359 lua_pushcfunction (L, &newindexMetaMethod);
360 rawsetfield (L, -2, "__newindex");
362 rawsetfield (L, -2, "__propget");
364 if (Security::hideMetatables ())
367 rawsetfield (L, -2, "__metatable");
371 //--------------------------------------------------------------------------
373 Create the class table.
375 The Lua stack should have the const table on top.
377 void createClassTable (char const* name)
380 lua_pushvalue (L, -1);
381 lua_setmetatable (L, -2);
382 lua_pushboolean (L, 1);
383 lua_rawsetp (L, -2, getIdentityKey ());
384 lua_pushstring (L, name);
385 rawsetfield (L, -2, "__type");
386 lua_pushcfunction (L, &indexMetaMethod);
387 rawsetfield (L, -2, "__index");
388 lua_pushcfunction (L, &newindexMetaMethod);
389 rawsetfield (L, -2, "__newindex");
391 rawsetfield (L, -2, "__propget");
393 rawsetfield (L, -2, "__propset");
395 lua_pushvalue (L, -2);
396 rawsetfield (L, -2, "__const"); // point to const table
398 lua_pushvalue (L, -1);
399 rawsetfield (L, -3, "__class"); // point const table to class table
401 if (Security::hideMetatables ())
404 rawsetfield (L, -2, "__metatable");
408 //--------------------------------------------------------------------------
410 Create the static table.
412 The Lua stack should have:
415 -3 enclosing namespace
417 void createStaticTable (char const* name)
421 lua_pushvalue (L, -1);
422 lua_setmetatable (L, -3);
424 rawsetfield (L, -5, name);
427 lua_pushlightuserdata (L, this);
428 lua_pushcclosure (L, &tostringMetaMethod, 1);
429 rawsetfield (L, -2, "__tostring");
431 lua_pushcfunction (L, &CFunc::indexMetaMethod);
432 rawsetfield (L, -2, "__index");
433 lua_pushcfunction (L, &CFunc::newindexMetaMethod);
434 rawsetfield (L, -2, "__newindex");
436 rawsetfield (L, -2, "__propget");
438 rawsetfield (L, -2, "__propset");
440 lua_pushvalue (L, -2);
441 rawsetfield (L, -2, "__class"); // point to class table
443 if (Security::hideMetatables ())
446 rawsetfield (L, -2, "__metatable");
450 //==========================================================================
452 lua_CFunction to construct a class object wrapped in a container.
454 template <class Params, class C>
455 static int ctorContainerProxy (lua_State* L)
457 typedef typename ContainerTraits <C>::Type T;
458 ArgList <Params, 2> args (L);
459 T* const p = Constructor <T, Params>::call (args);
460 UserdataSharedHelper <C, false>::push (L, p);
464 //--------------------------------------------------------------------------
466 lua_CFunction to construct a class object in-place in the userdata.
468 template <class Params, class T>
469 static int ctorPlacementProxy (lua_State* L)
471 ArgList <Params, 2> args (L);
472 Constructor <T, Params>::call (UserdataValue <T>::place (L), args);
476 //--------------------------------------------------------------------------
480 void pop (int n) const
482 if (m_stackSize >= n && lua_gettop (L) >= n)
489 throw std::logic_error ("invalid stack");
494 //--------------------------------------------------------------------------
495 explicit ClassBase (lua_State* L_)
501 //--------------------------------------------------------------------------
505 ClassBase (ClassBase const& other)
509 , _name (other._name)
510 , _parent (other._parent)
513 m_stackSize = other.m_stackSize;
514 other.m_stackSize = 0;
523 //============================================================================
527 //============================================================================
529 Provides a class registration in a lua_State.
531 After contstruction the Lua stack holds these objects:
535 -4 (enclosing namespace)
538 class Class : virtual public ClassBase
541 //==========================================================================
543 Register a new class or add to an existing class registration.
545 Class (char const* name, Namespace const* parent) : ClassBase (parent->L)
549 _name = parent->_name + name + ":";
551 PRINTDOC ("[C] Class", parent->_name << name, std::string(), type_name <T>())
552 m_stackSize = parent->m_stackSize + 3;
553 parent->m_stackSize = 0;
555 assert (lua_istable (L, -1));
556 rawgetfield (L, -1, name);
558 if (lua_isnil (L, -1))
562 createConstTable (name);
563 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
564 rawsetfield (L, -2, "__gc");
566 createClassTable (name);
567 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
568 rawsetfield (L, -2, "__gc");
570 createStaticTable (name);
572 // Map T back to its tables.
573 lua_pushvalue (L, -1);
574 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
575 lua_pushvalue (L, -2);
576 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
577 lua_pushvalue (L, -3);
578 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
583 lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
584 rawgetfield (L, -1, "__class");
585 rawgetfield (L, -1, "__const");
587 // Reverse the top 3 stack elements
593 //==========================================================================
597 Class (char const* name, Namespace const* parent, void const* const staticKey)
598 : ClassBase (parent->L)
602 _name = parent->_name + name + ":";
604 m_stackSize = parent->m_stackSize + 3;
605 parent->m_stackSize = 0;
607 assert (lua_istable (L, -1));
609 createConstTable (name);
610 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
611 rawsetfield (L, -2, "__gc");
613 createClassTable (name);
614 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
615 rawsetfield (L, -2, "__gc");
617 createStaticTable (name);
619 lua_rawgetp (L, LUA_REGISTRYINDEX, staticKey);
620 assert (lua_istable (L, -1));
621 rawgetfield (L, -1, "__class");
622 assert (lua_istable (L, -1));
623 rawgetfield (L, -1, "__const");
624 assert (lua_istable (L, -1));
626 rawsetfield (L, -6, "__parent");
627 rawsetfield (L, -4, "__parent");
628 rawsetfield (L, -2, "__parent");
630 lua_pushvalue (L, -1);
631 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
632 lua_pushvalue (L, -2);
633 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
634 lua_pushvalue (L, -3);
635 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
638 //--------------------------------------------------------------------------
640 Continue registration in the enclosing namespace.
642 Namespace endClass ()
644 return Namespace (this);
647 //--------------------------------------------------------------------------
649 Add or replace a static data member.
652 Class <T>& addStaticData (char const* name, U* pu, bool isWritable = true)
654 DATADOC ("Static Data Member", name, pu)
655 assert (lua_istable (L, -1));
657 rawgetfield (L, -1, "__propget");
658 assert (lua_istable (L, -1));
659 lua_pushlightuserdata (L, pu);
660 lua_pushcclosure (L, &CFunc::getVariable <U>, 1);
661 rawsetfield (L, -2, name);
664 rawgetfield (L, -1, "__propset");
665 assert (lua_istable (L, -1));
668 lua_pushlightuserdata (L, pu);
669 lua_pushcclosure (L, &CFunc::setVariable <U>, 1);
673 lua_pushstring (L, name);
674 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
676 rawsetfield (L, -2, name);
682 //--------------------------------------------------------------------------
685 Add or replace a static property member.
687 If the set function is null, the property is read-only.
690 Class <T>& addStaticProperty (char const* name, U (*get)(), void (*set)(U) = 0)
692 typedef U (*get_t)();
693 typedef void (*set_t)(U);
695 assert (lua_istable (L, -1));
697 rawgetfield (L, -1, "__propget");
698 assert (lua_istable (L, -1));
699 new (lua_newuserdata (L, sizeof (get))) get_t (get);
700 lua_pushcclosure (L, &CFunc::Call <U (*) (void)>::f, 1);
701 rawsetfield (L, -2, name);
704 rawgetfield (L, -1, "__propset");
705 assert (lua_istable (L, -1));
708 new (lua_newuserdata (L, sizeof (set))) set_t (set);
709 lua_pushcclosure (L, &CFunc::Call <void (*) (U)>::f, 1);
713 lua_pushstring (L, name);
714 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
716 rawsetfield (L, -2, name);
723 //--------------------------------------------------------------------------
725 Add or replace a static member function.
728 Class <T>& addStaticFunction (char const* name, FP const fp)
730 FUNDOC ("Static Member Function", name, FP)
731 new (lua_newuserdata (L, sizeof (fp))) FP (fp);
732 lua_pushcclosure (L, &CFunc::Call <FP>::f, 1);
733 rawsetfield (L, -2, name);
738 //--------------------------------------------------------------------------
740 Add or replace a lua_CFunction.
742 Class <T>& addStaticCFunction (char const* name, int (*const fp)(lua_State*))
744 DATADOC ("Static C Function", name, fp)
745 lua_pushcfunction (L, fp);
746 rawsetfield (L, -2, name);
750 //--------------------------------------------------------------------------
752 Add or replace a data member.
755 Class <T>& addData (char const* name, const U T::* mp, bool isWritable = true)
757 DATADOC ("Data Member", name, mp)
758 typedef const U T::*mp_t;
760 // Add to __propget in class and const tables.
762 rawgetfield (L, -2, "__propget");
763 rawgetfield (L, -4, "__propget");
764 new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
765 lua_pushcclosure (L, &CFunc::getProperty <T,U>, 1);
766 lua_pushvalue (L, -1);
767 rawsetfield (L, -4, name);
768 rawsetfield (L, -2, name);
774 // Add to __propset in class table.
775 rawgetfield (L, -2, "__propset");
776 assert (lua_istable (L, -1));
777 new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
778 lua_pushcclosure (L, &CFunc::setProperty <T,U>, 1);
779 rawsetfield (L, -2, name);
786 //--------------------------------------------------------------------------
788 Add or replace a property member.
790 template <class TG, class TS>
791 Class <T>& addProperty (char const* name, TG (T::* get) () const, bool (T::* set) (TS))
793 DATADOC ("Property", name, get)
794 // Add to __propget in class and const tables.
796 rawgetfield (L, -2, "__propget");
797 rawgetfield (L, -4, "__propget");
798 typedef TG (T::*get_t) () const;
799 new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
800 lua_pushcclosure (L, &CFunc::CallConstMember <get_t>::f, 1);
801 lua_pushvalue (L, -1);
802 rawsetfield (L, -4, name);
803 rawsetfield (L, -2, name);
808 // Add to __propset in class table.
809 rawgetfield (L, -2, "__propset");
810 assert (lua_istable (L, -1));
811 typedef bool (T::* set_t) (TS);
812 new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
813 lua_pushcclosure (L, &CFunc::CallMember <set_t>::f, 1);
814 rawsetfield (L, -2, name);
824 Class <T>& addProperty (char const* name, TG (T::* get) () const)
826 // Add to __propget in class and const tables.
827 rawgetfield (L, -2, "__propget");
828 rawgetfield (L, -4, "__propget");
829 typedef TG (T::*get_t) () const;
830 new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
831 lua_pushcclosure (L, &CFunc::CallConstMember <get_t>::f, 1);
832 lua_pushvalue (L, -1);
833 rawsetfield (L, -4, name);
834 rawsetfield (L, -2, name);
841 //--------------------------------------------------------------------------
843 Add or replace a property member, by proxy.
845 When a class is closed for modification and does not provide (or cannot
846 provide) the function signatures necessary to implement get or set for
847 a property, this will allow non-member functions act as proxies.
849 Both the get and the set functions require a T const* and T* in the first
850 argument respectively.
852 template <class TG, class TS>
853 Class <T>& addProperty (char const* name, TG (*get) (T const*), bool (*set) (T*, TS))
855 // Add to __propget in class and const tables.
857 rawgetfield (L, -2, "__propget");
858 rawgetfield (L, -4, "__propget");
859 typedef TG (*get_t) (T const*);
860 new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
861 lua_pushcclosure (L, &CFunc::Call <get_t>::f, 1);
862 lua_pushvalue (L, -1);
863 rawsetfield (L, -4, name);
864 rawsetfield (L, -2, name);
870 // Add to __propset in class table.
871 rawgetfield (L, -2, "__propset");
872 assert (lua_istable (L, -1));
873 typedef void (*set_t) (T*, TS);
874 new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
875 lua_pushcclosure (L, &CFunc::Call <set_t>::f, 1);
876 rawsetfield (L, -2, name);
885 template <class TG, class TS>
886 Class <T>& addProperty (char const* name, TG (*get) (T const*))
888 // Add to __propget in class and const tables.
889 rawgetfield (L, -2, "__propget");
890 rawgetfield (L, -4, "__propget");
891 typedef TG (*get_t) (T const*);
892 new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
893 lua_pushcclosure (L, &CFunc::Call <get_t>::f, 1);
894 lua_pushvalue (L, -1);
895 rawsetfield (L, -4, name);
896 rawsetfield (L, -2, name);
902 //--------------------------------------------------------------------------
904 Add or replace a member function.
906 template <class MemFn>
907 Class <T>& addFunction (char const* name, MemFn mf)
909 FUNDOC("Member Function", name, MemFn)
910 CFunc::CallMemberFunctionHelper <MemFn, FuncTraits <MemFn>::isConstMemberFunction>::add (L, name, mf);
914 template <class MemFn>
915 Class <T>& addPtrFunction (char const* name, MemFn mf)
917 FUNDOC("Member Pointer Function", name, MemFn)
918 CFunc::CallMemberPtrFunctionHelper <MemFn>::add (L, name, mf);
922 template <class MemFn>
923 Class <T>& addWPtrFunction (char const* name, MemFn mf)
925 FUNDOC("Member Weak Pointer Function", name, MemFn)
926 CFunc::CallMemberWPtrFunctionHelper <MemFn>::add (L, name, mf);
930 template <class MemFn>
931 Class <T>& addRefFunction (char const* name, MemFn mf)
933 FUNDOC("Member Function RefReturn", name, MemFn)
934 CFunc::CallMemberRefFunctionHelper <MemFn, FuncTraits <MemFn>::isConstMemberFunction>::add (L, name, mf);
939 //--------------------------------------------------------------------------
941 Add or replace a member lua_CFunction.
943 Class <T>& addCFunction (char const* name, int (T::*mfp)(lua_State*))
945 DATADOC ("C Function", name, mfp)
946 typedef int (T::*MFP)(lua_State*);
947 assert (lua_istable (L, -1));
948 new (lua_newuserdata (L, sizeof (mfp))) MFP (mfp);
949 lua_pushcclosure (L, &CFunc::CallMemberCFunction <T>::f, 1);
950 rawsetfield (L, -3, name); // class table
955 // custom callback - extend existing classes
956 // with non-class member functions (e.g STL iterator)
957 Class <T>& addExtCFunction (char const* name, int (*const fp)(lua_State*))
959 DATADOC ("Ext C Function", name, fp)
960 assert (lua_istable (L, -1));
961 lua_pushcclosure (L, fp, 0);
962 rawsetfield (L, -3, name); // class table
966 //--------------------------------------------------------------------------
968 Add or replace a const member lua_CFunction.
970 Class <T>& addCFunction (char const* name, int (T::*mfp)(lua_State*) const)
972 DATADOC ("Const C Member Function", name, mfp)
973 typedef int (T::*MFP)(lua_State*) const;
974 assert (lua_istable (L, -1));
975 new (lua_newuserdata (L, sizeof (mfp))) MFP (mfp);
976 lua_pushcclosure (L, &CFunc::CallConstMemberCFunction <T>::f, 1);
977 lua_pushvalue (L, -1);
978 rawsetfield (L, -5, name); // const table
979 rawsetfield (L, -3, name); // class table
985 Add or replace a static const data
987 template <typename U>
988 Class <T>& addConst (char const* name, const U val)
990 DATADOC ("Constant/Enum Member", name, val)
991 assert (lua_istable (L, -1));
993 rawgetfield (L, -1, "__propget"); // static
994 new (lua_newuserdata (L, sizeof (val))) U (val);
995 lua_pushcclosure (L, &CFunc::getConst <U>, 1);
996 rawsetfield (L, -2, name);
999 rawgetfield (L, -1, "__propset"); // static
1000 lua_pushstring (L, name);
1001 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
1002 rawsetfield (L, -2, name);
1007 //--------------------------------------------------------------------------
1009 Add or replace a primary Constructor.
1011 The primary Constructor is invoked when calling the class type table
1014 The template parameter should be a function pointer type that matches
1015 the desired Constructor (since you can't take the address of a Constructor
1016 and pass it as an argument).
1018 template <class MemFn, class C>
1019 Class <T>& addConstructor ()
1021 FUNDOC("Constructor", "", MemFn)
1022 lua_pushcclosure (L,
1023 &ctorContainerProxy <typename FuncTraits <MemFn>::Params, C>, 0);
1024 rawsetfield(L, -2, "__call");
1029 template <class MemFn>
1030 Class <T>& addConstructor ()
1032 FUNDOC("Constructor", "", MemFn)
1033 lua_pushcclosure (L,
1034 &ctorPlacementProxy <typename FuncTraits <MemFn>::Params, T>, 0);
1035 rawsetfield(L, -2, "__call");
1040 Class <T>& addVoidConstructor ()
1042 return addConstructor <void (*) ()> ();
1045 Class <T>& addEqualCheck ()
1047 PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name <T>() + ")"))
1048 assert (lua_istable (L, -1));
1049 lua_pushcclosure (L, &CFunc::ClassEqualCheck <T>::f, 0);
1050 rawsetfield (L, -3, "sameinstance");
1055 Class <T>& addCast (char const* name)
1057 PRINTDOC("Cast", _name << name,
1059 type_name< U >() << " (" << type_name< T >() << "::*)()")
1061 assert (lua_istable (L, -1));
1062 lua_pushcclosure (L, &CFunc::CastClass <T, U>::f, 0);
1063 rawsetfield (L, -3, name); // class table
1065 lua_pushcclosure (L, &CFunc::CastConstClass <T, U>::f, 0);
1066 rawsetfield (L, -4, name); // const table
1072 /** C Array to/from table */
1073 template <typename T>
1074 class Array : virtual public ClassBase
1077 Array (char const* name, Namespace const* parent) : ClassBase (parent->L)
1079 #ifdef LUABINDINGDOC
1081 _name = parent->_name + name + ":";
1083 PRINTDOC ("[C] Array", parent->_name << name,
1084 std::string(), type_name <T>() + "*")
1085 PRINTDOC ("Ext C Function", _name << "array",
1086 std::string(""), "int (*)(lua_State*)")
1087 PRINTDOC ("Ext C Function", _name << "get_table",
1088 std::string(""), "int (*)(lua_State*)")
1089 PRINTDOC ("Ext C Function", _name << "set_table",
1090 std::string(""), "int (*)(lua_State*)")
1091 PRINTDOC("Member Function", _name << "sameinstance",
1092 std::string("bool"), std::string("bool (*)(" + type_name <T>() + "*)"))
1093 PRINTDOC("Member Function", _name << "offset",
1094 std::string(type_name <T>() + "*"), std::string(type_name <T>() + "* (*)(unsigned int)"))
1096 m_stackSize = parent->m_stackSize + 3;
1097 parent->m_stackSize = 0;
1099 #if 0 // don't allow to duplicates handlers for same array-type
1100 assert (lua_istable (L, -1));
1101 lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
1102 if (lua_istable (L, -1)) {
1110 assert (lua_istable (L, -1));
1111 rawgetfield (L, -1, name);
1113 if (lua_isnil (L, -1))
1117 // register array access in global namespace
1118 luaL_newmetatable (L, typeid(T).name());
1119 lua_pushcclosure (L, CFunc::array_index<T>, 0);
1120 lua_setfield(L, -2, "__index");
1121 lua_pushcclosure (L, CFunc::array_newindex<T>, 0);
1122 lua_setfield(L, -2, "__newindex");
1125 createConstTable (name);
1126 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
1127 rawsetfield (L, -2, "__gc");
1129 createClassTable (name);
1130 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
1131 rawsetfield (L, -2, "__gc");
1133 createStaticTable (name);
1135 // Map T back to its tables.
1136 lua_pushvalue (L, -1);
1137 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
1138 lua_pushvalue (L, -2);
1139 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
1140 lua_pushvalue (L, -3);
1141 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
1143 assert (lua_istable (L, -1));
1144 lua_pushcclosure (L, &CFunc::getArray <T>, 0);
1145 rawsetfield (L, -3, "array"); // class table
1147 lua_pushcclosure (L, &CFunc::getTable <T>, 0);
1148 rawsetfield (L, -3, "get_table"); // class table
1150 lua_pushcclosure (L, &CFunc::setTable <T>, 0);
1151 rawsetfield (L, -3, "set_table"); // class table
1153 lua_pushcclosure (L, &CFunc::ClassEqualCheck <T>::f, 0);
1154 rawsetfield (L, -3, "sameinstance");
1156 lua_pushcclosure (L, &CFunc::offsetArray <T>, 0);
1157 rawsetfield (L, -3, "offset"); // class table
1167 Namespace endArray ()
1169 return Namespace (this);
1173 /** Boost Weak & Shared Pointer Class Wrapper */
1175 class WSPtrClass : virtual public ClassBase
1178 WSPtrClass (char const* name, Namespace const* parent)
1179 : ClassBase (parent->L)
1180 , weak (name, parent)
1181 , shared (name, parent)
1183 #ifdef LUABINDINGDOC
1185 _name = parent->_name + name + ":";
1187 PRINTDOC ("[C] Weak/Shared Pointer Class",
1188 parent->_name + name,
1189 std::string(), type_name <T>())
1190 m_stackSize = weak.m_stackSize;
1191 parent->m_stackSize = weak.m_stackSize = shared.m_stackSize = 0;
1195 WSPtrClass (char const* name, Namespace const* parent, void const* const sharedkey, void const* const weakkey)
1196 : ClassBase (parent->L)
1197 , weak (name, parent, weakkey)
1198 , shared (name, parent, sharedkey)
1200 #ifdef LUABINDINGDOC
1202 _name = parent->_name + name + ":";
1204 m_stackSize = weak.m_stackSize;
1205 parent->m_stackSize = weak.m_stackSize = shared.m_stackSize = 0;
1209 template <class MemFn>
1210 WSPtrClass <T>& addFunction (char const* name, MemFn mf)
1212 FUNDOC ("Weak/Shared Pointer Function", name, MemFn)
1214 CFunc::CallMemberWPtrFunctionHelper <MemFn>::add (L, name, mf);
1216 set_shared_class ();
1217 CFunc::CallMemberPtrFunctionHelper <MemFn>::add (L, name, mf);
1221 template <class MemFn>
1222 WSPtrClass <T>& addRefFunction (char const* name, MemFn mf)
1224 FUNDOC ("Weak/Shared Pointer Function RefReturn", name, MemFn)
1226 CFunc::CallMemberRefWPtrFunctionHelper <MemFn>::add (L, name, mf);
1228 set_shared_class ();
1229 CFunc::CallMemberRefPtrFunctionHelper <MemFn>::add (L, name, mf);
1233 template <class MemFn>
1234 WSPtrClass <T>& addConstructor ()
1236 FUNDOC ("Weak/Shared Pointer Constructor", "", MemFn)
1238 lua_pushcclosure (L,
1239 &weak. template ctorPlacementProxy <typename FuncTraits <MemFn>::Params, boost::weak_ptr<T> >, 0);
1240 rawsetfield(L, -2, "__call");
1242 set_shared_class ();
1243 lua_pushcclosure (L,
1244 &shared. template ctorPlacementProxy <typename FuncTraits <MemFn>::Params, boost::shared_ptr<T> >, 0);
1245 rawsetfield(L, -2, "__call");
1249 WSPtrClass <T>& addVoidConstructor ()
1251 return addConstructor <void (*) ()> ();
1254 WSPtrClass <T>& addExtCFunction (char const* name, int (*const fp)(lua_State*))
1256 DATADOC ("Weak/Shared Ext C Function", name, fp)
1258 assert (lua_istable (L, -1));
1259 lua_pushcclosure (L, fp, 0);
1260 rawsetfield (L, -3, name); // class table
1262 set_shared_class ();
1263 assert (lua_istable (L, -1));
1264 lua_pushcclosure (L, fp, 0);
1265 rawsetfield (L, -3, name); // class table
1271 WSPtrClass <T>& addCast (char const* name)
1273 PRINTDOC("Weak/Shared Pointer Cast", _name << name,
1275 type_name< U >() << " (" << type_name< T >() << "::*)()")
1278 set_shared_class ();
1279 assert (lua_istable (L, -1));
1280 lua_pushcclosure (L, &CFunc::CastMemberPtr <T, U>::f, 0);
1281 rawsetfield (L, -3, name); // class table
1285 WSPtrClass <T>& addNullCheck ()
1287 PRINTDOC("Weak/Shared Null Check", _name << "isnil", std::string("bool"), std::string("void (*)()"))
1289 assert (lua_istable (L, -1));
1290 lua_pushcclosure (L, &CFunc::WPtrNullCheck <T>::f, 0);
1291 rawsetfield (L, -3, "isnil"); // class table
1293 set_shared_class ();
1294 assert (lua_istable (L, -1));
1295 lua_pushcclosure (L, &CFunc::PtrNullCheck <T>::f, 0);
1296 rawsetfield (L, -3, "isnil"); // class table
1301 WSPtrClass <T>& addEqualCheck ()
1303 PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name <T>() + ")"))
1305 assert (lua_istable (L, -1));
1306 lua_pushcclosure (L, &CFunc::WPtrEqualCheck <T>::f, 0);
1307 rawsetfield (L, -3, "isnil"); // class table
1309 set_shared_class ();
1310 assert (lua_istable (L, -1));
1311 lua_pushcclosure (L, &CFunc::PtrEqualCheck <T>::f, 0);
1312 rawsetfield (L, -3, "isnil"); // class table
1317 Namespace endClass ()
1319 return Namespace (this);
1323 void set_weak_class () {
1325 lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <boost::weak_ptr<T> >::getStaticKey ());
1326 rawgetfield (L, -1, "__class");
1327 rawgetfield (L, -1, "__const");
1331 void set_shared_class () {
1333 lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <boost::shared_ptr<T> >::getStaticKey ());
1334 rawgetfield (L, -1, "__class");
1335 rawgetfield (L, -1, "__const");
1339 Class<boost::weak_ptr<T> > weak;
1340 Class<boost::shared_ptr<T> > shared;
1345 //----------------------------------------------------------------------------
1347 Open the global namespace for registrations.
1349 explicit Namespace (lua_State* L_)
1352 #ifdef LUABINDINGDOC
1357 lua_getglobal (L, "_G");
1361 #ifdef LUABINDINGDOC
1363 Namespace const * _parent;
1366 //----------------------------------------------------------------------------
1368 Open a namespace for registrations.
1370 The namespace is created if it doesn't already exist.
1371 The parent namespace is at the top of the Lua stack.
1373 Namespace (char const* name, Namespace const* parent)
1376 #ifdef LUABINDINGDOC
1377 , _name (parent->_name + name + ":")
1381 m_stackSize = parent->m_stackSize + 1;
1382 parent->m_stackSize = 0;
1384 assert (lua_istable (L, -1));
1385 rawgetfield (L, -1, name);
1386 if (lua_isnil (L, -1))
1391 lua_pushvalue (L, -1);
1392 lua_setmetatable (L, -2);
1393 lua_pushcfunction (L, &CFunc::indexMetaMethod);
1394 rawsetfield (L, -2, "__index");
1395 lua_pushcfunction (L, &CFunc::newindexMetaMethod);
1396 rawsetfield (L, -2, "__newindex");
1398 rawsetfield (L, -2, "__propget");
1400 rawsetfield (L, -2, "__propset");
1401 lua_pushvalue (L, -1);
1402 rawsetfield (L, -3, name);
1404 lua_pushcfunction (L, &tostringMetaMethod);
1405 rawsetfield (L, -2, "__tostring");
1410 //----------------------------------------------------------------------------
1412 Creates a continued registration from a child namespace.
1414 explicit Namespace (Namespace const* child)
1417 #ifdef LUABINDINGDOC
1418 , _name (child->_parent ? child->_parent->_name : "")
1419 , _parent (child->_parent ? child->_parent->_parent : NULL)
1422 m_stackSize = child->m_stackSize - 1;
1423 child->m_stackSize = 1;
1426 // It is not necessary or valid to call
1427 // endNamespace() for the global namespace!
1429 assert (m_stackSize != 0);
1432 //----------------------------------------------------------------------------
1434 Creates a continued registration from a child class.
1436 explicit Namespace (ClassBase const* child)
1439 #ifdef LUABINDINGDOC
1440 , _name (child->_parent ? child->_parent->_name : "")
1441 , _parent (child->_parent ? child->_parent->_parent : NULL)
1444 m_stackSize = child->m_stackSize - 3;
1445 child->m_stackSize = 3;
1450 //----------------------------------------------------------------------------
1454 Ownership of the stack is transferred to the new object. This happens
1455 when the compiler emits temporaries to hold these objects while chaining
1456 registrations across namespaces.
1458 Namespace (Namespace const& other) : L (other.L)
1460 m_stackSize = other.m_stackSize;
1461 other.m_stackSize = 0;
1462 #ifdef LUABINDINGDOC
1463 _name = other._name;
1464 _parent = other._parent;
1468 //----------------------------------------------------------------------------
1470 Closes this namespace registration.
1477 //----------------------------------------------------------------------------
1479 Open the global namespace.
1481 static Namespace getGlobalNamespace (lua_State* L)
1483 return Namespace (L);
1486 //----------------------------------------------------------------------------
1488 Open a new or existing namespace for registrations.
1490 Namespace beginNamespace (char const* name)
1492 return Namespace (name, this);
1495 //----------------------------------------------------------------------------
1497 Continue namespace registration in the parent.
1499 Do not use this on the global namespace.
1501 Namespace endNamespace ()
1503 return Namespace (this);
1506 //----------------------------------------------------------------------------
1508 Add or replace a variable.
1511 Namespace& addVariable (char const* name, T* pt, bool isWritable = true)
1513 assert (lua_istable (L, -1));
1515 rawgetfield (L, -1, "__propget");
1516 assert (lua_istable (L, -1));
1517 lua_pushlightuserdata (L, pt);
1518 lua_pushcclosure (L, &CFunc::getVariable <T>, 1);
1519 rawsetfield (L, -2, name);
1522 rawgetfield (L, -1, "__propset");
1523 assert (lua_istable (L, -1));
1526 lua_pushlightuserdata (L, pt);
1527 lua_pushcclosure (L, &CFunc::setVariable <T>, 1);
1531 lua_pushstring (L, name);
1532 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
1534 rawsetfield (L, -2, name);
1540 template <typename U>
1541 Namespace& addConst (char const* name, const U val)
1543 DATADOC ("Constant/Enum", name, val)
1544 assert (lua_istable (L, -1));
1545 rawgetfield (L, -1, "__propget");
1546 new (lua_newuserdata (L, sizeof (val))) U (val);
1547 lua_pushcclosure (L, &CFunc::getConst <U>, 1);
1548 rawsetfield (L, -2, name);
1551 rawgetfield (L, -1, "__propset");
1552 assert (lua_istable (L, -1));
1553 lua_pushstring (L, name);
1554 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
1555 rawsetfield (L, -2, name);
1560 //----------------------------------------------------------------------------
1562 Add or replace a property.
1564 If the set function is omitted or null, the property is read-only.
1567 template <class TG, class TS>
1568 Namespace& addProperty (char const* name, TG (*get) (), void (*set)(TS) = 0)
1570 assert (lua_istable (L, -1));
1572 rawgetfield (L, -1, "__propget");
1573 assert (lua_istable (L, -1));
1574 typedef TG (*get_t) ();
1575 new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
1576 lua_pushcclosure (L, &CFunc::Call <TG (*) (void)>::f, 1);
1577 rawsetfield (L, -2, name);
1580 rawgetfield (L, -1, "__propset");
1581 assert (lua_istable (L, -1));
1584 typedef void (*set_t) (TS);
1585 new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
1586 lua_pushcclosure (L, &CFunc::Call <void (*) (TS)>::f, 1);
1590 lua_pushstring (L, name);
1591 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
1593 rawsetfield (L, -2, name);
1600 //----------------------------------------------------------------------------
1602 Add or replace a free function.
1605 Namespace& addFunction (char const* name, FP const fp)
1607 FUNDOC ("Free Function", name, FP)
1608 assert (lua_istable (L, -1));
1610 new (lua_newuserdata (L, sizeof (fp))) FP (fp);
1611 lua_pushcclosure (L, &CFunc::Call <FP>::f, 1);
1612 rawsetfield (L, -2, name);
1618 Namespace& addRefFunction (char const* name, FP const fp)
1620 FUNDOC ("Free Function RefReturn", name, FP)
1621 assert (lua_istable (L, -1));
1623 new (lua_newuserdata (L, sizeof (fp))) FP (fp);
1624 lua_pushcclosure (L, &CFunc::CallRef <FP>::f, 1);
1625 rawsetfield (L, -2, name);
1630 //----------------------------------------------------------------------------
1632 Add or replace a array type
1635 template <typename T>
1636 Namespace registerArray (char const* name)
1638 return Array <T> (name, this).endArray();
1642 //----------------------------------------------------------------------------
1644 Add or replace a lua_CFunction.
1646 Namespace& addCFunction (char const* name, int (*const fp)(lua_State*))
1648 DATADOC ("Free C Function", name, fp)
1649 lua_pushcfunction (L, fp);
1650 rawsetfield (L, -2, name);
1655 //----------------------------------------------------------------------------
1657 Open a new or existing class for registrations.
1660 Class <T> beginClass (char const* name)
1662 return Class <T> (name, this);
1665 /** weak & shared pointer class */
1667 WSPtrClass <T> beginWSPtrClass (char const* name)
1669 return WSPtrClass <T> (name, this)
1674 //----------------------------------------------------------------------------
1676 template <class K, class V>
1677 Class<std::map<K, V> > beginStdMap (char const* name)
1679 typedef std::map<K, V> LT;
1680 typedef std::pair<const K, V> T;
1682 typedef typename std::map<K, V>::size_type T_SIZE;
1684 return beginClass<LT> (name)
1685 .addVoidConstructor ()
1686 .addFunction ("empty", <::empty)
1687 .addFunction ("size", <::size)
1688 .addFunction ("clear", (void (LT::*)())<::clear)
1689 .addFunction ("count", (T_SIZE (LT::*)(const K&) const)<::count)
1690 .addExtCFunction ("add", &CFunc::tableToMap<K, V>)
1691 .addExtCFunction ("iter", &CFunc::mapIter<K, V>)
1692 .addExtCFunction ("table", &CFunc::mapToTable<K, V>);
1696 Class<std::set<T> > beginStdSet (char const* name)
1698 typedef std::set<T> LT;
1699 return beginClass<LT> (name)
1700 .addVoidConstructor ()
1701 .addFunction ("clear", (void (LT::*)())<::clear)
1702 .addFunction ("empty", <::empty)
1703 .addFunction ("size", <::size)
1704 .addExtCFunction ("add", &CFunc::tableToSet<T>)
1705 .addExtCFunction ("iter", &CFunc::setIter<T>)
1706 .addExtCFunction ("table", &CFunc::setToTable<T>);
1709 template <unsigned int T>
1710 Class<std::bitset<T> > beginStdBitSet (char const* name)
1712 typedef std::bitset<T> BS;
1713 return beginClass<BS> (name)
1714 .addVoidConstructor ()
1715 .addFunction ("reset", (BS& (BS::*)())&BS::reset)
1716 .addFunction ("set", (BS& (BS::*)(size_t, bool))&BS::set)
1717 .addFunction ("count", &BS::count)
1718 .addFunction ("any", &BS::any)
1719 .addFunction ("none", &BS::none)
1720 .addFunction ("test", &BS::test)
1721 .addFunction ("size", &BS::size)
1722 .addExtCFunction ("add", &CFunc::tableToBitSet<T>)
1723 .addExtCFunction ("table", &CFunc::bitSetToTable<T>);
1727 Class<std::list<T> > beginConstStdList (char const* name)
1729 typedef std::list<T> LT;
1730 return beginClass<LT> (name)
1731 .addVoidConstructor ()
1732 .addFunction ("empty", <::empty)
1733 .addFunction ("size", <::size)
1734 .addFunction ("reverse", <::reverse)
1735 .addExtCFunction ("iter", &CFunc::listIter<T, LT>)
1736 .addExtCFunction ("table", &CFunc::listToTable<T, LT>);
1740 Class<std::list<T> > beginStdList (char const* name)
1742 typedef std::list<T> LT;
1743 return beginConstStdList<T> (name)
1744 .addFunction ("unique", (void (LT::*)())<::unique)
1745 .addFunction ("push_back", (void (LT::*)(const T&))<::push_back)
1746 .addExtCFunction ("add", &CFunc::tableToList<T, LT>);
1750 Class<std::vector<T> > beginStdVector (char const* name)
1752 typedef std::vector<T> LT;
1753 typedef typename std::vector<T>::reference T_REF;
1754 typedef typename std::vector<T>::size_type T_SIZE;
1756 return beginClass<LT> (name)
1757 .addVoidConstructor ()
1758 .addFunction ("empty", <::empty)
1759 .addFunction ("size", <::size)
1760 .addFunction ("push_back", (void (LT::*)(const T&))<::push_back)
1761 .addFunction ("at", (T_REF (LT::*)(T_SIZE))<::at)
1762 .addExtCFunction ("add", &CFunc::tableToList<T, LT>)
1763 .addExtCFunction ("iter", &CFunc::listIter<T, LT>)
1764 .addExtCFunction ("table", &CFunc::listToTable<T, LT>);
1767 //----------------------------------------------------------------------------
1770 Class<boost::shared_ptr<std::list<T> > > beginPtrStdList (char const* name)
1772 typedef std::list<T> LT;
1774 return beginClass<boost::shared_ptr<LT> > (name)
1775 .addVoidConstructor ()
1776 .addPtrFunction ("empty", <::empty)
1777 .addPtrFunction ("size", <::size)
1778 .addPtrFunction ("reverse", <::reverse)
1779 .addPtrFunction ("unique", (void (LT::*)())<::unique)
1780 .addPtrFunction ("push_back", (void (LT::*)(const T&))<::push_back)
1781 .addExtCFunction ("add", &CFunc::ptrTableToList<T, LT>)
1782 .addExtCFunction ("iter", &CFunc::ptrListIter<T, LT>)
1783 .addExtCFunction ("table", &CFunc::ptrListToTable<T, LT>);
1787 Class<boost::shared_ptr<std::vector<T> > > beginPtrStdVector (char const* name)
1789 typedef std::vector<T> LT;
1790 typedef typename std::vector<T>::reference T_REF;
1791 typedef typename std::vector<T>::size_type T_SIZE;
1793 return beginClass<boost::shared_ptr<LT> > (name)
1794 .addVoidConstructor ()
1795 .addPtrFunction ("empty", <::empty)
1796 .addPtrFunction ("empty", <::empty)
1797 .addPtrFunction ("size", <::size)
1798 .addPtrFunction ("push_back", (void (LT::*)(const T&))<::push_back)
1799 .addPtrFunction ("at", (T_REF (LT::*)(T_SIZE))<::at)
1800 .addExtCFunction ("add", &CFunc::ptrTableToList<T, LT>)
1801 .addExtCFunction ("iter", &CFunc::ptrListIter<T, LT>)
1802 .addExtCFunction ("table", &CFunc::ptrListToTable<T, LT>);
1805 //----------------------------------------------------------------------------
1807 Derive a new class for registrations.
1809 To continue registrations for the class later, use beginClass().
1810 Do not call deriveClass() again.
1812 template <class T, class U>
1813 Class <T> deriveClass (char const* name)
1815 CLASSDOC ("[C] Derived Class", _name << name, type_name <T>(), type_name <U>())
1816 return Class <T> (name, this, ClassInfo <U>::getStaticKey ());
1819 template <class T, class U>
1820 WSPtrClass <T> deriveWSPtrClass (char const* name)
1823 CLASSDOC ("[C] Derived Class", _name << name, type_name <boost::shared_ptr<T> >(), type_name <boost::shared_ptr<U> >())
1824 CLASSDOC ("[C] Derived Class", _name << name, type_name <boost::weak_ptr<T> >(), type_name <boost::weak_ptr<U> >())
1825 CLASSDOC ("[C] Derived Pointer Class", _name << name, type_name <T>(), type_name <U>())
1826 return WSPtrClass <T> (name, this,
1827 ClassInfo <boost::shared_ptr<U> >::getStaticKey (),
1828 ClassInfo <boost::weak_ptr<U> >::getStaticKey ())
1834 //------------------------------------------------------------------------------
1836 Retrieve the global namespace.
1838 It is recommended to put your namespace inside the global namespace, and
1839 then add your classes and functions to it, rather than adding many classes
1840 and functions directly to the global namespace.
1842 inline Namespace getGlobalNamespace (lua_State* L)
1844 return Namespace::getGlobalNamespace (L);
1855 /* vim: set et sw=2: */