Thanks Mikhail, it solved the problem!
Such a trivial error... :-(
Actually it was the pull_type, not the
push_type, but I guess this is also what you have meant.
In the updated version I store also
the function object inside the generator.
template
<typename
TOutput>
using
GeneratorBlockYield
= typename
boost::coroutines::asymmetric_coroutine<TOutput>::push_type;
template<typename
TOutput>
class
GeneratorBlockEnumerator
: public
IEnumerator<TOutput>
{
public:
explicit
GeneratorBlockEnumerator(std::function<void(GeneratorBlockYield<TOutput>&)>
generator)
: _firstMoveNextCall(true)
, _generatorFunctor(generator)
, _generatorPuller(_generatorFunctor)
{
}
~GeneratorBlockEnumerator() override
= default;
bool
MoveNext() override
{
auto
generatorNotFinished = static_cast<bool>(_generatorPuller);
if
(!generatorNotFinished)
return
false;
if
(_firstMoveNextCall)
{
_firstMoveNextCall
= false;
}
else
{
_generatorPuller();
}
generatorNotFinished
= static_cast<bool>(_generatorPuller);
return
generatorNotFinished;
}
TOutput
Current() const
override
{
return
_generatorPuller.get();
}
private:
bool
_firstMoveNextCall;
std::function<void(GeneratorBlockYield<TOutput>&)>
_generatorFunctor;
typename
boost::coroutines::asymmetric_coroutine<TOutput>::pull_type
_generatorPuller;
};
From:
Mikhail Strelnikov
<mikhail.strelnikov@gmail.com>
To:
boost-users@lists.boost.org
Date:
17.09.2015 04:24
Subject:
[Boost-users]
Problems with boost::coroutines with lambda captures
Sent by:
"Boost-users"
<boost-users-bounces@lists.boost.org>
> Sumamry: somehow the captured smart pointer gets
destroyed+corrupted
> when I yield from the coroutine, but the local copy
survives. When I use
GeneratorBlockEnumerator gets parameter (std::function)
by value (temporary function gets created before constructor and destroyed
right after). Then this temporary function passed by reference to push_type.
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users