1 //===--- STLExtras.h - Helper STL related templates -------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Helper templates for using with the STL. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_INDEX_STLEXTRAS_H 15 #define LLVM_CLANG_INDEX_STLEXTRAS_H 16 17 namespace clang { 18 19 namespace idx { 20 21 /// \brief Wraps an iterator whose value_type is a pair, and provides 22 /// pair's second object as the value. 23 template <typename iter_type> 24 class pair_value_iterator { 25 iter_type I; 26 27 public: 28 typedef typename iter_type::value_type::second_type value_type; 29 typedef value_type& reference; 30 typedef value_type* pointer; 31 typedef typename iter_type::iterator_category iterator_category; 32 typedef typename iter_type::difference_type difference_type; 33 pair_value_iterator()34 pair_value_iterator() { } pair_value_iterator(iter_type i)35 pair_value_iterator(iter_type i) : I(i) { } 36 37 reference operator*() const { return I->second; } 38 pointer operator->() const { return &I->second; } 39 40 pair_value_iterator& operator++() { 41 ++I; 42 return *this; 43 } 44 45 pair_value_iterator operator++(int) { 46 pair_value_iterator tmp(*this); 47 ++(*this); 48 return tmp; 49 } 50 51 friend bool operator==(pair_value_iterator L, pair_value_iterator R) { 52 return L.I == R.I; 53 } 54 friend bool operator!=(pair_value_iterator L, pair_value_iterator R) { 55 return L.I != R.I; 56 } 57 }; 58 59 } // end idx namespace 60 61 } // end clang namespace 62 63 #endif 64