diff options
Diffstat (limited to 'include/clang/AST/CanonicalType.h')
-rw-r--r-- | include/clang/AST/CanonicalType.h | 110 |
1 files changed, 18 insertions, 92 deletions
diff --git a/include/clang/AST/CanonicalType.h b/include/clang/AST/CanonicalType.h index aa3c84682983..b25800bfedb9 100644 --- a/include/clang/AST/CanonicalType.h +++ b/include/clang/AST/CanonicalType.h @@ -16,8 +16,8 @@ #define LLVM_CLANG_AST_CANONICALTYPE_H #include "clang/AST/Type.h" +#include "llvm/ADT/iterator.h" #include "llvm/Support/Casting.h" -#include <iterator> namespace clang { @@ -80,7 +80,7 @@ public: operator QualType() const { return Stored; } /// \brief Implicit conversion to bool. - LLVM_EXPLICIT operator bool() const { return !isNull(); } + explicit operator bool() const { return !isNull(); } bool isNull() const { return Stored.isNull(); @@ -381,93 +381,20 @@ namespace clang { /// \brief Iterator adaptor that turns an iterator over canonical QualTypes /// into an iterator over CanQualTypes. -template<typename InputIterator> -class CanTypeIterator { - InputIterator Iter; - -public: - typedef CanQualType value_type; - typedef value_type reference; - typedef CanProxy<Type> pointer; - typedef typename std::iterator_traits<InputIterator>::difference_type - difference_type; - typedef typename std::iterator_traits<InputIterator>::iterator_category - iterator_category; - - CanTypeIterator() : Iter() { } - explicit CanTypeIterator(InputIterator Iter) : Iter(Iter) { } - - // Input iterator - reference operator*() const { - return CanQualType::CreateUnsafe(*Iter); - } - - pointer operator->() const; - - CanTypeIterator &operator++() { - ++Iter; - return *this; - } - - CanTypeIterator operator++(int) { - CanTypeIterator Tmp(*this); - ++Iter; - return Tmp; - } - - friend bool operator==(const CanTypeIterator& X, const CanTypeIterator &Y) { - return X.Iter == Y.Iter; - } - friend bool operator!=(const CanTypeIterator& X, const CanTypeIterator &Y) { - return X.Iter != Y.Iter; - } - - // Bidirectional iterator - CanTypeIterator &operator--() { - --Iter; - return *this; - } - - CanTypeIterator operator--(int) { - CanTypeIterator Tmp(*this); - --Iter; - return Tmp; - } - - // Random access iterator - reference operator[](difference_type n) const { - return CanQualType::CreateUnsafe(Iter[n]); - } - - CanTypeIterator &operator+=(difference_type n) { - Iter += n; - return *this; - } - - CanTypeIterator &operator-=(difference_type n) { - Iter -= n; - return *this; - } - - friend CanTypeIterator operator+(CanTypeIterator X, difference_type n) { - X += n; - return X; - } - - friend CanTypeIterator operator+(difference_type n, CanTypeIterator X) { - X += n; - return X; - } - - friend CanTypeIterator operator-(CanTypeIterator X, difference_type n) { - X -= n; - return X; - } - - friend difference_type operator-(const CanTypeIterator &X, - const CanTypeIterator &Y) { - return X - Y; - } +template <typename InputIterator> +struct CanTypeIterator + : llvm::iterator_adaptor_base< + CanTypeIterator<InputIterator>, InputIterator, + typename std::iterator_traits<InputIterator>::iterator_category, + CanQualType, + typename std::iterator_traits<InputIterator>::difference_type, + CanProxy<Type>, CanQualType> { + CanTypeIterator() {} + explicit CanTypeIterator(InputIterator Iter) + : CanTypeIterator::iterator_adaptor_base(std::move(Iter)) {} + + CanQualType operator*() const { return CanQualType::CreateUnsafe(*this->I); } + CanProxy<Type> operator->() const; }; template<> @@ -727,9 +654,8 @@ CanProxy<T> CanQual<T>::operator->() const { return CanProxy<T>(*this); } -template<typename InputIterator> -typename CanTypeIterator<InputIterator>::pointer -CanTypeIterator<InputIterator>::operator->() const { +template <typename InputIterator> +CanProxy<Type> CanTypeIterator<InputIterator>::operator->() const { return CanProxy<Type>(*this); } |