]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - contrib/llvm/tools/clang/include/clang/Index/STLExtras.h
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / contrib / llvm / tools / clang / include / clang / Index / STLExtras.h
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
34   pair_value_iterator() { }
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