/ runtime / WeakGCMap.h
WeakGCMap.h
  1  /*
  2   * Copyright (C) 2009, 2015-2016 Apple Inc. All rights reserved.
  3   *
  4   * Redistribution and use in source and binary forms, with or without
  5   * modification, are permitted provided that the following conditions
  6   * are met:
  7   * 1. Redistributions of source code must retain the above copyright
  8   *    notice, this list of conditions and the following disclaimer.
  9   * 2. Redistributions in binary form must reproduce the above copyright
 10   *    notice, this list of conditions and the following disclaimer in the
 11   *    documentation and/or other materials provided with the distribution.
 12   *
 13   * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 14   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 15   * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16   * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 17   * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 18   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 19   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 20   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 21   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 22   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 23   * THE POSSIBILITY OF SUCH DAMAGE.
 24   */
 25  
 26  #pragma once
 27  
 28  #include "Weak.h"
 29  #include <wtf/HashMap.h>
 30  
 31  namespace JSC {
 32  
 33  // A HashMap with Weak<JSCell> values, which automatically removes values once they're garbage collected.
 34  
 35  class WeakGCMapBase {
 36  public:
 37      virtual ~WeakGCMapBase() { }
 38      virtual void pruneStaleEntries() = 0;
 39  };
 40  
 41  template<typename KeyArg, typename ValueArg, typename HashArg = DefaultHash<KeyArg>,
 42      typename KeyTraitsArg = HashTraits<KeyArg>>
 43  class WeakGCMap final : public WeakGCMapBase {
 44      WTF_MAKE_FAST_ALLOCATED;
 45      typedef Weak<ValueArg> ValueType;
 46      typedef HashMap<KeyArg, ValueType, HashArg, KeyTraitsArg> HashMapType;
 47  
 48  public:
 49      typedef typename HashMapType::KeyType KeyType;
 50      typedef typename HashMapType::AddResult AddResult;
 51      typedef typename HashMapType::iterator iterator;
 52      typedef typename HashMapType::const_iterator const_iterator;
 53  
 54      explicit WeakGCMap(VM&);
 55      ~WeakGCMap() final;
 56  
 57      ValueArg* get(const KeyType& key) const
 58      {
 59          return m_map.get(key);
 60      }
 61  
 62      AddResult set(const KeyType& key, ValueType value)
 63      {
 64          return m_map.set(key, WTFMove(value));
 65      }
 66  
 67      bool remove(const KeyType& key)
 68      {
 69          return m_map.remove(key);
 70      }
 71  
 72      void clear()
 73      {
 74          m_map.clear();
 75      }
 76  
 77      bool isEmpty() const
 78      {
 79          const_iterator it = m_map.begin();
 80          const_iterator end = m_map.end();
 81          while (it != end) {
 82              if (it->value)
 83                  return true;
 84          }
 85          return false;
 86      }
 87  
 88      inline iterator find(const KeyType& key);
 89  
 90      inline const_iterator find(const KeyType& key) const;
 91  
 92      inline bool contains(const KeyType& key) const;
 93  
 94      void pruneStaleEntries() final;
 95  
 96  private:
 97      HashMapType m_map;
 98      VM& m_vm;
 99  };
100  
101  } // namespace JSC