Commit 1d2f2dcf authored by Giuseppe Ottaviano's avatar Giuseppe Ottaviano Committed by Facebook Github Bot

Add support in enumerate() for iterators with exotic pointers

Summary: I thought we wouldn't need this but it turns out Thrift Frozen2 iterators return proxies (it's proxies all the way down). Thanks to ericniebler for trick.

Reviewed By: yfeldblum

Differential Revision: D4005700

fbshipit-source-id: 1911996afa075c1d819a3aaea2ee924bc2ae2f20
parent a34e06a1
...@@ -60,6 +60,18 @@ struct MakeConst<T*> { ...@@ -60,6 +60,18 @@ struct MakeConst<T*> {
using type = const T*; using type = const T*;
}; };
// Raw pointers don't have an operator->() member function, so the
// second overload will be SFINAEd out in that case. Otherwise, the
// second is preferred in the partial order for getPointer(_, 0).
template <class Iterator>
auto getPointer(const Iterator& it, long) -> decltype(std::addressof(*it)) {
return std::addressof(*it);
}
template <class Iterator>
auto getPointer(const Iterator& it, int) -> decltype(it.operator->()) {
return it.operator->();
}
template <class Iterator> template <class Iterator>
class Enumerator { class Enumerator {
public: public:
...@@ -80,7 +92,7 @@ class Enumerator { ...@@ -80,7 +92,7 @@ class Enumerator {
return *it_; return *it_;
} }
pointer operator->() { pointer operator->() {
return std::addressof(**this); return getPointer(it_, 0);
} }
// Const Proxy: Force const references. // Const Proxy: Force const references.
...@@ -88,7 +100,7 @@ class Enumerator { ...@@ -88,7 +100,7 @@ class Enumerator {
return *it_; return *it_;
} }
typename MakeConst<pointer>::type operator->() const { typename MakeConst<pointer>::type operator->() const {
return std::addressof(**this); return getPointer(it_, 0);
} }
private: private:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment