From cd93b9412c2620aa01ab5534a94620d9d01f2738 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 24 Jun 2015 13:22:09 +0800 Subject: [PATCH] Add C++ version of IDWeakMap --- atom/common/id_weak_map.cc | 70 ++++++++++++++++++++++++++++++++++++++++++++++ atom/common/id_weak_map.h | 55 ++++++++++++++++++++++++++++++++++++ filenames.gypi | 2 ++ 3 files changed, 127 insertions(+) create mode 100644 atom/common/id_weak_map.cc create mode 100644 atom/common/id_weak_map.h diff --git a/atom/common/id_weak_map.cc b/atom/common/id_weak_map.cc new file mode 100644 index 0000000..556b9ba --- /dev/null +++ b/atom/common/id_weak_map.cc @@ -0,0 +1,70 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include "atom/common/id_weak_map.h" + +#include + +#include "native_mate/converter.h" + +namespace atom { + +IDWeakMap::IDWeakMap() : next_id_(0) { +} + +IDWeakMap::~IDWeakMap() { +} + +int32_t IDWeakMap::Add(v8::Isolate* isolate, v8::Local object) { + int32_t id = GetNextID(); + object->SetHiddenValue(mate::StringToSymbol(isolate, "IDWeakMapKey"), + mate::Converter::ToV8(isolate, id)); + + auto global = make_linked_ptr(new v8::Global(isolate, object)); + global->SetWeak(this, &WeakCallback); + map_.emplace(id, global); + return id; +} + +v8::MaybeLocal IDWeakMap::Get(v8::Isolate* isolate, int32_t id) { + auto iter = map_.find(id); + if (iter == map_.end()) + return v8::MaybeLocal(); + else + return v8::Local::New(isolate, *iter->second); +} + +bool IDWeakMap::Has(int32_t id) const { + return map_.find(id) != map_.end(); +} + +std::vector IDWeakMap::Keys() const { + std::vector keys; + keys.reserve(map_.size()); + for (const auto& iter : map_) + keys.emplace_back(iter.first); + return keys; +} + +void IDWeakMap::Remove(int32_t id) { + auto iter = map_.find(id); + if (iter == map_.end()) + LOG(WARNING) << "Removing unexist object with ID " << id; + else + map_.erase(iter); +} + +int IDWeakMap::GetNextID() { + return ++next_id_; +} + +// static +void IDWeakMap::WeakCallback( + const v8::WeakCallbackData& data) { + int32_t id = data.GetValue()->GetHiddenValue( + mate::StringToV8(data.GetIsolate(), "IDWeakMapKey"))->Int32Value(); + data.GetParameter()->Remove(id); +} + +} // namespace atom diff --git a/atom/common/id_weak_map.h b/atom/common/id_weak_map.h new file mode 100644 index 0000000..4ef3c05 --- /dev/null +++ b/atom/common/id_weak_map.h @@ -0,0 +1,55 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_COMMON_ID_WEAK_MAP_H_ +#define ATOM_COMMON_ID_WEAK_MAP_H_ + +#include +#include + +#include "base/memory/linked_ptr.h" +#include "v8/include/v8.h" + +namespace atom { + +// Like ES6's WeakMap, but the key is Integer and the value is Weak Pointer. +class IDWeakMap { + public: + IDWeakMap(); + ~IDWeakMap(); + + // Adds |object| to WeakMap and returns its allocated |id|. + int32_t Add(v8::Isolate* isolate, v8::Local object); + + // Gets the object from WeakMap by its |id|. + v8::MaybeLocal Get(v8::Isolate* isolate, int32_t id); + + // Whethere there is an object with |id| in this WeakMap. + bool Has(int32_t id) const; + + // Returns IDs of all available objects. + std::vector Keys() const; + + // Remove object with |id| in the WeakMap. + void Remove(int32_t key); + + private: + // Returns next available ID. + int GetNextID(); + + static void WeakCallback( + const v8::WeakCallbackData& data); + + // ID of next stored object. + int32_t next_id_; + + // Map of stored objects. + std::unordered_map>> map_; + + DISALLOW_COPY_AND_ASSIGN(IDWeakMap); +}; + +} // namespace atom + +#endif // ATOM_COMMON_ID_WEAK_MAP_H_ diff --git a/filenames.gypi b/filenames.gypi index f0c940a..8a23c38 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -254,6 +254,8 @@ 'atom/common/event_emitter_caller.cc', 'atom/common/event_emitter_caller.h', 'atom/common/google_api_key.h', + 'atom/common/id_weak_map.cc', + 'atom/common/id_weak_map.h', 'atom/common/linux/application_info.cc', 'atom/common/native_mate_converters/accelerator_converter.cc', 'atom/common/native_mate_converters/accelerator_converter.h', -- 2.7.4