summaryrefslogtreecommitdiffstats
path: root/llvm/include/llvm/ADT/UniqueVector.h
blob: 88ad8b06f0a9fef0936e57bdd5a7119830d3e726 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

//===-- llvm/ADT/UniqueVector.h ---------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file was developed by James M. Laskey and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_ADT_UNIQUEVECTOR_H
#define LLVM_ADT_UNIQUEVECTOR_H

#include <map>
#include <vector>

namespace llvm {

//===----------------------------------------------------------------------===//
/// UniqueVector - This class produces a sequential ID number (base 1) for each
/// unique entry that is added.  This class also provides an ID ordered vector
/// of the entries (indexed by ID - 1.)  T is the type of entries in the vector.
/// This class should have an implementation of operator== and of operator<.
template<class T> class UniqueVector {
private:
  // Map - Used to handle the correspondence of entry to ID.
  typename std::map<T, unsigned> Map;

  // Vector - ID ordered vector of entries. Entries can be indexed by ID - 1.
  //
  typename std::vector<T> Vector;
  
public:
  /// insert - Append entry to the vector if it doesn't already exist.  Returns
  /// the entry's index + 1 to be used as a unique ID.
  unsigned insert(const T &Entry) {
    // Check if the entry is already in the map.
    typename std::map<T, unsigned>::iterator MI = Map.lower_bound(Entry);
    
    // See if entry exists, if so return prior ID.
    if (MI != Map.end() && MI->first == Entry) return MI->second;

    // Compute ID for entry.
    unsigned ID = Vector.size() + 1;
    
    // Insert in map.
    Map.insert(MI, std::make_pair(Entry, ID));
    
    // Insert in vector.
    Vector.push_back(Entry);

    return ID;
  }
  
  /// operator[] - Returns a reference to the entry with the specified ID.
  /// 
  const T &operator[](unsigned ID) const { return Vector[ID - 1]; }
  
  /// size - Returns the number of entries in the vector.
  ///
  size_t size() const { return Vector.size(); }
  
  /// getVector - Return the ID ordered vector of entries.
  ///
  inline const typename std::vector<T> &getVector() const { return Vector; }
};

} // End of namespace llvm

#endif // LLVM_ADT_UNIQUEVECTOR_H
OpenPOWER on IntegriCloud