diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-02-11 17:24:50 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-02-11 17:24:50 +0000 |
commit | 1f801fa5ada9cb40fb97ae755c282e91af54a1bc (patch) | |
tree | 892502fb68fc883c8ed89d9185f8cd586e8ef8a9 /include/llvm/ADT/FoldingSet.h | |
parent | 04feb51886805046e8b1af10b7d21bc1ef85f457 (diff) | |
download | llvm-1f801fa5ada9cb40fb97ae755c282e91af54a1bc.tar.gz llvm-1f801fa5ada9cb40fb97ae755c282e91af54a1bc.tar.bz2 llvm-1f801fa5ada9cb40fb97ae755c282e91af54a1bc.tar.xz |
Added "Profile" method to APFloat for use with FoldingSet.
Added member template "Add" to FoldingSetNodeID that allows "adding" arbitrary
objects to a profile via dispatch to FoldingSetTrait<T>::Profile().
Removed FoldingSetNodeID::AddAPFloat and FoldingSetNodeID::APInt, as their
functionality is now replaced using the above mentioned member template.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46957 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/ADT/FoldingSet.h')
-rw-r--r-- | include/llvm/ADT/FoldingSet.h | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/include/llvm/ADT/FoldingSet.h b/include/llvm/ADT/FoldingSet.h index ac7f428b3e..0efe78d7bd 100644 --- a/include/llvm/ADT/FoldingSet.h +++ b/include/llvm/ADT/FoldingSet.h @@ -178,6 +178,19 @@ protected: virtual void GetNodeProfile(FoldingSetNodeID &ID, Node *N) const = 0; }; +//===----------------------------------------------------------------------===// +/// FoldingSetTrait - This trait class is used to define behavior of how +/// to "profile" (in the FoldingSet parlance) an object of a given type. +/// The default behavior is to invoke a 'Profile' method on an object, but +/// through template specialization the behavior can be tailored for specific +/// types. Combined with the FoldingSetNodeWrapper classs, one can add objects +/// to FoldingSets that were not originally designed to have that behavior. +/// +template<typename T> struct FoldingSetTrait { + static inline void Profile(const T& X, FoldingSetNodeID& ID) { X.Profile(ID);} + static inline void Profile(T& X, FoldingSetNodeID& ID) { X.Profile(ID); } +}; + //===--------------------------------------------------------------------===// /// FoldingSetNodeID - This class is used to gather all the unique data bits of /// a node. When all the bits are gathered this class is used to produce a @@ -206,10 +219,11 @@ public: void AddInteger(uint64_t I); void AddFloat(float F); void AddDouble(double D); - void AddAPFloat(const APFloat& apf); - void AddAPInt(const APInt& api); void AddString(const std::string &String); + template <typename T> + inline void Add(const T& x) { FoldingSetTrait<T>::Profile(x, *this); } + /// clear - Clear the accumulated profile, allowing this FoldingSetNodeID /// object to be used to compute a new profile. inline void clear() { Bits.clear(); } @@ -227,19 +241,6 @@ public: typedef FoldingSetImpl::Node FoldingSetNode; template<class T> class FoldingSetIterator; template<class T> class FoldingSetBucketIterator; - -//===----------------------------------------------------------------------===// -/// FoldingSetTrait - This trait class is used to define behavior of how -/// to "profile" (in the FoldingSet parlance) an object of a given type. -/// The default behavior is to invoke a 'Profile' method on an object, but -/// through template specialization the behavior can be tailored for specific -/// types. Combined with the FoldingSetNodeWrapper classs, one can add objects -/// to FoldingSets that were not originally designed to have that behavior. -/// -template<typename T> struct FoldingSetTrait { - static inline void Profile(const T& X, FoldingSetNodeID& ID) { X.Profile(ID);} - static inline void Profile(T& X, FoldingSetNodeID& ID) { X.Profile(ID); } -}; //===----------------------------------------------------------------------===// /// FoldingSet - This template class is used to instantiate a specialized |