X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FADT%2FIndexedMap.h;h=5ba85c02792095ff75ef49e21ee1d172481234eb;hb=c8eb88e7448cb88d2edf31806a04ae9d44d6a66a;hp=5b1b3b42edb895094b8d69dea011fac4ef2a721a;hpb=8018a665b2fa8250f12e079b19459c662cdd27f0;p=oota-llvm.git diff --git a/include/llvm/ADT/IndexedMap.h b/include/llvm/ADT/IndexedMap.h index 5b1b3b42edb..5ba85c02792 100644 --- a/include/llvm/ADT/IndexedMap.h +++ b/include/llvm/ADT/IndexedMap.h @@ -1,13 +1,13 @@ -//===- llvm/ADT/DenseMap.h - A dense map implmentation ----------*- C++ -*-===// -// +//===- llvm/ADT/IndexedMap.h - An index map implementation ------*- C++ -*-===// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// //===----------------------------------------------------------------------===// // -// This file implements a dense map. A dense map template takes two +// This file implements an indexed map. The index map template takes two // types. The first is the mapped type and the second is a functor // that maps its argument to a size_t. On instantiation a "null" value // can be provided to be used as a "does not exist" indicator in the @@ -17,33 +17,31 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_ADT_DENSEMAP_H -#define LLVM_ADT_DENSEMAP_H +#ifndef LLVM_ADT_INDEXEDMAP_H +#define LLVM_ADT_INDEXEDMAP_H -#include -#include +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallVector.h" #include +#include namespace llvm { - struct IdentityFunctor : std::unary_function { - unsigned operator()(unsigned Index) const { - return Index; - } - }; - - template - class DenseMap { +template > + class IndexedMap { typedef typename ToIndexT::argument_type IndexT; - typedef std::vector StorageT; + // Prefer SmallVector with zero inline storage over std::vector. IndexedMaps + // can grow very large and SmallVector grows more efficiently as long as T + // is trivially copyable. + typedef SmallVector StorageT; StorageT storage_; T nullVal_; ToIndexT toIndex_; public: - DenseMap() : nullVal_(T()) { } + IndexedMap() : nullVal_(T()) { } - explicit DenseMap(const T& val) : nullVal_(val) { } + explicit IndexedMap(const T& val) : nullVal_(val) { } typename StorageT::reference operator[](IndexT n) { assert(toIndex_(n) < storage_.size() && "index out of bounds!"); @@ -55,6 +53,14 @@ namespace llvm { return storage_[toIndex_(n)]; } + void reserve(typename StorageT::size_type s) { + storage_.reserve(s); + } + + void resize(typename StorageT::size_type s) { + storage_.resize(s, nullVal_); + } + void clear() { storage_.clear(); } @@ -62,7 +68,11 @@ namespace llvm { void grow(IndexT n) { unsigned NewSize = toIndex_(n) + 1; if (NewSize > storage_.size()) - storage_.resize(NewSize, nullVal_); + resize(NewSize); + } + + bool inBounds(IndexT n) const { + return toIndex_(n) < storage_.size(); } typename StorageT::size_type size() const {