[llvm-commits] [llvm] r46130 - in /llvm/trunk/include/llvm/ADT: ImmutableMap.h ImmutableSet.h
Ted Kremenek
kremenek at apple.com
Thu Jan 17 09:36:49 PST 2008
Author: kremenek
Date: Thu Jan 17 11:36:49 2008
New Revision: 46130
URL: http://llvm.org/viewvc/llvm-project?rev=46130&view=rev
Log:
Implemented "FIXME" in ImutAVLTree: isEqual() now also compares the *data* value
and not just the key value when comparing trees. To do this we added data_type
and data_type_ref to the ImutContainerInfo trait classes. For values stored in
the tree that do not have separate key and data components, data_type is simply
a typedef of bool, and isDataEqual() always evaluates to true. This allows us to
support both ImmutableSet and ImmutableMap using the same underlying logic.
Modified:
llvm/trunk/include/llvm/ADT/ImmutableMap.h
llvm/trunk/include/llvm/ADT/ImmutableSet.h
Modified: llvm/trunk/include/llvm/ADT/ImmutableMap.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ImmutableMap.h?rev=46130&r1=46129&r2=46130&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/ImmutableMap.h (original)
+++ llvm/trunk/include/llvm/ADT/ImmutableMap.h Thu Jan 17 11:36:49 2008
@@ -34,14 +34,21 @@
return V.first;
}
- static inline bool isEqual(key_type_ref L, key_type_ref R) {
- return ImutContainerInfo<T>::isEqual(L,R);
+ static inline data_type_ref DataOfValue(value_type_ref V) {
+ return V.second;
}
+ static inline bool isEqual(key_type_ref L, key_type_ref R) {
+ return ImutContainerInfo<T>::isEqual(L,R);
+ }
static inline bool isLess(key_type_ref L, key_type_ref R) {
return ImutContainerInfo<T>::isLess(L,R);
}
+ static inline bool isDataEqual(data_type_ref L, data_type_ref R) {
+ return ImutContainerInfo<S>::isEqual(L,R);
+ }
+
static inline void Profile(FoldingSetNodeID& ID, value_type_ref V) {
ImutContainerInfo<T>::Profile(ID, V.first);
ImutContainerInfo<S>::Profile(ID, V.second);
Modified: llvm/trunk/include/llvm/ADT/ImmutableSet.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ImmutableSet.h?rev=46130&r1=46129&r2=46130&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/ImmutableSet.h (original)
+++ llvm/trunk/include/llvm/ADT/ImmutableSet.h Thu Jan 17 11:36:49 2008
@@ -120,12 +120,16 @@
continue;
}
- // FIXME: need to compare data values, not key values, but our
- // traits don't support this yet.
+ // Compare the keys.
if (!ImutInfo::isEqual(ImutInfo::KeyOfValue(LItr->getValue()),
ImutInfo::KeyOfValue(RItr->getValue())))
return false;
+ // Also compare the data values.
+ if (!ImutInfo::isDataEqual(ImutInfo::DataOfValue(LItr->getValue()),
+ ImutInfo::DataOfValue(RItr->getValue())))
+ return false;
+
++LItr;
++RItr;
}
@@ -773,8 +777,11 @@
typedef typename ImutProfileInfo<T>::value_type_ref value_type_ref;
typedef value_type key_type;
typedef value_type_ref key_type_ref;
+ typedef bool data_type;
+ typedef bool data_type_ref;
static inline key_type_ref KeyOfValue(value_type_ref D) { return D; }
+ static inline data_type_ref DataOfValue(value_type_ref) { return true; }
static inline bool isEqual(key_type_ref LHS, key_type_ref RHS) {
return std::equal_to<key_type>()(LHS,RHS);
@@ -783,6 +790,8 @@
static inline bool isLess(key_type_ref LHS, key_type_ref RHS) {
return std::less<key_type>()(LHS,RHS);
}
+
+ static inline bool isDataEqual(data_type_ref,data_type_ref) { return true; }
};
/// ImutContainerInfo - Specialization for pointer values to treat pointers
@@ -794,8 +803,11 @@
typedef typename ImutProfileInfo<T*>::value_type_ref value_type_ref;
typedef value_type key_type;
typedef value_type_ref key_type_ref;
+ typedef bool data_type;
+ typedef bool data_type_ref;
static inline key_type_ref KeyOfValue(value_type_ref D) { return D; }
+ static inline data_type_ref DataOfValue(value_type_ref) { return true; }
static inline bool isEqual(key_type_ref LHS, key_type_ref RHS) {
return LHS == RHS;
@@ -804,6 +816,8 @@
static inline bool isLess(key_type_ref LHS, key_type_ref RHS) {
return LHS < RHS;
}
+
+ static inline bool isDataEqual(data_type_ref,data_type_ref) { return true; }
};
//===----------------------------------------------------------------------===//
More information about the llvm-commits
mailing list