diff --git a/include/boost/iterator_adaptors.hpp b/include/boost/iterator_adaptors.hpp index 815e219..5a5cfc8 100644 --- a/include/boost/iterator_adaptors.hpp +++ b/include/boost/iterator_adaptors.hpp @@ -12,6 +12,18 @@ // // Revision History: +// 09 Feb 2001 Jeremy Siek +// Added iterator constructor to allow const adaptor +// from non-const adaptee. +// +// Changed make_xxx to pass iterators by-value to +// get arrays converted to pointers. +// +// Removed InnerIterator template parameter from +// indirect_iterator_generator. +// +// Rearranged parameters for make_filter_iterator +// // 07 Feb 2001 Jeremy Siek // Removed some const iterator adaptor generators. // @@ -416,6 +428,13 @@ public: policies().initialize(iter()); } + // To allow construction of const adaptor from non-const adaptee. + template + iterator_adaptor(const OtherIterator& it, const Policies& p = Policies()) + : m_iter_p(it, p) { + policies().initialize(iter()); + } + template iterator_adaptor (const iterator_adaptor& src) @@ -601,7 +620,7 @@ public: template inline typename transform_iterator_generator::type make_transform_iterator( - const Iterator& base, + Iterator base, const AdaptableUnaryFunction& f = AdaptableUnaryFunction()) { typedef typename transform_iterator_generator::type result_t; @@ -631,9 +650,9 @@ struct indirect_iterator_policies : public default_iterator_policies }; template mutable indirect iterator; Immutable -> immutable indirect iterator - class InnerIterator = typename boost::detail::iterator_traits::value_type, - class InnerTraits = boost::detail::iterator_traits + // Mutable reference and pointer type in traits class -> mutable indirect iterator; + // Immutable reference and pointer type in traits class -> immutable indirect iterator + class InnerTraits = boost::detail::iterator_traits::value_type> > class indirect_iterator_generator { @@ -652,36 +671,38 @@ public: template , - class InnerIterator = typename boost::detail::iterator_traits::value_type, - class InnerTraits = boost::detail::iterator_traits + class InnerTraits = boost::detail::iterator_traits::value_type> > struct indirect_iterator_pair_generator { typedef typename indirect_iterator_generator::type iterator; + InnerTraits>::type iterator; typedef typename indirect_iterator_generator::type const_iterator; + ConstInnerTraits>::type const_iterator; }; -template -inline typename indirect_iterator_generator::type -make_indirect_iterator(OuterIterator outer, InnerIterator, InnerTraits) -{ - typedef typename indirect_iterator_generator - ::type result_t; - return result_t(outer); -} - -#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) +// WARNING: Do not use the one argument version of +// make_indirect_iterator() if the iterator is a builtin pointer type +// and if your compiler does not support partial specialization. template inline typename indirect_iterator_generator::type -make_indirect_iterator(OuterIterator outer) +make_indirect_iterator(OuterIterator base) { typedef typename indirect_iterator_generator ::type result_t; - return result_t(outer); + return result_t(base); +} + +// Tried to allow InnerTraits to be provided by explicit template +// argument to the function, but could not get it to work. -Jeremy Siek +template +inline typename indirect_iterator_generator::type +make_indirect_iterator(OuterIterator base, InnerTraits) +{ + typedef typename indirect_iterator_generator + ::type result_t; + return result_t(base); } -#endif //============================================================================= @@ -728,6 +749,10 @@ struct reverse_iterator_generator Traits> type; }; +// WARNING: Do not use the one template parameter version of +// make_reverse_iterator() if the iterator is a builtin pointer type +// and if your compiler does not support partial specialization. + template inline typename reverse_iterator_generator::type make_reverse_iterator(Iterator base) @@ -747,6 +772,7 @@ make_reverse_iterator(Iterator base, Traits* = 0) return result_t(base); } + //============================================================================= // Projection Iterators Adaptor @@ -799,7 +825,9 @@ struct projection_iterator_pair_generator { template inline typename projection_iterator_generator::type -make_projection_iterator(Iterator iter, AdaptableUnaryFunction f) +make_projection_iterator( + Iterator iter, + const AdaptableUnaryFunction& f = AdaptableUnaryFunction()) { typedef typename projection_iterator_generator::type result_t; return result_t(iter, f); @@ -807,7 +835,9 @@ make_projection_iterator(Iterator iter, AdaptableUnaryFunction f) template inline typename const_projection_iterator_generator::type -make_const_projection_iterator(Iterator iter, AdaptableUnaryFunction f) +make_const_projection_iterator( + Iterator iter, + const AdaptableUnaryFunction& f = AdaptableUnaryFunction()) { typedef typename const_projection_iterator_generator::type result_t; return result_t(iter, f); @@ -856,27 +886,38 @@ public: }; -template -inline typename filter_iterator_generator::type -make_filter_iterator(Iterator first, Iterator last, Predicate p, Traits) -{ - typedef filter_iterator_generator Gen; - typedef typename Gen::policies_type policies_t; - typedef typename Gen::type result_t; - return result_t(first, policies_t(p, last)); -} +// WARNING: Do not use this three argument version of +// make_filter_iterator() if the iterator is a builtin pointer type +// and if your compiler does not support partial specialization. -#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) +// If the Predicate argument "p" is left out, an explicit template +// argument for the Predicate is required, i.e., +// make_filter_iterator(f, l). template inline typename filter_iterator_generator::type -make_filter_iterator(Iterator first, Iterator last, Predicate p) +make_filter_iterator(Iterator first, Iterator last, const Predicate& p = Predicate()) { typedef filter_iterator_generator Gen; typedef typename Gen::policies_type policies_t; typedef typename Gen::type result_t; return result_t(first, policies_t(p, last)); } -#endif + +// Supply the Traits type via an exaplicit template argument, i.e., +// make_filter_iterator(f, l). +// +// If the Predicate argument "p" is left out, an explicit template +// argument for the Predicate is also required, i.e., +// make_filter_iterator(f, l). +template +inline typename filter_iterator_generator::type +make_filter_iterator(Iterator first, Iterator last, const Predicate& p = Predicate(), Traits* = 0) +{ + typedef filter_iterator_generator Gen; + typedef typename Gen::policies_type policies_t; + typedef typename Gen::type result_t; + return result_t(first, policies_t(p, last)); +} } // namespace boost