mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-23 09:27:15 +02:00
@ -293,17 +293,17 @@ namespace boost
|
|||||||
|
|
||||||
// operator->() needs special support for input iterators to strictly meet the
|
// operator->() needs special support for input iterators to strictly meet the
|
||||||
// standard's requirements. If *i is not a reference type, we must still
|
// standard's requirements. If *i is not a reference type, we must still
|
||||||
// produce a (constant) lvalue to which a pointer can be formed. We do that by
|
// produce a lvalue to which a pointer can be formed. We do that by
|
||||||
// returning an instantiation of this special proxy class template.
|
// returning an instantiation of this special proxy class template.
|
||||||
template <class T>
|
template <class T>
|
||||||
struct operator_arrow_proxy
|
struct operator_arrow_proxy
|
||||||
{
|
{
|
||||||
operator_arrow_proxy(T const* px) : m_value(*px) {}
|
operator_arrow_proxy(T const* px) : m_value(*px) {}
|
||||||
const T* operator->() const { return &m_value; }
|
T* operator->() const { return &m_value; }
|
||||||
// This function is needed for MWCW and BCC, which won't call operator->
|
// This function is needed for MWCW and BCC, which won't call operator->
|
||||||
// again automatically per 13.3.1.2 para 8
|
// again automatically per 13.3.1.2 para 8
|
||||||
operator const T*() const { return &m_value; }
|
operator T*() const { return &m_value; }
|
||||||
T m_value;
|
mutable T m_value;
|
||||||
};
|
};
|
||||||
|
|
||||||
// A metafunction that gets the result type for operator->. Also
|
// A metafunction that gets the result type for operator->. Also
|
||||||
|
@ -57,6 +57,34 @@ struct proxy
|
|||||||
int& state;
|
int& state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct value { int x; };
|
||||||
|
|
||||||
|
struct input_iter
|
||||||
|
: boost::iterator_facade<
|
||||||
|
input_iter
|
||||||
|
, value
|
||||||
|
, boost::single_pass_traversal_tag
|
||||||
|
, value
|
||||||
|
>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
input_iter() {}
|
||||||
|
|
||||||
|
void increment()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
value
|
||||||
|
dereference() const
|
||||||
|
{
|
||||||
|
return value();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool equal(input_iter const& y) const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
int state = 0;
|
int state = 0;
|
||||||
@ -65,5 +93,12 @@ int main()
|
|||||||
boost::readable_iterator_test(counter_iterator<proxy>(&state), 3);
|
boost::readable_iterator_test(counter_iterator<proxy>(&state), 3);
|
||||||
boost::writable_iterator_test(counter_iterator<proxy>(&state), 9, 7);
|
boost::writable_iterator_test(counter_iterator<proxy>(&state), 9, 7);
|
||||||
BOOST_ASSERT(state == 8);
|
BOOST_ASSERT(state == 8);
|
||||||
|
|
||||||
|
// test for a fix to http://tinyurl.com/zuohe
|
||||||
|
// These two lines should be equivalent (and both compile)
|
||||||
|
input_iter p;
|
||||||
|
(*p).x = 2;
|
||||||
|
p->x = 2;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user