Boost logo

Boost Users :

Subject: [Boost-users] [context] boost::coroutines::asymmetric_coroutine<T>::pull_type iterator does not properly model InputIterator
From: Mueller-Roemer, Johannes Sebastian (Johannes.Sebastian.Mueller-Roemer_at_[hidden])
Date: 2015-02-16 03:22:56

I’m currently on Boost 1.56 so this might have been fixed by now, but in a simple test Boost.Coroutine fails to properly model the InputIterator concept, because *it++ does not conform to the operational semantics { T tmp = *it; ++it; return tmp; } required by the standard.

The failing program:

#include <boost/coroutine/asymmetric_coroutine.hpp>
#include <iostream>

template<typename Continuation>
auto foo(Continuation && yield) -> void
      yield(", ");

//using T = char const *;
using T = std::string;

auto foo() -> boost::coroutines::asymmetric_coroutine<T>::pull_type
      using namespace boost::coroutines;
      return asymmetric_coroutine<T>::pull_type{
            [](asymmetric_coroutine<T>::push_type& yield) { foo(yield); }

auto main(int, char **) -> int
      auto f = foo();
      for(auto it = boost::begin(f); it != boost::end(f);)
            std::cout << *it++;

Which (on my machine) outputs:

, World!
X☺à r2 ` , ` , Ç2 Ç

Failing to model the InputIterator concept is bad, because then it isn’t any kind of standards-conforming iterator at all. Interestingly, if T is char const * and not std::string the program works as expected. Is there some other subtle bug at work here?

Johannes S. Mueller-Roemer, MSc
Wiss. Mitarbeiter - Interactive Engineering Technologies (IET)

Fraunhofer-Institut für Graphische Datenverarbeitung IGD
Fraunhoferstr. 5 | 64283 Darmstadt | Germany
Tel +49 6151 155-606 | Fax +49 6151 155-139
johannes.mueller-roemer_at_[hidden] |

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at