From 4c60e26bf8cdf6602375eaab23a95f4849333fd6 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sat, 28 Nov 2009 05:12:29 +0000 Subject: [PATCH] Made sure that iterator_facade's nested ``::pointer`` type is always the same as what's returned from operator->. For input iterators, that wasn't always the case (see operator_arrow_proxy). Fixes #1019. [SVN r57989] --- include/boost/iterator/iterator_facade.hpp | 24 +++++++++++----------- test/iterator_facade.cpp | 6 ++++++ 2 files changed, 18 insertions(+), 12 deletions(-) mode change 100755 => 100644 test/iterator_facade.cpp diff --git a/include/boost/iterator/iterator_facade.hpp b/include/boost/iterator/iterator_facade.hpp index 967d60f..9696b50 100644 --- a/include/boost/iterator/iterator_facade.hpp +++ b/include/boost/iterator/iterator_facade.hpp @@ -105,6 +105,7 @@ namespace boost typedef typename remove_const::type value_type; + // Not the real associated pointer type typedef typename mpl::eval_if< boost::detail::iterator_writability_disabled , add_pointer @@ -617,6 +618,12 @@ namespace boost Value, CategoryOrTraversal, Reference, Difference > associated_types; + typedef boost::detail::operator_arrow_result< + typename associated_types::value_type + , Reference + , typename associated_types::pointer + > pointer_; + protected: // For use by derived classes typedef iterator_facade iterator_facade_; @@ -626,7 +633,9 @@ namespace boost typedef typename associated_types::value_type value_type; typedef Reference reference; typedef Difference difference_type; - typedef typename associated_types::pointer pointer; + + typedef typename pointer_::type pointer; + typedef typename associated_types::iterator_category iterator_category; reference operator*() const @@ -634,18 +643,9 @@ namespace boost return iterator_core_access::dereference(this->derived()); } - typename boost::detail::operator_arrow_result< - value_type - , reference - , pointer - >::type - operator->() const + pointer operator->() const { - return boost::detail::operator_arrow_result< - value_type - , reference - , pointer - >::make(*this->derived()); + return pointer_::make(*this->derived()); } typename boost::detail::operator_brackets_result::type diff --git a/test/iterator_facade.cpp b/test/iterator_facade.cpp old mode 100755 new mode 100644 index ed3057e..5efd51d --- a/test/iterator_facade.cpp +++ b/test/iterator_facade.cpp @@ -87,6 +87,10 @@ struct input_iter } }; +template +void same_type(U const&) +{ BOOST_MPL_ASSERT((boost::is_same)); } + int main() { int state = 0; @@ -101,6 +105,8 @@ int main() input_iter p; (*p).mutator(); p->mutator(); + + same_type(p.operator->()); return boost::report_errors(); }