Skip to content

Commit d47f252

Browse files
committed
Force to inherit transform_iterator_tag.
1 parent 8c72b93 commit d47f252

1 file changed

Lines changed: 30 additions & 0 deletions

File tree

include/boost/iterator/transform_iterator.hpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,34 @@ struct transform_iterator_default_reference
3535
using type = decltype(std::declval< UnaryFunc const& >()(*std::declval< Iterator >()));
3636
};
3737

38+
template < typename Iterator, class Enable = void >
39+
struct transform_iterator_category_base {
40+
};
41+
42+
template <class IterCategory>
43+
struct transform_iterator_category_base_impl {
44+
using type = IterCategory;
45+
};
46+
47+
template <>
48+
struct transform_iterator_category_base_impl<std::output_iterator_tag> {
49+
using type = std::input_iterator_tag;
50+
};
51+
52+
template<class T, class R = void>
53+
struct enable_if_type { using type = R; };
54+
55+
template < typename Iterator >
56+
struct transform_iterator_category_base<
57+
Iterator,
58+
typename enable_if_type<typename std::iterator_traits<Iterator>::iterator_category>::type
59+
>
60+
{
61+
using type = typename transform_iterator_category_base_impl<
62+
typename std::iterator_traits<Iterator>::iterator_category
63+
>::type;
64+
};
65+
3866
// Compute the iterator_adaptor instantiation to be used for transform_iterator
3967
template< typename UnaryFunc, typename Iterator, typename Reference, typename Value >
4068
struct transform_iterator_base
@@ -82,6 +110,8 @@ class transform_iterator :
82110

83111
public:
84112

113+
using iterator_category = typename detail::transform_iterator_category_base< Iterator >::type;
114+
85115
transform_iterator() = default;
86116

87117
transform_iterator(Iterator const& x, UnaryFunc f) :

0 commit comments

Comments
 (0)