Merge branch 'support-lambda-expression' of https://github.com/nekko1119/iterator into nekko1119-support-lambda-expression

This commit is contained in:
Edward Diener 2016-12-16 04:22:44 -05:00
commit c86db2ec8a
2 changed files with 22 additions and 4 deletions

View File

@ -17,6 +17,7 @@
#include <boost/iterator/iterator_facade.hpp>
#include <boost/none.hpp>
#include <boost/optional/optional.hpp>
#include <boost/utility/result_of.hpp>
namespace boost {
@ -28,9 +29,9 @@ namespace iterators {
class function_input_iterator
: public iterator_facade<
function_input_iterator<Function, Input>,
typename Function::result_type,
BOOST_DEDUCED_TYPENAME result_of<Function ()>::type,
single_pass_traversal_tag,
typename Function::result_type const &
BOOST_DEDUCED_TYPENAME result_of<Function ()>::type const &
>
{
public:
@ -46,7 +47,7 @@ namespace iterators {
++state;
}
typename Function::result_type const &
BOOST_DEDUCED_TYPENAME result_of<Function ()>::type const &
dereference() const {
return (value ? value : value = (*f)()).get();
}
@ -58,7 +59,7 @@ namespace iterators {
private:
Function * f;
Input state;
mutable optional<typename Function::result_type> value;
mutable optional<BOOST_DEDUCED_TYPENAME result_of<Function ()>::type> value;
};
template <class Function, class Input>

View File

@ -96,6 +96,23 @@ int main(int argc, char * argv[])
assert(generated[i] == 42 + i);
cout << "function iterator test with stateful function object successful." << endl;
#if !defined(BOOST_NO_CXX11_LAMBDAS) && !defined(BOOST_NO_CXX11_AUTO_DECLARATIONS)
// test the iterator with lambda expressions
int num = 42;
auto lambda_generator = [&num] { return num++; };
vector<int>().swap(generated);
copy(
boost::make_function_input_iterator(lambda_generator, 0),
boost::make_function_input_iterator(lambda_generator, 10),
back_inserter(generated)
);
assert(generated.size() == 10);
for(std::size_t i = 0; i != 10; ++i)
assert(generated[i] == 42 + i);
cout << "function iterator test with lambda expressions successful." << endl;
#endif // BOOST_NO_CXX11_LAMBDAS
return 0;
}