1 // Copyright Daniel Wallin 2007. Use, modification and distribution is 2 // subject to the Boost Software License, Version 1.0. (See accompanying 3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 4 5 #include "test.hpp" 6 7 #include <luabind/luabind.hpp> 8 #include <luabind/iterator_policy.hpp> 9 #include <boost/iterator/iterator_adaptor.hpp> 10 11 struct container 12 { containercontainer13 container() 14 { 15 for (int i = 0; i < 5; ++i) 16 data[i] = i + 1; 17 } 18 19 struct iterator 20 : boost::iterator_adaptor<iterator, int*> 21 { 22 static std::size_t alive; 23 iteratorcontainer::iterator24 iterator(int* p) 25 : iterator::iterator_adaptor_(p) 26 { 27 ++alive; 28 } 29 iteratorcontainer::iterator30 iterator(iterator const& other) 31 : iterator::iterator_adaptor_(other) 32 { 33 ++alive; 34 } 35 ~iteratorcontainer::iterator36 ~iterator() 37 { 38 --alive; 39 } 40 }; 41 begincontainer42 iterator begin() 43 { 44 return iterator(data); 45 } 46 endcontainer47 iterator end() 48 { 49 return iterator(data + 5); 50 } 51 52 int data[5]; 53 }; 54 55 std::size_t container::iterator::alive = 0; 56 57 struct cls 58 { 59 container iterable; 60 }; 61 test_main(lua_State * L)62void test_main(lua_State* L) 63 { 64 using namespace luabind; 65 66 module(L) 67 [ 68 class_<cls>("cls") 69 .def(constructor<>()) 70 .def_readonly("iterable", &cls::iterable, return_stl_iterator) 71 ]; 72 73 DOSTRING(L, 74 "x = cls()\n" 75 "sum = 0\n" 76 "for i in x.iterable do\n" 77 " sum = sum + i\n" 78 "end\n" 79 "assert(sum == 15)\n" 80 "collectgarbage('collect')\n" 81 ); 82 83 assert(container::iterator::alive == 0); 84 } 85 86