Skip to content

Commit cfbaa35

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

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

include/boost/iterator/transform_iterator.hpp

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

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

72103
template< typename UnaryFunc, typename Iterator, typename Reference, typename Value >
73104
class transform_iterator :
105+
public detail::transform_iterator_category_base< Iterator >::type,
74106
public detail::transform_iterator_base< UnaryFunc, Iterator, Reference, Value >::type,
75107
private boost::empty_value< UnaryFunc >
76108
{
@@ -82,6 +114,8 @@ class transform_iterator :
82114

83115
public:
84116

117+
using iterator_category = typename detail::transform_iterator_category_base< Iterator >::type;
118+
85119
transform_iterator() = default;
86120

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

0 commit comments

Comments
 (0)