#include #include #include #include #include #include class iterate_rnd { private: size_t limit_; public: typedef char result_type; static result_type eof; iterate_rnd() : limit_(104857600) {} iterate_rnd(size_t limit) : limit_(limit) {} result_type operator()() { if (limit_ == 0) return eof; limit_--; return rand() & 0x7F; } }; iterate_rnd::result_type iterate_rnd::eof = iterate_rnd::result_type(-1); using namespace boost::spirit; typedef multi_pass< iterate_rnd, iterator_policies::default_policy< iterator_policies::ref_counted, iterator_policies::no_check, iterator_policies::functor_input, iterator_policies::split_std_deque > > functor_multi_pass_type; int main() { functor_multi_pass_type first = functor_multi_pass_type(iterate_rnd()); functor_multi_pass_type last; std::string input; { functor_multi_pass_type copy(first); while (first != last) { ++first; } std::cout << "Iterator offset at this point is " << std::distance(copy, first) << std::endl; } first.clear_queue(); /* only one reference to the shared memory object is * left, but no memory reset is triggered within the iterator */ std::cout << "Press enter to exit. Check memory usage at this point."; std::getline(std::cin, input); return 0; }