diff --git a/doc/iterator_adaptor_ref.rst b/doc/iterator_adaptor_ref.rst index de48fcb..1d13a9c 100644 --- a/doc/iterator_adaptor_ref.rst +++ b/doc/iterator_adaptor_ref.rst @@ -19,7 +19,8 @@ friend class iterator_core_access; public: iterator_adaptor(); - explicit iterator_adaptor(Base iter); + explicit iterator_adaptor(Base const& iter); + typedef Base base_type; Base const& base() const; protected: typedef iterator_adaptor iterator_adaptor\_; @@ -115,7 +116,7 @@ above are defined as follows: ``m_iterator`` default constructed. -``explicit iterator_adaptor(Base iter);`` +``explicit iterator_adaptor(Base const& iter);`` :Returns: An instance of ``iterator_adaptor`` with ``m_iterator`` copy constructed from ``iter``. diff --git a/include/boost/iterator/iterator_adaptor.hpp b/include/boost/iterator/iterator_adaptor.hpp index eabacde..457c439 100644 --- a/include/boost/iterator/iterator_adaptor.hpp +++ b/include/boost/iterator/iterator_adaptor.hpp @@ -278,6 +278,8 @@ namespace boost { } + typedef Base base_type; + Base const& base() const { return m_iterator; } diff --git a/test/iterator_adaptor_test.cpp b/test/iterator_adaptor_test.cpp index 14b1beb..dddac26 100644 --- a/test/iterator_adaptor_test.cpp +++ b/test/iterator_adaptor_test.cpp @@ -316,6 +316,19 @@ main() assert((*i).m_x == i->foo()); } + // check that base_type is correct + { + // Test constant iterator idiom + typedef ptr_iterator BaseIter; + + test = static_assert_same::value; + test = static_assert_same::base_type,BaseIter>::value; + + typedef modify_traversal IncrementableIter; + + test = static_assert_same::value; + } + std::cout << "test successful " << std::endl; (void)test; return 0;