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)62 void 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