Ticket #5697: iterator_facade.patch.hpp

File iterator_facade.patch.hpp, 4.0 KB (added by Jeffrey Hellrung <jeffrey.hellrung@…>, 11 years ago)
Line 
1--- D:/boost_1_47_0/boost/iterator/iterator_facade.old.hpp Wed Jul 6 21:57:37 2011
2+++ D:/boost_1_47_0/boost/iterator/iterator_facade.new.hpp Thu Jul 14 14:28:45 2011
3@@ -294,46 +294,43 @@
4
5 // operator->() needs special support for input iterators to strictly meet the
6 // standard's requirements. If *i is not a reference type, we must still
7- // produce a lvalue to which a pointer can be formed. We do that by
8- // returning an instantiation of this special proxy class template.
9- template <class T>
10- struct operator_arrow_proxy
11+ // produce a lvalue to which a pointer can be formed. We do that by
12+ // returning a proxy object containing an instance of the reference object.
13+ template <class Reference, class Pointer>
14+ struct operator_arrow_dispatch // proxy references
15 {
16- operator_arrow_proxy(T const* px) : m_value(*px) {}
17- T* operator->() const { return &m_value; }
18- // This function is needed for MWCW and BCC, which won't call operator->
19- // again automatically per 13.3.1.2 para 8
20- operator T*() const { return &m_value; }
21- mutable T m_value;
22+ struct proxy
23+ {
24+ explicit proxy(Reference const & x) : m_ref(x) {}
25+ Reference const * operator->() const { return &m_ref; }
26+ // This function is needed for MWCW and BCC, which won't call
27+ // operator-> again automatically per 13.3.1.2 para 8
28+ operator Reference const *() const { return &m_ref; }
29+ Reference const m_ref;
30+ };
31+ typedef proxy result_type;
32+ static result_type apply(Reference const & x)
33+ {
34+ return result_type(x);
35+ }
36 };
37
38- // A metafunction that gets the result type for operator->. Also
39- // has a static function make() which builds the result from a
40- // Reference
41- template <class ValueType, class Reference, class Pointer>
42- struct operator_arrow_result
43+ template <class T, class Pointer>
44+ struct operator_arrow_dispatch<T&, Pointer> // "real" references
45 {
46- // CWPro8.3 won't accept "operator_arrow_result::type", and we
47- // need that type below, so metafunction forwarding would be a
48- // losing proposition here.
49- typedef typename mpl::if_<
50- is_reference<Reference>
51- , Pointer
52- , operator_arrow_proxy<ValueType>
53- >::type type;
54-
55- static type make(Reference x)
56+ typedef Pointer result_type;
57+ static result_type apply(T& x)
58 {
59- return boost::implicit_cast<type>(&x);
60+ return boost::implicit_cast<result_type>(&x);
61 }
62 };
63
64 # if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
65 // Deal with ETI
66 template<>
67- struct operator_arrow_result<int, int, int>
68+ struct operator_arrow_dispatch<int, int>
69 {
70- typedef int type;
71+ typedef int result_type;
72 };
73 # endif
74
75@@ -618,11 +615,10 @@
76 Value, CategoryOrTraversal, Reference, Difference
77 > associated_types;
78
79- typedef boost::detail::operator_arrow_result<
80- typename associated_types::value_type
81- , Reference
82+ typedef boost::detail::operator_arrow_dispatch<
83+ Reference
84 , typename associated_types::pointer
85- > pointer_;
86+ > operator_arrow_dispatch_;
87
88 protected:
89 // For use by derived classes
90@@ -634,7 +630,7 @@
91 typedef Reference reference;
92 typedef Difference difference_type;
93
94- typedef typename pointer_::type pointer;
95+ typedef typename operator_arrow_dispatch_::result_type pointer;
96
97 typedef typename associated_types::iterator_category iterator_category;
98
99@@ -645,7 +641,7 @@
100
101 pointer operator->() const
102 {
103- return pointer_::make(*this->derived());
104+ return operator_arrow_dispatch_::apply(*this->derived());
105 }
106
107 typename boost::detail::operator_brackets_result<Derived,Value,reference>::type