[llvm-commits] [llvm] r41837 - /llvm/trunk/include/llvm/ADT/DenseMap.h

Chris Lattner clattner at apple.com
Mon Sep 10 22:14:57 PDT 2007


> Log:
> Add a ValueInfoT template parameter to DenseMap so that it can  
> properly make decisions
> based on whether the key AND the value require ctors/dtors.

Ah, interesting :)

How about renaming DenseMapKeyInfo/DenseMapValueInfo ->  
DenseMapInfo?  Is there any reason to keep them separate?

That will give you:

>  template<typename KeyT, typename ValueT,
> +         typename KeyInfoT = DenseMapInfo<KeyT>,
> +         typename ValueInfoT = DenseMapInfo<ValueT> >

And mean that you don't have to provide specializations for both.

-Chris

> Modified:
>     llvm/trunk/include/llvm/ADT/DenseMap.h
>
> Modified: llvm/trunk/include/llvm/ADT/DenseMap.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ 
> ADT/DenseMap.h?rev=41837&r1=41836&r2=41837&view=diff
>
> ====================================================================== 
> ========
> --- llvm/trunk/include/llvm/ADT/DenseMap.h (original)
> +++ llvm/trunk/include/llvm/ADT/DenseMap.h Tue Sep 11 00:08:05 2007
> @@ -41,15 +41,29 @@
>    static bool isPod() { return true; }
>  };
>
> +template<typename T>
> +struct DenseMapValueInfo {
> +  //static bool isPod()
> +};
> +
> +// Provide DenseMapValueInfo for all pointers.
> +template<typename T>
> +struct DenseMapValueInfo<T*> {
> +  static bool isPod() { return true; }
> +};
> +
>  template<typename KeyT, typename ValueT,
> -         typename KeyInfoT = DenseMapKeyInfo<KeyT> >
> +         typename KeyInfoT = DenseMapKeyInfo<KeyT>,
> +         typename ValueInfoT = DenseMapValueInfo<ValueT> >
>  class DenseMapIterator;
>  template<typename KeyT, typename ValueT,
> -         typename KeyInfoT = DenseMapKeyInfo<KeyT> >
> +         typename KeyInfoT = DenseMapKeyInfo<KeyT>,
> +         typename ValueInfoT = DenseMapValueInfo<ValueT> >
>  class DenseMapConstIterator;
>
>  template<typename KeyT, typename ValueT,
> -         typename KeyInfoT = DenseMapKeyInfo<KeyT> >
> +         typename KeyInfoT = DenseMapKeyInfo<KeyT>,
> +         typename ValueInfoT = DenseMapValueInfo<ValueT> >
>  class DenseMap {
>    typedef std::pair<KeyT, ValueT> BucketT;
>    unsigned NumBuckets;
> @@ -181,7 +195,7 @@
>
>  private:
>    void CopyFrom(const DenseMap& other) {
> -    if (NumBuckets != 0 && !KeyInfoT::isPod()) {
> +    if (NumBuckets != 0 && (!KeyInfoT::isPod() || ! 
> ValueInfoT::isPod())) {
>        const KeyT EmptyKey = getEmptyKey(), TombstoneKey =  
> getTombstoneKey();
>        for (BucketT *P = Buckets, *E = Buckets+NumBuckets; P != E; + 
> +P) {
>          if (P->first != EmptyKey && P->first != TombstoneKey)
> @@ -198,13 +212,13 @@
>      Buckets = reinterpret_cast<BucketT*>(new char[sizeof(BucketT) *
>                                                    other.NumBuckets]);
>
> -    if (KeyInfoT::isPod())
> +    if (KeyInfoT::isPod() && ValueInfoT::isPod())
>        memcpy(Buckets, other.Buckets, other.NumBuckets * sizeof 
> (BucketT));
>      else
>        for (size_t i = 0; i < other.NumBuckets; ++i) {
>          new (Buckets[i].first) KeyT(other.Buckets[i].first);
>          if (Buckets[i].first != getEmptyKey() &&
> -	    Buckets[i].first != getTombstoneKey())
> +            Buckets[i].first != getTombstoneKey())
>            new (Buckets[i].second) ValueT(other.Buckets[i].second);
>        }
>      NumBuckets = other.NumBuckets;
> @@ -373,7 +387,7 @@
>    }
>  };
>
> -template<typename KeyT, typename ValueT, typename KeyInfoT>
> +template<typename KeyT, typename ValueT, typename KeyInfoT,  
> typename ValueInfoT>
>  class DenseMapIterator {
>    typedef std::pair<KeyT, ValueT> BucketT;
>  protected:
> @@ -416,7 +430,7 @@
>    }
>  };
>
> -template<typename KeyT, typename ValueT, typename KeyInfoT>
> +template<typename KeyT, typename ValueT, typename KeyInfoT,  
> typename ValueInfoT>
>  class DenseMapConstIterator : public DenseMapIterator<KeyT,  
> ValueT, KeyInfoT> {
>  public:
>    DenseMapConstIterator(const std::pair<KeyT, ValueT> *Pos,
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list