memgraph/include/utils/iterator/lambda_iterator.hpp

33 lines
798 B
C++
Raw Normal View History

#pragma once
#include "utils/iterator/iterator_base.hpp"
namespace iter
{
2016-08-19 00:43:06 +08:00
// Wraps lambda into interator with next().
// T - type of return value
2016-08-19 00:43:06 +08:00
// F - type of wraped lambda
template <class T, class F>
2016-08-19 00:43:06 +08:00
class LambdaIterator : public IteratorBase<T>
{
public:
2016-08-19 00:43:06 +08:00
LambdaIterator(F &&f) : func(std::move(f)) {}
Option<T> next() final { return func(); }
private:
F func;
};
2016-08-19 00:43:06 +08:00
// Wraps lambda which returns options as an iterator.
template <class F>
auto make_iterator(F &&f)
{
// Because function isn't receving or in any way using type T from
// FunctionIterator compiler can't deduce it thats way there is decltype in
// construction of FunctionIterator. Resoulting type of iter.next().take()
// is T.
2016-08-19 00:43:06 +08:00
return LambdaIterator<decltype(f().take()), F>(std::move(f));
}
}