@@ -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
3970template < typename UnaryFunc, typename Iterator, typename Reference, typename Value >
4071struct transform_iterator_base
@@ -71,6 +102,7 @@ struct transform_iterator_base
71102
72103template < typename UnaryFunc, typename Iterator, typename Reference, typename Value >
73104class 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
83115public:
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