16f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch/*
26f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * Copyright (C) 2014 Google Inc. All rights reserved.
36f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch *
46f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * Redistribution and use in source and binary forms, with or without
56f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * modification, are permitted provided that the following conditions are
66f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * met:
76f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch *
86f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch *     * Redistributions of source code must retain the above copyright
96f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * notice, this list of conditions and the following disclaimer.
106f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch *     * Redistributions in binary form must reproduce the above
116f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * copyright notice, this list of conditions and the following disclaimer
126f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * in the documentation and/or other materials provided with the
136f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * distribution.
146f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch *     * Neither the name of Google Inc. nor the names of its
156f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * contributors may be used to endorse or promote products derived from
166f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * this software without specific prior written permission.
176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch *
186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
216f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
246f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
266f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
276f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
296f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch */
306f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
316f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#ifndef V8PersistentValueMap_h
326f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#define V8PersistentValueMap_h
336f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
346f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "wtf/HashMap.h"
356f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include <v8-util.h>
366f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include <v8.h>
376f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
396f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
406f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch/**
416f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * A Traits class for v8::PersistentValueMap that uses wtf/HashMap as a
426f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * backing store.
436f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch *
446f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * The parameter is_weak will determine whether the references are 'weak'.
456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * If so, entries will be removed from the map as the weak references are
466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * collected.
476f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch */
486f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochtemplate<class KeyType, class ValueType, bool is_weak>
496f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochclass V8PersistentValueMapTraits {
506f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochpublic:
516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // Map traits:
526f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    typedef HashMap<KeyType, v8::PersistentContainerValue> Impl;
536f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    typedef typename Impl::iterator Iterator;
546f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static size_t Size(const Impl* impl) { return impl->size(); }
556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static bool Empty(Impl* impl) { return impl->isEmpty(); }
566f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static void Swap(Impl& impl, Impl& other) { impl.swap(other); }
576f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static Iterator Begin(Impl* impl) { return impl->begin(); }
586f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static Iterator End(Impl* impl) { return impl->end(); }
596f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static v8::PersistentContainerValue Value(Iterator& iter)
606f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
616f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return iter->value;
626f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
636f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static KeyType Key(Iterator& iter) { return iter->key; }
646f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static v8::PersistentContainerValue Set(
656f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        Impl* impl, KeyType key, v8::PersistentContainerValue value)
666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
676f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        v8::PersistentContainerValue oldValue = Get(impl, key);
68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        impl->set(key, value);
696f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return oldValue;
706f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static v8::PersistentContainerValue Get(const Impl* impl, KeyType key)
726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
736f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return impl->get(key);
746f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
766f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static v8::PersistentContainerValue Remove(Impl* impl, KeyType key)
776f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
786f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return impl->take(key);
796f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
806f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
816f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // Weak traits:
826f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static const v8::PersistentContainerCallbackType kCallbackType = is_weak ? v8::kWeak : v8::kNotWeak;
836f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    typedef v8::PersistentValueMap<KeyType, ValueType, V8PersistentValueMapTraits<KeyType, ValueType, is_weak> > MapType;
846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
856f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    typedef void WeakCallbackDataType;
866f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
876f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static WeakCallbackDataType* WeakCallbackParameter(MapType* map, KeyType key, const v8::Local<ValueType>& value)
886f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
896f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return 0;
906f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
916f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
926f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static void DisposeCallbackData(WeakCallbackDataType* callbackData)
936f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
946f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
956f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
966f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static MapType* MapFromWeakCallbackData(
976f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        const v8::WeakCallbackData<ValueType, WeakCallbackDataType>& data)
986f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
996f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return 0;
1006f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
1016f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
1026f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static KeyType KeyFromWeakCallbackData(
1036f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        const v8::WeakCallbackData<ValueType, WeakCallbackDataType>& data)
1046f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
1056f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return KeyType();
1066f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
1076f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
1086f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // Dispose traits:
1096f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    static void Dispose(v8::Isolate* isolate, v8::UniquePersistent<ValueType> value, KeyType key) { }
1106f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch};
1116f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
1126f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch/**
1136f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * A map for safely storing persistent V8 values, based on
1146f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * v8::PersistentValueMap.
1156f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch *
1166f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * If is_weak is set, values will be held weakly and map entries will be
1176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch * removed as their values are being collected.
1186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch */
1196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochtemplate<class KeyType, class ValueType, bool is_weak = true>
1206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochclass V8PersistentValueMap : public v8::PersistentValueMap<KeyType, ValueType, V8PersistentValueMapTraits<KeyType, ValueType, is_weak> > {
1216f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochpublic:
1226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    typedef V8PersistentValueMapTraits<KeyType, ValueType, is_weak> Traits;
1236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    explicit V8PersistentValueMap(v8::Isolate* isolate) : v8::PersistentValueMap<KeyType, ValueType, Traits>(isolate) { }
1246f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch};
1256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1276f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
1286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#endif // V8PersistentValueMap_h
129