PiperOrigin-RevId: 227030722
This commit is contained in:
Ryohei Machida 2018-12-27 11:33:30 -05:00 committed by Gennadiy Civil
parent 77004096e8
commit 6729a13611
2 changed files with 15 additions and 22 deletions

View File

@ -967,37 +967,24 @@ struct IsHashTable {
template <typename T> template <typename T>
const bool IsHashTable<T>::value; const bool IsHashTable<T>::value;
template<typename T>
struct VoidT {
typedef void value_type;
};
template <typename T, typename = void>
struct HasValueType : false_type {};
template <typename T>
struct HasValueType<T, VoidT<typename T::value_type> > : true_type {
};
template <typename C, template <typename C,
bool = sizeof(IsContainerTest<C>(0)) == sizeof(IsContainer), bool = sizeof(IsContainerTest<C>(0)) == sizeof(IsContainer)>
bool = HasValueType<C>::value>
struct IsRecursiveContainerImpl; struct IsRecursiveContainerImpl;
template <typename C, bool HV> template <typename C>
struct IsRecursiveContainerImpl<C, false, HV> : public false_type {}; struct IsRecursiveContainerImpl<C, false> : public false_type {};
// Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to // Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to
// obey the same inconsistencies as the IsContainerTest, namely check if // obey the same inconsistencies as the IsContainerTest, namely check if
// something is a container is relying on only const_iterator in C++11 and // something is a container is relying on only const_iterator in C++11 and
// is relying on both const_iterator and iterator otherwise // is relying on both const_iterator and iterator otherwise
template <typename C> template <typename C>
struct IsRecursiveContainerImpl<C, true, false> : public false_type {}; struct IsRecursiveContainerImpl<C, true> {
using value_type = decltype(*std::declval<typename C::const_iterator>());
template <typename C> using type =
struct IsRecursiveContainerImpl<C, true, true> { is_same<typename std::remove_const<
typedef typename IteratorTraits<typename C::const_iterator>::value_type typename std::remove_reference<value_type>::type>::type,
value_type; C>;
typedef is_same<value_type, C> type;
}; };
// IsRecursiveContainer<Type> is a unary compile-time predicate that // IsRecursiveContainer<Type> is a unary compile-time predicate that

View File

@ -183,8 +183,14 @@ class PathLike {
public: public:
struct iterator { struct iterator {
typedef PathLike value_type; typedef PathLike value_type;
iterator& operator++();
PathLike& operator*();
}; };
using value_type = char;
using const_iterator = iterator;
PathLike() {} PathLike() {}
iterator begin() const { return iterator(); } iterator begin() const { return iterator(); }