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 template <class Params, class T, class C>
477 static int ctorPtrPlacementProxy (lua_State* L)
479 ArgList <Params, 2> args (L);
480 T newobject (Constructor <C, Params>::call (args));
481 Stack<T>::push (L, newobject);
486 static int ctorNilPtrPlacementProxy (lua_State* L)
488 const T* newobject = new T ();
489 Stack<T>::push (L, *newobject);
493 //--------------------------------------------------------------------------
497 void pop (int n) const
499 if (m_stackSize >= n && lua_gettop (L) >= n)
506 throw std::logic_error ("invalid stack");
511 //--------------------------------------------------------------------------
512 explicit ClassBase (lua_State* L_)
518 //--------------------------------------------------------------------------
522 ClassBase (ClassBase const& other)
526 , _name (other._name)
527 , _parent (other._parent)
530 m_stackSize = other.m_stackSize;
531 other.m_stackSize = 0;
540 //============================================================================
544 //============================================================================
546 Provides a class registration in a lua_State.
548 After contstruction the Lua stack holds these objects:
552 -4 (enclosing namespace)
555 class Class : virtual public ClassBase
558 //==========================================================================
560 Register a new class or add to an existing class registration.
562 Class (char const* name, Namespace const* parent) : ClassBase (parent->L)
566 _name = parent->_name + name + ":";
568 PRINTDOC ("[C] Class", parent->_name << name, std::string(), type_name <T>())
569 m_stackSize = parent->m_stackSize + 3;
570 parent->m_stackSize = 0;
572 assert (lua_istable (L, -1));
573 rawgetfield (L, -1, name);
575 if (lua_isnil (L, -1))
579 createConstTable (name);
580 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
581 rawsetfield (L, -2, "__gc");
583 createClassTable (name);
584 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
585 rawsetfield (L, -2, "__gc");
587 createStaticTable (name);
589 // Map T back to its tables.
590 lua_pushvalue (L, -1);
591 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
592 lua_pushvalue (L, -2);
593 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
594 lua_pushvalue (L, -3);
595 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
600 lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
601 rawgetfield (L, -1, "__class");
602 rawgetfield (L, -1, "__const");
604 // Reverse the top 3 stack elements
610 //==========================================================================
614 Class (char const* name, Namespace const* parent, void const* const staticKey)
615 : ClassBase (parent->L)
619 _name = parent->_name + name + ":";
621 m_stackSize = parent->m_stackSize + 3;
622 parent->m_stackSize = 0;
624 assert (lua_istable (L, -1));
626 createConstTable (name);
627 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
628 rawsetfield (L, -2, "__gc");
630 createClassTable (name);
631 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
632 rawsetfield (L, -2, "__gc");
634 createStaticTable (name);
636 lua_rawgetp (L, LUA_REGISTRYINDEX, staticKey);
637 assert (lua_istable (L, -1));
638 rawgetfield (L, -1, "__class");
639 assert (lua_istable (L, -1));
640 rawgetfield (L, -1, "__const");
641 assert (lua_istable (L, -1));
643 rawsetfield (L, -6, "__parent");
644 rawsetfield (L, -4, "__parent");
645 rawsetfield (L, -2, "__parent");
647 lua_pushvalue (L, -1);
648 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
649 lua_pushvalue (L, -2);
650 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
651 lua_pushvalue (L, -3);
652 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
655 //--------------------------------------------------------------------------
657 Continue registration in the enclosing namespace.
659 Namespace endClass ()
661 return Namespace (this);
664 //--------------------------------------------------------------------------
666 Add or replace a static data member.
669 Class <T>& addStaticData (char const* name, U* pu, bool isWritable = true)
671 DATADOC ("Static Data Member", name, pu)
672 assert (lua_istable (L, -1));
674 rawgetfield (L, -1, "__propget");
675 assert (lua_istable (L, -1));
676 lua_pushlightuserdata (L, pu);
677 lua_pushcclosure (L, &CFunc::getVariable <U>, 1);
678 rawsetfield (L, -2, name);
681 rawgetfield (L, -1, "__propset");
682 assert (lua_istable (L, -1));
685 lua_pushlightuserdata (L, pu);
686 lua_pushcclosure (L, &CFunc::setVariable <U>, 1);
690 lua_pushstring (L, name);
691 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
693 rawsetfield (L, -2, name);
699 //--------------------------------------------------------------------------
702 Add or replace a static property member.
704 If the set function is null, the property is read-only.
707 Class <T>& addStaticProperty (char const* name, U (*get)(), void (*set)(U) = 0)
709 typedef U (*get_t)();
710 typedef void (*set_t)(U);
712 assert (lua_istable (L, -1));
714 rawgetfield (L, -1, "__propget");
715 assert (lua_istable (L, -1));
716 new (lua_newuserdata (L, sizeof (get))) get_t (get);
717 lua_pushcclosure (L, &CFunc::Call <U (*) (void)>::f, 1);
718 rawsetfield (L, -2, name);
721 rawgetfield (L, -1, "__propset");
722 assert (lua_istable (L, -1));
725 new (lua_newuserdata (L, sizeof (set))) set_t (set);
726 lua_pushcclosure (L, &CFunc::Call <void (*) (U)>::f, 1);
730 lua_pushstring (L, name);
731 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
733 rawsetfield (L, -2, name);
740 //--------------------------------------------------------------------------
742 Add or replace a static member function.
745 Class <T>& addStaticFunction (char const* name, FP const fp)
747 FUNDOC ("Static Member Function", name, FP)
748 new (lua_newuserdata (L, sizeof (fp))) FP (fp);
749 lua_pushcclosure (L, &CFunc::Call <FP>::f, 1);
750 rawsetfield (L, -2, name);
755 //--------------------------------------------------------------------------
757 Add or replace a lua_CFunction.
759 Class <T>& addStaticCFunction (char const* name, int (*const fp)(lua_State*))
761 DATADOC ("Static C Function", name, fp)
762 lua_pushcfunction (L, fp);
763 rawsetfield (L, -2, name);
767 //--------------------------------------------------------------------------
769 Add or replace a data member.
772 Class <T>& addData (char const* name, const U T::* mp, bool isWritable = true)
774 DATADOC ("Data Member", name, mp)
775 typedef const U T::*mp_t;
777 // Add to __propget in class and const tables.
779 rawgetfield (L, -2, "__propget");
780 rawgetfield (L, -4, "__propget");
781 new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
782 lua_pushcclosure (L, &CFunc::getProperty <T,U>, 1);
783 lua_pushvalue (L, -1);
784 rawsetfield (L, -4, name);
785 rawsetfield (L, -2, name);
791 // Add to __propset in class table.
792 rawgetfield (L, -2, "__propset");
793 assert (lua_istable (L, -1));
794 new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
795 lua_pushcclosure (L, &CFunc::setProperty <T,U>, 1);
796 rawsetfield (L, -2, name);
803 //--------------------------------------------------------------------------
805 Add or replace a property member.
807 template <class TG, class TS>
808 Class <T>& addProperty (char const* name, TG (T::* get) () const, bool (T::* set) (TS))
810 DATADOC ("Property", name, get)
811 // Add to __propget in class and const tables.
813 rawgetfield (L, -2, "__propget");
814 rawgetfield (L, -4, "__propget");
815 typedef TG (T::*get_t) () const;
816 new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
817 lua_pushcclosure (L, &CFunc::CallConstMember <get_t>::f, 1);
818 lua_pushvalue (L, -1);
819 rawsetfield (L, -4, name);
820 rawsetfield (L, -2, name);
825 // Add to __propset in class table.
826 rawgetfield (L, -2, "__propset");
827 assert (lua_istable (L, -1));
828 typedef bool (T::* set_t) (TS);
829 new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
830 lua_pushcclosure (L, &CFunc::CallMember <set_t>::f, 1);
831 rawsetfield (L, -2, name);
841 Class <T>& addProperty (char const* name, TG (T::* get) () const)
843 // Add to __propget in class and const tables.
844 rawgetfield (L, -2, "__propget");
845 rawgetfield (L, -4, "__propget");
846 typedef TG (T::*get_t) () const;
847 new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
848 lua_pushcclosure (L, &CFunc::CallConstMember <get_t>::f, 1);
849 lua_pushvalue (L, -1);
850 rawsetfield (L, -4, name);
851 rawsetfield (L, -2, name);
858 //--------------------------------------------------------------------------
860 Add or replace a property member, by proxy.
862 When a class is closed for modification and does not provide (or cannot
863 provide) the function signatures necessary to implement get or set for
864 a property, this will allow non-member functions act as proxies.
866 Both the get and the set functions require a T const* and T* in the first
867 argument respectively.
869 template <class TG, class TS>
870 Class <T>& addProperty (char const* name, TG (*get) (T const*), bool (*set) (T*, TS))
872 // Add to __propget in class and const tables.
874 rawgetfield (L, -2, "__propget");
875 rawgetfield (L, -4, "__propget");
876 typedef TG (*get_t) (T const*);
877 new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
878 lua_pushcclosure (L, &CFunc::Call <get_t>::f, 1);
879 lua_pushvalue (L, -1);
880 rawsetfield (L, -4, name);
881 rawsetfield (L, -2, name);
887 // Add to __propset in class table.
888 rawgetfield (L, -2, "__propset");
889 assert (lua_istable (L, -1));
890 typedef void (*set_t) (T*, TS);
891 new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
892 lua_pushcclosure (L, &CFunc::Call <set_t>::f, 1);
893 rawsetfield (L, -2, name);
902 template <class TG, class TS>
903 Class <T>& addProperty (char const* name, TG (*get) (T const*))
905 // Add to __propget in class and const tables.
906 rawgetfield (L, -2, "__propget");
907 rawgetfield (L, -4, "__propget");
908 typedef TG (*get_t) (T const*);
909 new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
910 lua_pushcclosure (L, &CFunc::Call <get_t>::f, 1);
911 lua_pushvalue (L, -1);
912 rawsetfield (L, -4, name);
913 rawsetfield (L, -2, name);
919 //--------------------------------------------------------------------------
921 Add or replace a member function.
923 template <class MemFn>
924 Class <T>& addFunction (char const* name, MemFn mf)
926 FUNDOC("Member Function", name, MemFn)
927 CFunc::CallMemberFunctionHelper <MemFn, FuncTraits <MemFn>::isConstMemberFunction>::add (L, name, mf);
931 template <class MemFn>
932 Class <T>& addPtrFunction (char const* name, MemFn mf)
934 FUNDOC("Member Pointer Function", name, MemFn)
935 CFunc::CallMemberPtrFunctionHelper <MemFn>::add (L, name, mf);
939 template <class MemFn>
940 Class <T>& addWPtrFunction (char const* name, MemFn mf)
942 FUNDOC("Member Weak Pointer Function", name, MemFn)
943 CFunc::CallMemberWPtrFunctionHelper <MemFn>::add (L, name, mf);
947 template <class MemFn>
948 Class <T>& addRefFunction (char const* name, MemFn mf)
950 FUNDOC("Member Function RefReturn", name, MemFn)
951 CFunc::CallMemberRefFunctionHelper <MemFn, FuncTraits <MemFn>::isConstMemberFunction>::add (L, name, mf);
956 //--------------------------------------------------------------------------
958 Add or replace a member lua_CFunction.
960 Class <T>& addCFunction (char const* name, int (T::*mfp)(lua_State*))
962 DATADOC ("C Function", name, mfp)
963 typedef int (T::*MFP)(lua_State*);
964 assert (lua_istable (L, -1));
965 new (lua_newuserdata (L, sizeof (mfp))) MFP (mfp);
966 lua_pushcclosure (L, &CFunc::CallMemberCFunction <T>::f, 1);
967 rawsetfield (L, -3, name); // class table
972 // custom callback - extend existing classes
973 // with non-class member functions (e.g STL iterator)
974 Class <T>& addExtCFunction (char const* name, int (*const fp)(lua_State*))
976 DATADOC ("Ext C Function", name, fp)
977 assert (lua_istable (L, -1));
978 lua_pushcclosure (L, fp, 0);
979 rawsetfield (L, -3, name); // class table
983 //--------------------------------------------------------------------------
985 Add or replace a const member lua_CFunction.
987 Class <T>& addCFunction (char const* name, int (T::*mfp)(lua_State*) const)
989 DATADOC ("Const C Member Function", name, mfp)
990 typedef int (T::*MFP)(lua_State*) const;
991 assert (lua_istable (L, -1));
992 new (lua_newuserdata (L, sizeof (mfp))) MFP (mfp);
993 lua_pushcclosure (L, &CFunc::CallConstMemberCFunction <T>::f, 1);
994 lua_pushvalue (L, -1);
995 rawsetfield (L, -5, name); // const table
996 rawsetfield (L, -3, name); // class table
1002 Add or replace a static const data
1004 template <typename U>
1005 Class <T>& addConst (char const* name, const U val)
1007 DATADOC ("Constant/Enum Member", name, val)
1008 assert (lua_istable (L, -1));
1010 rawgetfield (L, -1, "__propget"); // static
1011 new (lua_newuserdata (L, sizeof (val))) U (val);
1012 lua_pushcclosure (L, &CFunc::getConst <U>, 1);
1013 rawsetfield (L, -2, name);
1016 rawgetfield (L, -1, "__propset"); // static
1017 lua_pushstring (L, name);
1018 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
1019 rawsetfield (L, -2, name);
1024 //--------------------------------------------------------------------------
1026 Add or replace a primary Constructor.
1028 The primary Constructor is invoked when calling the class type table
1031 The template parameter should be a function pointer type that matches
1032 the desired Constructor (since you can't take the address of a Constructor
1033 and pass it as an argument).
1035 template <class MemFn, class C>
1036 Class <T>& addConstructor ()
1038 FUNDOC("Constructor", "", MemFn)
1039 lua_pushcclosure (L,
1040 &ctorContainerProxy <typename FuncTraits <MemFn>::Params, C>, 0);
1041 rawsetfield(L, -2, "__call");
1046 template <class MemFn>
1047 Class <T>& addConstructor ()
1049 FUNDOC("Constructor", "", MemFn)
1050 lua_pushcclosure (L,
1051 &ctorPlacementProxy <typename FuncTraits <MemFn>::Params, T>, 0);
1052 rawsetfield(L, -2, "__call");
1057 template <class MemFn, class PT>
1058 Class <T>& addPtrConstructor ()
1060 FUNDOC("Constructor", "", MemFn)
1061 lua_pushcclosure (L,
1062 &ctorPtrPlacementProxy <typename FuncTraits <MemFn>::Params, T, PT>, 0);
1063 rawsetfield(L, -2, "__call");
1068 Class <T>& addVoidConstructor ()
1070 return addConstructor <void (*) ()> ();
1074 Class <T>& addVoidPtrConstructor ()
1076 return addPtrConstructor <void (*) (), PT> ();
1079 Class <T>& addEqualCheck ()
1081 PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name <T>() + ")"))
1082 assert (lua_istable (L, -1));
1083 lua_pushcclosure (L, &CFunc::ClassEqualCheck <T>::f, 0);
1084 rawsetfield (L, -3, "sameinstance");
1089 Class <T>& addCast (char const* name)
1091 PRINTDOC("Cast", _name << name,
1093 type_name< U >() << " (" << type_name< T >() << "::*)()")
1095 assert (lua_istable (L, -1));
1096 lua_pushcclosure (L, &CFunc::CastClass <T, U>::f, 0);
1097 rawsetfield (L, -3, name); // class table
1099 lua_pushcclosure (L, &CFunc::CastConstClass <T, U>::f, 0);
1100 rawsetfield (L, -4, name); // const table
1106 /** C Array to/from table */
1107 template <typename T>
1108 class Array : virtual public ClassBase
1111 Array (char const* name, Namespace const* parent) : ClassBase (parent->L)
1113 #ifdef LUABINDINGDOC
1115 _name = parent->_name + name + ":";
1117 PRINTDOC ("[C] Array", parent->_name << name,
1118 std::string(), type_name <T>() + "*")
1119 PRINTDOC ("Ext C Function", _name << "array",
1120 std::string(""), "int (*)(lua_State*)")
1121 PRINTDOC ("Ext C Function", _name << "get_table",
1122 std::string(""), "int (*)(lua_State*)")
1123 PRINTDOC ("Ext C Function", _name << "set_table",
1124 std::string(""), "int (*)(lua_State*)")
1125 PRINTDOC("Member Function", _name << "sameinstance",
1126 std::string("bool"), std::string("bool (*)(" + type_name <T>() + "*)"))
1127 PRINTDOC("Member Function", _name << "offset",
1128 std::string(type_name <T>() + "*"), std::string(type_name <T>() + "* (*)(unsigned int)"))
1130 m_stackSize = parent->m_stackSize + 3;
1131 parent->m_stackSize = 0;
1133 #if 0 // don't allow to duplicates handlers for same array-type
1134 assert (lua_istable (L, -1));
1135 lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
1136 if (lua_istable (L, -1)) {
1144 assert (lua_istable (L, -1));
1145 rawgetfield (L, -1, name);
1147 if (lua_isnil (L, -1))
1151 // register array access in global namespace
1152 luaL_newmetatable (L, typeid(T).name());
1153 lua_pushcclosure (L, CFunc::array_index<T>, 0);
1154 lua_setfield(L, -2, "__index");
1155 lua_pushcclosure (L, CFunc::array_newindex<T>, 0);
1156 lua_setfield(L, -2, "__newindex");
1159 createConstTable (name);
1160 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
1161 rawsetfield (L, -2, "__gc");
1163 createClassTable (name);
1164 lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
1165 rawsetfield (L, -2, "__gc");
1167 createStaticTable (name);
1169 // Map T back to its tables.
1170 lua_pushvalue (L, -1);
1171 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
1172 lua_pushvalue (L, -2);
1173 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
1174 lua_pushvalue (L, -3);
1175 lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
1177 assert (lua_istable (L, -1));
1178 lua_pushcclosure (L, &CFunc::getArray <T>, 0);
1179 rawsetfield (L, -3, "array"); // class table
1181 lua_pushcclosure (L, &CFunc::getTable <T>, 0);
1182 rawsetfield (L, -3, "get_table"); // class table
1184 lua_pushcclosure (L, &CFunc::setTable <T>, 0);
1185 rawsetfield (L, -3, "set_table"); // class table
1187 lua_pushcclosure (L, &CFunc::ClassEqualCheck <T>::f, 0);
1188 rawsetfield (L, -3, "sameinstance");
1190 lua_pushcclosure (L, &CFunc::offsetArray <T>, 0);
1191 rawsetfield (L, -3, "offset"); // class table
1201 Namespace endArray ()
1203 return Namespace (this);
1207 /** Boost Weak & Shared Pointer Class Wrapper */
1209 class WSPtrClass : virtual public ClassBase
1212 WSPtrClass (char const* name, Namespace const* parent)
1213 : ClassBase (parent->L)
1214 , shared (name, parent)
1215 , weak (name, parent)
1217 #ifdef LUABINDINGDOC
1219 _name = parent->_name + name + ":";
1221 PRINTDOC ("[C] Weak/Shared Pointer Class",
1222 parent->_name + name,
1223 std::string(), type_name <T>())
1224 m_stackSize = shared.m_stackSize;
1225 parent->m_stackSize = weak.m_stackSize = shared.m_stackSize = 0;
1229 WSPtrClass (char const* name, Namespace const* parent, void const* const sharedkey, void const* const weakkey)
1230 : ClassBase (parent->L)
1231 , shared (name, parent, sharedkey)
1232 , weak (name, parent, weakkey)
1234 #ifdef LUABINDINGDOC
1236 _name = parent->_name + name + ":";
1238 m_stackSize = shared.m_stackSize;
1239 parent->m_stackSize = weak.m_stackSize = shared.m_stackSize = 0;
1243 template <class MemFn>
1244 WSPtrClass <T>& addFunction (char const* name, MemFn mf)
1246 FUNDOC ("Weak/Shared Pointer Function", name, MemFn)
1247 set_shared_class ();
1248 CFunc::CallMemberPtrFunctionHelper <MemFn>::add (L, name, mf);
1251 CFunc::CallMemberWPtrFunctionHelper <MemFn>::add (L, name, mf);
1255 template <class MemFn>
1256 WSPtrClass <T>& addRefFunction (char const* name, MemFn mf)
1258 FUNDOC ("Weak/Shared Pointer Function RefReturn", name, MemFn)
1259 set_shared_class ();
1260 CFunc::CallMemberRefPtrFunctionHelper <MemFn>::add (L, name, mf);
1263 CFunc::CallMemberRefWPtrFunctionHelper <MemFn>::add (L, name, mf);
1267 template <class MemFn>
1268 WSPtrClass <T>& addConstructor ()
1270 FUNDOC ("Weak/Shared Pointer Constructor", "", MemFn)
1271 set_shared_class ();
1272 lua_pushcclosure (L,
1273 &shared. template ctorPtrPlacementProxy <typename FuncTraits <MemFn>::Params, boost::shared_ptr<T>, T >, 0);
1274 rawsetfield(L, -2, "__call");
1277 // NOTE: this constructs an empty weak-ptr,
1278 // ideally we'd construct a weak-ptr from a referenced shared-ptr
1279 lua_pushcclosure (L,
1280 &weak. template ctorPlacementProxy <typename FuncTraits <MemFn>::Params, boost::weak_ptr<T> >, 0);
1281 rawsetfield(L, -2, "__call");
1285 WSPtrClass <T>& addVoidConstructor ()
1287 return addConstructor <void (*) ()> ();
1290 WSPtrClass <T>& addNilPtrConstructor ()
1292 FUNDOC ("Weak/Shared Pointer NIL Constructor", "", void (*) ())
1293 set_shared_class ();
1294 lua_pushcclosure (L,
1295 &shared. template ctorNilPtrPlacementProxy <boost::shared_ptr<T> >, 0);
1296 rawsetfield(L, -2, "__call");
1299 // NOTE: this constructs an empty weak-ptr,
1300 // ideally we'd construct a weak-ptr from a referenced shared-ptr
1301 lua_pushcclosure (L,
1302 &weak. template ctorNilPtrPlacementProxy <boost::weak_ptr<T> >, 0);
1303 rawsetfield(L, -2, "__call");
1308 WSPtrClass <T>& addExtCFunction (char const* name, int (*const fp)(lua_State*))
1310 DATADOC ("Weak/Shared Ext C Function", name, fp)
1311 set_shared_class ();
1312 assert (lua_istable (L, -1));
1313 lua_pushcclosure (L, fp, 0);
1314 rawsetfield (L, -3, name); // class table
1317 assert (lua_istable (L, -1));
1318 lua_pushcclosure (L, fp, 0);
1319 rawsetfield (L, -3, name); // class table
1325 WSPtrClass <T>& addCast (char const* name)
1327 PRINTDOC("Weak/Shared Pointer Cast", _name << name,
1329 type_name< U >() << " (" << type_name< T >() << "::*)()")
1332 set_shared_class ();
1333 assert (lua_istable (L, -1));
1334 lua_pushcclosure (L, &CFunc::CastMemberPtr <T, U>::f, 0);
1335 rawsetfield (L, -3, name); // class table
1339 WSPtrClass <T>& addNullCheck ()
1341 PRINTDOC("Weak/Shared Null Check", _name << "isnil", std::string("bool"), std::string("void (*)()"))
1342 set_shared_class ();
1343 assert (lua_istable (L, -1));
1344 lua_pushcclosure (L, &CFunc::PtrNullCheck <T>::f, 0);
1345 rawsetfield (L, -3, "isnil"); // class table
1348 assert (lua_istable (L, -1));
1349 lua_pushcclosure (L, &CFunc::WPtrNullCheck <T>::f, 0);
1350 rawsetfield (L, -3, "isnil"); // class table
1355 WSPtrClass <T>& addEqualCheck ()
1357 PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name <T>() + ")"))
1358 set_shared_class ();
1359 assert (lua_istable (L, -1));
1360 lua_pushcclosure (L, &CFunc::PtrEqualCheck <T>::f, 0);
1361 rawsetfield (L, -3, "sameinstance"); // class table
1364 assert (lua_istable (L, -1));
1365 lua_pushcclosure (L, &CFunc::WPtrEqualCheck <T>::f, 0);
1366 rawsetfield (L, -3, "sameinstance"); // class table
1372 WSPtrClass <T>& addData (char const* name, const U T::* mp, bool isWritable = true)
1374 DATADOC ("Data Member", name, mp)
1375 typedef const U T::*mp_t;
1378 assert (lua_istable (L, -1));
1379 // Add to __propget in class and const tables.
1381 rawgetfield (L, -2, "__propget");
1382 rawgetfield (L, -4, "__propget");
1383 new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
1384 lua_pushcclosure (L, &CFunc::getWPtrProperty <T,U>, 1);
1385 lua_pushvalue (L, -1);
1386 rawsetfield (L, -4, name);
1387 rawsetfield (L, -2, name);
1393 // Add to __propset in class table.
1394 rawgetfield (L, -2, "__propset");
1395 assert (lua_istable (L, -1));
1396 new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
1397 lua_pushcclosure (L, &CFunc::setWPtrProperty <T,U>, 1);
1398 rawsetfield (L, -2, name);
1402 set_shared_class ();
1403 assert (lua_istable (L, -1));
1404 // Add to __propget in class and const tables.
1406 rawgetfield (L, -2, "__propget");
1407 rawgetfield (L, -4, "__propget");
1408 new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
1409 lua_pushcclosure (L, &CFunc::getPtrProperty <T,U>, 1);
1410 lua_pushvalue (L, -1);
1411 rawsetfield (L, -4, name);
1412 rawsetfield (L, -2, name);
1418 // Add to __propset in class table.
1419 rawgetfield (L, -2, "__propset");
1420 assert (lua_istable (L, -1));
1421 new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
1422 lua_pushcclosure (L, &CFunc::setPtrProperty <T,U>, 1);
1423 rawsetfield (L, -2, name);
1431 Namespace endClass ()
1433 return Namespace (this);
1437 void set_weak_class () {
1439 lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <boost::weak_ptr<T> >::getStaticKey ());
1440 rawgetfield (L, -1, "__class");
1441 rawgetfield (L, -1, "__const");
1445 void set_shared_class () {
1447 lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <boost::shared_ptr<T> >::getStaticKey ());
1448 rawgetfield (L, -1, "__class");
1449 rawgetfield (L, -1, "__const");
1453 Class<boost::shared_ptr<T> > shared;
1454 Class<boost::weak_ptr<T> > weak;
1459 //----------------------------------------------------------------------------
1461 Open the global namespace for registrations.
1463 explicit Namespace (lua_State* L_)
1466 #ifdef LUABINDINGDOC
1471 lua_getglobal (L, "_G");
1475 #ifdef LUABINDINGDOC
1477 Namespace const * _parent;
1480 //----------------------------------------------------------------------------
1482 Open a namespace for registrations.
1484 The namespace is created if it doesn't already exist.
1485 The parent namespace is at the top of the Lua stack.
1487 Namespace (char const* name, Namespace const* parent)
1490 #ifdef LUABINDINGDOC
1491 , _name (parent->_name + name + ":")
1495 m_stackSize = parent->m_stackSize + 1;
1496 parent->m_stackSize = 0;
1498 assert (lua_istable (L, -1));
1499 rawgetfield (L, -1, name);
1500 if (lua_isnil (L, -1))
1505 lua_pushvalue (L, -1);
1506 lua_setmetatable (L, -2);
1507 lua_pushcfunction (L, &CFunc::indexMetaMethod);
1508 rawsetfield (L, -2, "__index");
1509 lua_pushcfunction (L, &CFunc::newindexMetaMethod);
1510 rawsetfield (L, -2, "__newindex");
1512 rawsetfield (L, -2, "__propget");
1514 rawsetfield (L, -2, "__propset");
1515 lua_pushvalue (L, -1);
1516 rawsetfield (L, -3, name);
1518 lua_pushcfunction (L, &tostringMetaMethod);
1519 rawsetfield (L, -2, "__tostring");
1524 //----------------------------------------------------------------------------
1526 Creates a continued registration from a child namespace.
1528 explicit Namespace (Namespace const* child)
1531 #ifdef LUABINDINGDOC
1532 , _name (child->_parent ? child->_parent->_name : "")
1533 , _parent (child->_parent ? child->_parent->_parent : NULL)
1536 m_stackSize = child->m_stackSize - 1;
1537 child->m_stackSize = 1;
1540 // It is not necessary or valid to call
1541 // endNamespace() for the global namespace!
1543 assert (m_stackSize != 0);
1546 //----------------------------------------------------------------------------
1548 Creates a continued registration from a child class.
1550 explicit Namespace (ClassBase const* child)
1553 #ifdef LUABINDINGDOC
1554 , _name (child->_parent ? child->_parent->_name : "")
1555 , _parent (child->_parent ? child->_parent->_parent : NULL)
1558 m_stackSize = child->m_stackSize - 3;
1559 child->m_stackSize = 3;
1564 //----------------------------------------------------------------------------
1568 Ownership of the stack is transferred to the new object. This happens
1569 when the compiler emits temporaries to hold these objects while chaining
1570 registrations across namespaces.
1572 Namespace (Namespace const& other) : L (other.L)
1574 m_stackSize = other.m_stackSize;
1575 other.m_stackSize = 0;
1576 #ifdef LUABINDINGDOC
1577 _name = other._name;
1578 _parent = other._parent;
1582 //----------------------------------------------------------------------------
1584 Closes this namespace registration.
1591 //----------------------------------------------------------------------------
1593 Open the global namespace.
1595 static Namespace getGlobalNamespace (lua_State* L)
1597 return Namespace (L);
1600 //----------------------------------------------------------------------------
1602 Open a new or existing namespace for registrations.
1604 Namespace beginNamespace (char const* name)
1606 return Namespace (name, this);
1609 //----------------------------------------------------------------------------
1611 Continue namespace registration in the parent.
1613 Do not use this on the global namespace.
1615 Namespace endNamespace ()
1617 return Namespace (this);
1620 //----------------------------------------------------------------------------
1622 Add or replace a variable.
1625 Namespace& addVariable (char const* name, T* pt, bool isWritable = true)
1627 assert (lua_istable (L, -1));
1629 rawgetfield (L, -1, "__propget");
1630 assert (lua_istable (L, -1));
1631 lua_pushlightuserdata (L, pt);
1632 lua_pushcclosure (L, &CFunc::getVariable <T>, 1);
1633 rawsetfield (L, -2, name);
1636 rawgetfield (L, -1, "__propset");
1637 assert (lua_istable (L, -1));
1640 lua_pushlightuserdata (L, pt);
1641 lua_pushcclosure (L, &CFunc::setVariable <T>, 1);
1645 lua_pushstring (L, name);
1646 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
1648 rawsetfield (L, -2, name);
1654 template <typename U>
1655 Namespace& addConst (char const* name, const U val)
1657 DATADOC ("Constant/Enum", name, val)
1658 assert (lua_istable (L, -1));
1659 rawgetfield (L, -1, "__propget");
1660 new (lua_newuserdata (L, sizeof (val))) U (val);
1661 lua_pushcclosure (L, &CFunc::getConst <U>, 1);
1662 rawsetfield (L, -2, name);
1665 rawgetfield (L, -1, "__propset");
1666 assert (lua_istable (L, -1));
1667 lua_pushstring (L, name);
1668 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
1669 rawsetfield (L, -2, name);
1674 //----------------------------------------------------------------------------
1676 Add or replace a property.
1678 If the set function is omitted or null, the property is read-only.
1681 template <class TG, class TS>
1682 Namespace& addProperty (char const* name, TG (*get) (), void (*set)(TS) = 0)
1684 assert (lua_istable (L, -1));
1686 rawgetfield (L, -1, "__propget");
1687 assert (lua_istable (L, -1));
1688 typedef TG (*get_t) ();
1689 new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
1690 lua_pushcclosure (L, &CFunc::Call <TG (*) (void)>::f, 1);
1691 rawsetfield (L, -2, name);
1694 rawgetfield (L, -1, "__propset");
1695 assert (lua_istable (L, -1));
1698 typedef void (*set_t) (TS);
1699 new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
1700 lua_pushcclosure (L, &CFunc::Call <void (*) (TS)>::f, 1);
1704 lua_pushstring (L, name);
1705 lua_pushcclosure (L, &CFunc::readOnlyError, 1);
1707 rawsetfield (L, -2, name);
1714 //----------------------------------------------------------------------------
1716 Add or replace a free function.
1719 Namespace& addFunction (char const* name, FP const fp)
1721 FUNDOC ("Free Function", name, FP)
1722 assert (lua_istable (L, -1));
1724 new (lua_newuserdata (L, sizeof (fp))) FP (fp);
1725 lua_pushcclosure (L, &CFunc::Call <FP>::f, 1);
1726 rawsetfield (L, -2, name);
1732 Namespace& addRefFunction (char const* name, FP const fp)
1734 FUNDOC ("Free Function RefReturn", name, FP)
1735 assert (lua_istable (L, -1));
1737 new (lua_newuserdata (L, sizeof (fp))) FP (fp);
1738 lua_pushcclosure (L, &CFunc::CallRef <FP>::f, 1);
1739 rawsetfield (L, -2, name);
1744 //----------------------------------------------------------------------------
1746 Add or replace a array type
1749 template <typename T>
1750 Namespace registerArray (char const* name)
1752 return Array <T> (name, this).endArray();
1756 //----------------------------------------------------------------------------
1758 Add or replace a lua_CFunction.
1760 Namespace& addCFunction (char const* name, int (*const fp)(lua_State*))
1762 DATADOC ("Free C Function", name, fp)
1763 lua_pushcfunction (L, fp);
1764 rawsetfield (L, -2, name);
1769 //----------------------------------------------------------------------------
1771 Open a new or existing class for registrations.
1774 Class <T> beginClass (char const* name)
1776 return Class <T> (name, this);
1779 /** weak & shared pointer class */
1781 WSPtrClass <T> beginWSPtrClass (char const* name)
1783 return WSPtrClass <T> (name, this)
1788 //----------------------------------------------------------------------------
1790 template <class K, class V>
1791 Class<std::map<K, V> > beginStdMap (char const* name)
1793 typedef std::map<K, V> LT;
1794 typedef std::pair<const K, V> T;
1796 typedef typename std::map<K, V>::size_type T_SIZE;
1798 return beginClass<LT> (name)
1799 .addVoidConstructor ()
1800 .addFunction ("empty", <::empty)
1801 .addFunction ("size", <::size)
1802 .addFunction ("clear", (void (LT::*)())<::clear)
1803 .addFunction ("count", (T_SIZE (LT::*)(const K&) const)<::count)
1804 .addExtCFunction ("add", &CFunc::tableToMap<K, V>)
1805 .addExtCFunction ("iter", &CFunc::mapIter<K, V>)
1806 .addExtCFunction ("table", &CFunc::mapToTable<K, V>)
1807 .addExtCFunction ("at", &CFunc::mapAt<K, V>);
1811 Class<std::set<T> > beginStdSet (char const* name)
1813 typedef std::set<T> LT;
1814 return beginClass<LT> (name)
1815 .addVoidConstructor ()
1816 .addFunction ("clear", (void (LT::*)())<::clear)
1817 .addFunction ("empty", <::empty)
1818 .addFunction ("size", <::size)
1819 .addExtCFunction ("add", &CFunc::tableToSet<T>)
1820 .addExtCFunction ("iter", &CFunc::setIter<T>)
1821 .addExtCFunction ("table", &CFunc::setToTable<T>);
1824 template <unsigned int T>
1825 Class<std::bitset<T> > beginStdBitSet (char const* name)
1827 typedef std::bitset<T> BS;
1828 return beginClass<BS> (name)
1829 .addVoidConstructor ()
1830 .addFunction ("reset", (BS& (BS::*)())&BS::reset)
1831 .addFunction ("set", (BS& (BS::*)(size_t, bool))&BS::set)
1832 .addFunction ("count", &BS::count)
1833 .addFunction ("any", &BS::any)
1834 .addFunction ("none", &BS::none)
1835 .addFunction ("test", &BS::test)
1836 .addFunction ("size", &BS::size)
1837 .addExtCFunction ("add", &CFunc::tableToBitSet<T>)
1838 .addExtCFunction ("table", &CFunc::bitSetToTable<T>);
1842 Class<std::list<T> > beginConstStdList (char const* name)
1844 typedef std::list<T> LT;
1845 return beginClass<LT> (name)
1846 .addVoidConstructor ()
1847 .addFunction ("empty", <::empty)
1848 .addFunction ("size", <::size)
1849 .addFunction ("reverse", <::reverse)
1850 .addFunction ("front", static_cast<const T& (LT::*)() const>(<::front))
1851 .addFunction ("back", static_cast<const T& (LT::*)() const>(<::back))
1852 .addExtCFunction ("iter", &CFunc::listIter<T, LT>)
1853 .addExtCFunction ("table", &CFunc::listToTable<T, LT>);
1857 Class<std::list<T> > beginStdList (char const* name)
1859 typedef std::list<T> LT;
1860 return beginConstStdList<T> (name)
1861 .addFunction ("unique", (void (LT::*)())<::unique)
1862 .addFunction ("push_back", (void (LT::*)(const T&))<::push_back)
1863 .addExtCFunction ("add", &CFunc::tableToList<T, LT>);
1867 Class<std::vector<T> > beginStdVector (char const* name)
1869 typedef std::vector<T> LT;
1870 typedef typename std::vector<T>::reference T_REF;
1871 typedef typename std::vector<T>::size_type T_SIZE;
1873 return beginClass<LT> (name)
1874 .addVoidConstructor ()
1875 .addFunction ("empty", <::empty)
1876 .addFunction ("size", <::size)
1877 .addFunction ("push_back", (void (LT::*)(const T&))<::push_back)
1878 .addFunction ("at", (T_REF (LT::*)(T_SIZE))<::at)
1879 .addExtCFunction ("add", &CFunc::tableToList<T, LT>)
1880 .addExtCFunction ("iter", &CFunc::listIter<T, LT>)
1881 .addExtCFunction ("table", &CFunc::listToTable<T, LT>);
1884 //----------------------------------------------------------------------------
1887 Class<boost::shared_ptr<std::list<T> > > beginPtrStdList (char const* name)
1889 typedef std::list<T> LT;
1890 return beginClass<boost::shared_ptr<LT> > (name)
1891 //.addVoidPtrConstructor<LT> ()
1892 .addPtrFunction ("empty", <::empty)
1893 .addPtrFunction ("size", <::size)
1894 .addPtrFunction ("reverse", <::reverse)
1895 .addPtrFunction ("unique", (void (LT::*)())<::unique)
1896 .addPtrFunction ("push_back", (void (LT::*)(const T&))<::push_back)
1897 .addExtCFunction ("add", &CFunc::ptrTableToList<T, LT>)
1898 .addExtCFunction ("iter", &CFunc::ptrListIter<T, LT>)
1899 .addExtCFunction ("table", &CFunc::ptrListToTable<T, LT>);
1903 Class<boost::shared_ptr<std::vector<T> > > beginPtrStdVector (char const* name)
1905 typedef std::vector<T> LT;
1906 typedef typename std::vector<T>::reference T_REF;
1907 typedef typename std::vector<T>::size_type T_SIZE;
1909 return beginClass<boost::shared_ptr<LT> > (name)
1910 //.addVoidPtrConstructor<LT> ()
1911 .addPtrFunction ("empty", <::empty)
1912 .addPtrFunction ("empty", <::empty)
1913 .addPtrFunction ("size", <::size)
1914 .addPtrFunction ("push_back", (void (LT::*)(const T&))<::push_back)
1915 .addPtrFunction ("at", (T_REF (LT::*)(T_SIZE))<::at)
1916 .addExtCFunction ("add", &CFunc::ptrTableToList<T, LT>)
1917 .addExtCFunction ("iter", &CFunc::ptrListIter<T, LT>)
1918 .addExtCFunction ("table", &CFunc::ptrListToTable<T, LT>);
1921 //----------------------------------------------------------------------------
1923 Derive a new class for registrations.
1925 To continue registrations for the class later, use beginClass().
1926 Do not call deriveClass() again.
1928 template <class T, class U>
1929 Class <T> deriveClass (char const* name)
1931 CLASSDOC ("[C] Derived Class", _name << name, type_name <T>(), type_name <U>())
1932 return Class <T> (name, this, ClassInfo <U>::getStaticKey ());
1935 template <class T, class U>
1936 WSPtrClass <T> deriveWSPtrClass (char const* name)
1939 CLASSDOC ("[C] Derived Class", _name << name, type_name <boost::shared_ptr<T> >(), type_name <boost::shared_ptr<U> >())
1940 CLASSDOC ("[C] Derived Class", _name << name, type_name <boost::weak_ptr<T> >(), type_name <boost::weak_ptr<U> >())
1941 CLASSDOC ("[C] Derived Pointer Class", _name << name, type_name <T>(), type_name <U>())
1942 return WSPtrClass <T> (name, this,
1943 ClassInfo <boost::shared_ptr<U> >::getStaticKey (),
1944 ClassInfo <boost::weak_ptr<U> >::getStaticKey ())
1951 //------------------------------------------------------------------------------
1953 Retrieve the global namespace.
1955 It is recommended to put your namespace inside the global namespace, and
1956 then add your classes and functions to it, rather than adding many classes
1957 and functions directly to the global namespace.
1959 inline Namespace getGlobalNamespace (lua_State* L)
1961 return Namespace::getGlobalNamespace (L);
1972 /* vim: set et sw=2: */