Add a std::string Wrapper for TableGen

Create a std::string wrapper for use as a DenseMap key.  DenseMap is
not safe in generate with strings, so this wrapper indicates that only
strings guaranteed not to have certain values should be used in the
DenseMap.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136481 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Greene 2011-07-29 19:06:58 +00:00
parent 1619560521
commit cd0bc905d2
2 changed files with 47 additions and 0 deletions

View File

@ -16,6 +16,7 @@
#include "llvm/Support/DataTypes.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/ADT/StringRef.h"
#include <cctype>
#include <cstdio>

View File

@ -19,6 +19,52 @@
using namespace llvm;
//===----------------------------------------------------------------------===//
// std::string wrapper for DenseMap purposes
//===----------------------------------------------------------------------===//
/// TableGenStringKey - This is a wrapper for std::string suitable for
/// using as a key to a DenseMap. Because there isn't a particularly
/// good way to indicate tombstone or empty keys for strings, we want
/// to wrap std::string to indicate that this is a "special" string
/// not expected to take on certain values (those of the tombstone and
/// empty keys). This makes things a little safer as it clarifies
/// that DenseMap is really not appropriate for general strings.
class TableGenStringKey {
public:
TableGenStringKey(const std::string &str) : data(str) {}
TableGenStringKey(const char *str) : data(str) {}
const std::string &str() const { return data; }
private:
std::string data;
};
/// Specialize DenseMapInfo for TableGenStringKey.
namespace llvm {
template<> struct DenseMapInfo<TableGenStringKey> {
static inline TableGenStringKey getEmptyKey() {
TableGenStringKey Empty("<<<EMPTY KEY>>>");
return Empty;
}
static inline TableGenStringKey getTombstoneKey() {
TableGenStringKey Tombstone("<<<TOMBSTONE KEY>>>");
return Tombstone;
}
static unsigned getHashValue(const TableGenStringKey& Val) {
return HashString(Val.str());
}
static bool isEqual(const TableGenStringKey& LHS,
const TableGenStringKey& RHS) {
return LHS.str() == RHS.str();
}
};
}
//===----------------------------------------------------------------------===//
// Type implementations
//===----------------------------------------------------------------------===//