[range] Should the result of irange satisfy the BidirectionalRangeConcept?

Hi, I'm trying to define an enum_range and I based my implementation on the one from irange. While writing my test I started just by checking that my enum_range satisfied the RandomAccessRangeConcept requirements and there were some errors with BidirectionalRangeConcept. I replaced by the result type of the irange function and the errors appear also there. It seems that there is an issue concerning the category tags ..\..\../boost/concept_check.hpp:212:13: error: conversion from 'boost::detail::iterator_category_with_traversal<std::input_iterator_tag, boost::random_access_traversal_tag>' to non-scalar type 'std::bidirectional_iterator_tag' requested Am I missing something? Best, Vicente == Test == #include <boost/range/concepts.hpp> #include <boost/range/irange.hpp> using namespace boost; BOOST_CONCEPT_ASSERT(( BidirectionalRangeConcept < iterator_range< range_detail::integer_iterator > > )); == Result == gcc.compile.c++ ..\..\..\bin.v2\libs\enums\test\enum_range__random_access_range_concept__pass.test\gcc-mingw-4.5.0\debug\enum_range\random_access_range_concept.pass.o In file included from ..\..\../boost/range/concepts.hpp:19:0, from ..\..\../boost/range/algorithm/equal.hpp:14, from ..\..\../boost/range/iterator_range_core.hpp:29, from ..\..\../boost/range/iterator_range.hpp:13, from ..\..\../boost/enums/enum_range.hpp:24, from enum_range\random_access_range_concept.pass.cpp:15: ..\..\../boost/concept_check.hpp: In destructor 'boost::Convertible<X, Y>::~Convertible() [with X = boost::detail::iterator_category_with_traversal<std::input_iterator_tag, boost::random_access_traversal_tag>, Y = std::bidirectional_iterator_tag]': ..\..\../boost/concept/detail/general.hpp:38:28: instantiated from 'static void boost::concepts::requirement<boost::concepts::failed************ Model::************>::failed() [with Model = boost::Convertible<boost::detail::iterator_category_with_traversal<std::input_iterator_tag, boost::random_access_traversal_tag>, std::bidirectional_iterator_tag>]' ..\..\../boost/concept_check.hpp:579:1: instantiated from 'boost::BidirectionalIterator::~BidirectionalIterator() [with TT = boost::range_detail::integer_iterator]' ..\..\../boost/concept_check.hpp:571:1: instantiated from 'static void boost::concepts::requirement<boost::concepts::failed************ Model::************>::failed() [with Model = boost::BidirectionalIteratorConcept<boost::range_detail::integer_iterator<int>
]' ..\..\../boost/range/concepts.hpp:333:1: instantiated from 'boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int>
' ..\..\../boost/concept/detail/has_constraints.hpp:42:5: instantiated from 'const bool boost::concepts::not_satisfied<boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int>
::value' ..\..\../boost/concept/detail/has_constraints.hpp:45:31: instantiated from 'boost::concepts::not_satisfied<boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int> ' ..\..\../boost/mpl/if.hpp:67:11: instantiated from 'boost::mpl::if_<boost::concepts::not_satisfied<boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int> , boost::concepts::constraint<boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int> , boost::concepts::requirement<boost::concepts::failed************ boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int> ::************> >' ..\..\../boost/concept/detail/general.hpp:56:1: instantiated from 'boost::concepts::requirement_ > >)>' enum_range\random_access_range_concept.pass.cpp:27:3: instantiated from here ..\..\../boost/concept_check.hpp:212:13: error: conversion from 'boost::detail::iterator_category_with_traversal<std::input_iterator_tag, boost::random_access_traversal_tag>' to non-scalar type 'std::bidirectional_iterator_tag' requested ..\..\../boost/concept_check.hpp: In destructor 'boost::Convertible<X, Y>::~Convertible() [with X = boost::detail::iterator_category_with_traversal<std::input_iterator_tag, boost::random_access_traversal_tag>, Y = std::forward_iterator_tag]': ..\..\../boost/concept/detail/general.hpp:38:28: instantiated from 'static void boost::concepts::requirement<boost::concepts::failed************ Model::************>::failed() [with Model = boost::Convertible<boost::detail::iterator_category_with_traversal<std::input_iterator_tag, boost::random_access_traversal_tag>, std::forward_iterator_tag>]' ..\..\../boost/concept_check.hpp:551:1: instantiated from 'boost::ForwardIterator::~ForwardIterator() [with TT = boost::range_detail::integer_iterator]' ..\..\../boost/concept/usage.hpp:22:29: instantiated from 'boost::concepts::usage_requirements::~usage_requirements() [with Model = boost::ForwardIterator<boost::range_detail::integer_iterator<int> ]' ..\..\../boost/concept/detail/general.hpp:38:28: instantiated from 'static void boost::concepts::requirement<boost::concepts::failed************ Model::************>::failed() [with Model = boost::concepts::usage_requirements<boost::ForwardIterator<boost::range_detail::integer_iterator<int> ]' ..\..\../boost/concept_check.hpp:546:1: instantiated from 'boost::ForwardIterator<boost::range_detail::integer_iterator<int> ' ..\..\../boost/concept_check.hpp:573:3: [ skipping 6 instantiation contexts ] ..\..\../boost/range/concepts.hpp:333:1: instantiated from 'boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int> ' ..\..\../boost/concept/detail/has_constraints.hpp:42:5: instantiated from 'const bool boost::concepts::not_satisfied<boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int> ::value' ..\..\../boost/concept/detail/has_constraints.hpp:45:31: instantiated from 'boost::concepts::not_satisfied<boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int> ' ..\..\../boost/mpl/if.hpp:67:11: instantiated from 'boost::mpl::if_<boost::concepts::not_satisfied<boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int> , boost::concepts::constraint<boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int> , boost::concepts::requirement<boost::concepts::failed************ boost::BidirectionalRangeConcept<boost::iterator_range<boost::range_detail::integer_iterator<int> ::************> >' ..\..\../boost/concept/detail/general.hpp:56:1: instantiated from 'boost::concepts::requirement_ > >)>' enum_range\random_access_range_concept.pass.cpp:27:3: instantiated from here ..\..\../boost/concept_check.hpp:212:13: error: conversion from 'boost::detail::iterator_category_with_traversal<std::input_iterator_tag, boost::random_access_traversal_tag>' to non-scalar type 'std::forward_iterator_tag' requested
-- View this message in context: http://boost.2283326.n4.nabble.com/range-Should-the-result-of-irange-satisfy... Sent from the Boost - Dev mailing list archive at Nabble.com.

On Sat, Mar 12, 2011 at 7:26 PM, Vicente Botet <vicente.botet@wanadoo.fr>wrote:
Hi,
I'm trying to define an enum_range and I based my implementation on the one from irange.
While writing my test I started just by checking that my enum_range satisfied the RandomAccessRangeConcept requirements and there were some errors with BidirectionalRangeConcept. I replaced by the result type of the irange function and the errors appear also there.
It seems that there is an issue concerning the category tags
..\..\../boost/concept_check.hpp:212:13: error: conversion from
'boost::detail::iterator_category_with_traversal<std::input_iterator_tag, boost::random_access_traversal_tag>' to non-scalar type 'std::bidirectional_iterator_tag' requested
Am I missing something?
You are almost certainly not missing anything. I have to look at some other iterator traversal category related issues particularly with the demotion of tags. I think there are some interoperability issues in this area. I need to make some time to review these issues, and put in new test cases. I'm a bit snowed under at work, but will try and get something done quickly. This issue is clearly affecting a few people now.
Best, Vicente
Thanks for the report, Neil Groves
participants (2)
-
Neil Groves
-
Vicente Botet