test_iterator.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. #include "test.hpp"
  5. #include <luabind/luabind.hpp>
  6. #include <luabind/iterator_policy.hpp>
  7. #include <boost/iterator/iterator_adaptor.hpp>
  8. struct container
  9. {
  10. container()
  11. {
  12. for (int i = 0; i < 5; ++i)
  13. data[i] = i + 1;
  14. }
  15. struct iterator
  16. : boost::iterator_adaptor<iterator, int*>
  17. {
  18. static std::size_t alive;
  19. iterator(int* p)
  20. : iterator::iterator_adaptor_(p)
  21. {
  22. ++alive;
  23. }
  24. iterator(iterator const& other)
  25. : iterator::iterator_adaptor_(other)
  26. {
  27. ++alive;
  28. }
  29. ~iterator()
  30. {
  31. --alive;
  32. }
  33. };
  34. iterator begin()
  35. {
  36. return iterator(data);
  37. }
  38. iterator end()
  39. {
  40. return iterator(data + 5);
  41. }
  42. int data[5];
  43. };
  44. std::size_t container::iterator::alive = 0;
  45. struct cls
  46. {
  47. container iterable;
  48. };
  49. void test_main(lua_State* L)
  50. {
  51. using namespace luabind;
  52. module(L)
  53. [
  54. class_<cls>("cls")
  55. .def(constructor<>())
  56. .def_readonly("iterable", &cls::iterable, return_stl_iterator)
  57. ];
  58. DOSTRING(L,
  59. "x = cls()\n"
  60. "sum = 0\n"
  61. "for i in x.iterable do\n"
  62. " sum = sum + i\n"
  63. "end\n"
  64. "assert(sum == 15)\n"
  65. "collectgarbage('collect')\n"
  66. );
  67. assert(container::iterator::alive == 0);
  68. }