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. llvm-svn: 136481
This commit is contained in:
parent
3e02522fee
commit
ea844f0bc9
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include "llvm/Support/DataTypes.h"
|
#include "llvm/Support/DataTypes.h"
|
||||||
#include "llvm/ADT/APFloat.h"
|
#include "llvm/ADT/APFloat.h"
|
||||||
|
#include "llvm/ADT/DenseMapInfo.h"
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,52 @@
|
||||||
|
|
||||||
using namespace llvm;
|
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
|
// Type implementations
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue