X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FEnumerate.h;h=9efecfd2b83b5e422663bc2b81ba6ee7b10b8fdb;hb=b3e7df8220f410398011fea71b280ba8be459fcc;hp=f4fb12bebaec79a23e9b5b21037ce5422c7ff800;hpb=5f92025ef5c641f44347a207d800023094ee56b5;p=folly.git diff --git a/folly/Enumerate.h b/folly/Enumerate.h index f4fb12be..9efecfd2 100644 --- a/folly/Enumerate.h +++ b/folly/Enumerate.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,6 +60,18 @@ struct MakeConst { 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 +auto getPointer(const Iterator& it, long) -> decltype(std::addressof(*it)) { + return std::addressof(*it); +} +template +auto getPointer(const Iterator& it, int) -> decltype(it.operator->()) { + return it.operator->(); +} + template class Enumerator { public: @@ -80,7 +92,7 @@ class Enumerator { return *it_; } pointer operator->() { - return std::addressof(**this); + return getPointer(it_, 0); } // Const Proxy: Force const references. @@ -88,7 +100,7 @@ class Enumerator { return *it_; } typename MakeConst::type operator->() const { - return std::addressof(**this); + return getPointer(it_, 0); } private: