Commit 679a76a9 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

Better constrain EvictingCacheMap iterator conversions

Summary: [Folly] Better constrain `EvictingCacheMap` iterator conversions.

Reviewed By: shixiao

Differential Revision: D14162009

fbshipit-source-id: 8a3011450620fcf1ee6a137834ebbd1e5953e0ed
parent c673fbd1
...@@ -120,22 +120,20 @@ class EvictingCacheMap { ...@@ -120,22 +120,20 @@ class EvictingCacheMap {
TIterator, TIterator,
Value, Value,
boost::bidirectional_traversal_tag> { boost::bidirectional_traversal_tag> {
private:
struct Enabler {};
public: public:
iterator_base() {} iterator_base() {}
explicit iterator_base(TIterator it) explicit iterator_base(TIterator it)
: iterator_base::iterator_adaptor_(it) {} : iterator_base::iterator_adaptor_(it) {}
template <typename V, typename I> template <
/* implicit */ iterator_base( typename V,
iterator_base<V, I> const& other, typename I,
std::enable_if_t< std::enable_if_t<
std::is_convertible<V, Value>::value && std::is_same<V const, Value>::value &&
std::is_convertible<I, TIterator>::value, std::is_convertible<I, TIterator>::value,
Enabler> = Enabler()) int> = 0>
/* implicit */ iterator_base(iterator_base<V, I> const& other)
: iterator_base::iterator_adaptor_(other.base()) {} : iterator_base::iterator_adaptor_(other.base()) {}
Value& dereference() const { Value& dereference() const {
......
...@@ -698,3 +698,21 @@ TEST(EvictingCacheMap, CustomKeyEqual) { ...@@ -698,3 +698,21 @@ TEST(EvictingCacheMap, CustomKeyEqual) {
EXPECT_EQ(i, map.get(i + nItems)); EXPECT_EQ(i, map.get(i + nItems));
} }
} }
TEST(EvictingCacheMap, IteratorConversion) {
using type = EvictingCacheMap<int, int>;
using i = type::iterator;
using ci = type::const_iterator;
using ri = type::reverse_iterator;
using cri = type::const_reverse_iterator;
EXPECT_TRUE((std::is_convertible<i, i>::value));
EXPECT_TRUE((std::is_convertible<i, ci>::value));
EXPECT_FALSE((std::is_convertible<ci, i>::value));
EXPECT_TRUE((std::is_convertible<ci, ci>::value));
EXPECT_TRUE((std::is_convertible<ri, ri>::value));
EXPECT_TRUE((std::is_convertible<ri, cri>::value));
EXPECT_FALSE((std::is_convertible<cri, ri>::value));
EXPECT_TRUE((std::is_convertible<cri, cri>::value));
}
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