diff --git a/include/boost/iterator/iterator_archetypes.hpp b/include/boost/iterator/iterator_archetypes.hpp index b0ab188..e216647 100644 --- a/include/boost/iterator/iterator_archetypes.hpp +++ b/include/boost/iterator/iterator_archetypes.hpp @@ -19,6 +19,8 @@ #include #include +#include + #include #include #include @@ -80,26 +82,26 @@ namespace detail template struct assign_proxy { - assign_proxy& operator=(T); + assign_proxy& operator=(T) { return *this; } }; template struct read_proxy { - operator T(); + operator T() { return static_object::get(); } }; template struct read_write_proxy - : assign_proxy - , read_proxy + : read_proxy // Use to inherit from assign_proxy, but that doesn't work. -JGS { + read_write_proxy& operator=(T) { return *this; } }; template struct arrow_proxy { - T const* operator->() const; + T const* operator->() const { return 0; } }; struct no_operator_brackets {}; @@ -107,13 +109,13 @@ namespace detail template struct readable_operator_brackets { - read_proxy operator[](std::ptrdiff_t n) const; + read_proxy operator[](std::ptrdiff_t n) const { return read_proxy(); } }; template struct writable_operator_brackets { - read_write_proxy operator[](std::ptrdiff_t n) const; + read_write_proxy operator[](std::ptrdiff_t n) const { return read_write_proxy(); } }; template @@ -147,12 +149,26 @@ namespace detail template struct archetype; }; + // Constructor argument for those iterators that + // are not default constructible + struct ctor_arg {}; + template struct traversal_archetype_ : mpl::aux::msvc_eti_base< typename traversal_archetype_impl::template archetype >::type - {}; + { + typedef typename + traversal_archetype_impl::template archetype + base; + + traversal_archetype_() {} + + traversal_archetype_(ctor_arg arg) + : base(arg) + {} + }; template <> struct traversal_archetype_impl @@ -160,10 +176,13 @@ namespace detail template struct archetype { - typedef void difference_type; + explicit archetype(ctor_arg) {} - Derived& operator++(); - Derived operator++(int) const; + struct bogus { }; // This use to be void, but that causes trouble for iterator_facade. Need more research. -JGS + typedef bogus difference_type; + + Derived& operator++() { return (Derived&)static_object::get(); } + Derived operator++(int) const { return (Derived&)static_object::get(); } }; }; @@ -175,18 +194,21 @@ namespace detail : public equality_comparable< traversal_archetype_ >, public traversal_archetype_ { + explicit archetype(ctor_arg arg) + : traversal_archetype_(arg) + {} }; }; template bool operator==(traversal_archetype_ const&, - traversal_archetype_ const&); + traversal_archetype_ const&) { return true; } #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) // doesn't seem to pick up != from equality_comparable template bool operator!=(traversal_archetype_ const&, - traversal_archetype_ const&); + traversal_archetype_ const&) { return true; } #endif template <> struct traversal_archetype_impl @@ -195,6 +217,9 @@ namespace detail struct archetype : public traversal_archetype_ { + archetype() + : traversal_archetype_(ctor_arg()) + {} typedef std::ptrdiff_t difference_type; }; }; @@ -206,8 +231,8 @@ namespace detail struct archetype : public traversal_archetype_ { - Derived& operator--(); - Derived operator--(int) const; + Derived& operator--() { return static_object::get(); } + Derived operator--(int) const { return static_object::get(); } }; }; @@ -219,30 +244,34 @@ namespace detail : public partially_ordered >, public traversal_archetype_ { - Derived& operator+=(std::ptrdiff_t); - Derived& operator-=(std::ptrdiff_t); + Derived& operator+=(std::ptrdiff_t) { return static_object::get(); } + Derived& operator-=(std::ptrdiff_t) { return static_object::get(); } }; }; template Derived& operator+(traversal_archetype_ const&, - std::ptrdiff_t); + std::ptrdiff_t) { return static_object::get(); } template Derived& operator+(std::ptrdiff_t, - traversal_archetype_ const&); + traversal_archetype_ const&) + { return static_object::get(); } template Derived& operator-(traversal_archetype_ const&, - std::ptrdiff_t); + std::ptrdiff_t) + { return static_object::get(); } template std::ptrdiff_t operator-(traversal_archetype_ const&, - traversal_archetype_ const&); + traversal_archetype_ const&) + { return 0; } template bool operator<(traversal_archetype_ const&, - traversal_archetype_ const&); + traversal_archetype_ const&) + { return true; } struct bogus_type; @@ -286,9 +315,9 @@ struct iterator_access_archetype_impl< typedef Value reference; typedef Value* pointer; - value_type operator*() const; + value_type operator*() const { return static_object::get(); } - detail::arrow_proxy operator->() const; + detail::arrow_proxy operator->() const { return detail::arrow_proxy(); } }; }; @@ -307,7 +336,7 @@ struct iterator_access_archetype_impl< typedef void reference; typedef void pointer; - detail::assign_proxy operator*() const; + detail::assign_proxy operator*() const { return detail::assign_proxy(); } }; }; @@ -324,7 +353,7 @@ struct iterator_access_archetype_impl< { typedef detail::read_write_proxy reference; - detail::read_write_proxy operator*() const; + detail::read_write_proxy operator*() const { return detail::read_write_proxy(); } }; }; @@ -339,8 +368,8 @@ struct iterator_access_archetype_impl() const; + Value& operator*() const { return static_object::get(); } + Value* operator->() const { return 0; } }; }; @@ -443,13 +472,27 @@ struct iterator_archetype typedef typename base::iterator_category iterator_category; # endif - iterator_archetype(); - iterator_archetype(iterator_archetype const&); + iterator_archetype() { } + iterator_archetype(iterator_archetype const& x) + : detail::iterator_archetype_base< + Value + , AccessCategory + , TraversalCategory + >(x) + {} - iterator_archetype& operator=(iterator_archetype const&); + iterator_archetype& operator=(iterator_archetype const&) + { return *this; } +# if 0 // Optional conversion from mutable - // iterator_archetype(iterator_archetype::type, AccessCategory, TraversalCategory> const&); + iterator_archetype( + iterator_archetype< + typename detail::convertible_type::type + , AccessCategory + , TraversalCategory> const& + ); +# endif }; } // namespace boost diff --git a/include/boost/iterator/iterator_facade.hpp b/include/boost/iterator/iterator_facade.hpp index 879beb3..1e2ec70 100644 --- a/include/boost/iterator/iterator_facade.hpp +++ b/include/boost/iterator/iterator_facade.hpp @@ -31,6 +31,10 @@ #include #include +#if BOOST_WORKAROUND(BOOST_MSVC, == 1200) +# include +#endif + #include // this goes last namespace boost @@ -223,16 +227,20 @@ namespace boost { template struct apply - : mpl::apply_if< - is_convertible + : # if BOOST_WORKAROUND(BOOST_MSVC, == 1200) - , typename I1::difference_type - , typename I2::difference_type + mpl::if_< + is_convertible + , typename I1::difference_type + , typename I2::difference_type + > # else - , iterator_difference - , iterator_difference + mpl::apply_if< + is_convertible + , iterator_difference + , iterator_difference + > # endif - > {}; };