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