@@ -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
3967template < typename UnaryFunc, typename Iterator, typename Reference, typename Value >
4068struct transform_iterator_base
@@ -82,6 +110,8 @@ class transform_iterator :
82110
83111public:
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