DenseMap.h revision 00fa65be8344944b080cd790678e027e10942ffd
1//===- DenseMap.h - A dense map implmentation -------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements a dense map. A dense map template takes two
11// types. The first is the mapped type and the second is a functor
12// that maps its argument to a size_t. On instantiation a "null" value
13// can be provided to be used as a "does not exist" indicator in the
14// map. A member function grow() is provided that given the value of
15// the maximally indexed key (the argument of the functor) makes sure
16// the map has enough space for it.
17//
18//===----------------------------------------------------------------------===//
19
20#ifndef SUPPORT_DENSEMAP_H
21#define SUPPORT_DENSEMAP_H
22
23#include <vector>
24
25namespace llvm {
26
27template <typename T, typename ToIndexT>
28class DenseMap {
29    typedef typename ToIndexT::argument_type IndexT;
30    typedef std::vector<T> StorageT;
31    StorageT storage_;
32    T nullVal_;
33    ToIndexT toIndex_;
34
35public:
36    DenseMap() { }
37
38    explicit DenseMap(const T& val) : nullVal_(val) { }
39
40    typename StorageT::reference operator[](IndexT n) {
41        assert(toIndex_(n) < storage_.size() && "index out of bounds!");
42        return storage_[toIndex_(n)];
43    }
44
45    typename StorageT::const_reference operator[](IndexT n) const {
46        assert(toIndex_(n) < storage_.size() && "index out of bounds!");
47        return storage_[toIndex_(n)];
48    }
49
50    void clear() {
51        storage_.clear();
52    }
53
54    void grow(IndexT n) {
55        unsigned NewSize = toIndex_(n) + 1;
56        if (NewSize > storage_.size())
57            storage_.resize(NewSize, nullVal_);
58    }
59};
60
61} // End llvm namespace
62
63#endif
64