22 static const uintptr_t kPersistentContainerNotFound = 0;
38 template<
typename K,
typename V>
45 static bool Empty(
Impl* impl) {
return impl->empty(); }
46 static size_t
Size(
Impl* impl) {
return impl->size(); }
54 std::pair<
Iterator,
bool> res = impl->insert(std::make_pair(key, value));
57 old_value = res.first->second;
58 res.first->second = value;
64 if (it == impl->end())
return kPersistentContainerNotFound;
69 if (it == impl->end())
return kPersistentContainerNotFound;
85 template<
typename K,
typename V>
111 template <
typename K,
typename V>
114 template <
typename T>
115 struct RemovePointer;
143 template <
typename T>
144 struct RemovePointer<T*> {
160 template <
typename K,
typename V,
typename Traits>
168 size_t
Size() {
return Traits::Size(&impl_); }
179 return Local<V>::New(isolate_,
FromVal(Traits::Get(&impl_, key)
));
186 return Traits::Get(&impl_, key) != kPersistentContainerNotFound;
195 return SetReturnValueFromVal(&returnValue, Traits::Get(&impl_, key));
204 reinterpret_cast<
internal::Object**>(parent.val_),
212 return Release(Traits::Remove(&impl_, key)
).Pass();
220 typedef typename Traits::Iterator It;
223 while (!Traits::Empty(&impl_)) {
224 typename Traits::Impl impl;
225 Traits::Swap(impl_, impl);
226 for (It i = Traits::Begin(&impl); i != Traits::End(&impl); ++i) {
227 Traits::Dispose(isolate_,
Release(Traits::Value(i)
).Pass(),
241 : value_(other.value_) { }
247 return value_ == kPersistentContainerNotFound;
251 return SetReturnValueFromVal(&returnValue, value_);
254 value_ = kPersistentContainerNotFound;
257 value_ = other.value_;
298 return reinterpret_cast<V*>(v);
302 V* v = persistent->val_;
303 persistent->val_ = 0;
319 if (Traits::kCallbackType !=
kNotWeak && p.IsWeak()) {
320 Traits::DisposeCallbackData(
321 p.
template ClearWeak<
typename Traits::WeakCallbackDataType>());
328 p.val_ =
FromVal(Traits::Remove(&impl_, key)
);
338 bool hasValue = value != kPersistentContainerNotFound;
340 returnValue->SetInternal(
347 typename Traits::Impl impl_;
351 template <
typename K,
typename V,
typename Traits>
367 Global<V> persistent(
this->isolate(), value);
383 if (Traits::kCallbackType !=
kNotWeak) {
384 Local<V> value(
Local<V>::New(
this->isolate(), *persistent));
385 persistent->
template SetWeak<
typename Traits::WeakCallbackDataType>(
386 Traits::WeakCallbackParameter(
this, key, value), WeakCallback);
389 Traits::Set(
this->impl(), key,
this->ClearAndLeak(persistent));
390 return this->Release(old_value).Pass();
399 *reference =
this->Leak(&value);
404 static void WeakCallback(
406 if (Traits::kCallbackType !=
kNotWeak) {
408 Traits::MapFromWeakCallbackData(data);
409 K key = Traits::KeyFromWeakCallbackData(data);
410 Traits::Dispose(data.GetIsolate(),
411 persistentValueMap->Remove(key).Pass(), key);
412 Traits::DisposeCallbackData(data.GetParameter());
418 template <
typename K,
typename V,
typename Traits>
434 Global<V> persistent(
this->isolate(), value);
450 if (Traits::kCallbackType !=
kNotWeak) {
455 Local<V> value(
Local<V>::New(
this->isolate(), *persistent));
456 persistent->
template SetWeak<
typename Traits::WeakCallbackDataType>(
457 Traits::WeakCallbackParameter(
this, key, value), OnWeakCallback,
461 Traits::Set(
this->impl(), key,
this->ClearAndLeak(persistent));
462 return this->Release(old_value).Pass();
471 *reference =
this->Leak(&value);
476 static void OnWeakCallback(
478 if (Traits::kCallbackType !=
kNotWeak) {
479 auto map = Traits::MapFromWeakCallbackInfo(data);
480 K key = Traits::KeyFromWeakCallbackInfo(data);
481 map->RemoveWeak(key);
482 Traits::OnWeakCallback(data);
483 data.SetSecondPassCallback(SecondWeakCallback);
487 static void SecondWeakCallback(
489 Traits::DisposeWeak(data);
501 template<
typename K,
typename V,
517 template <
typename K,
typename V,
531 impl->push_back(value);
534 return impl->empty();
540 return (i < impl->size()) ? impl->at(i) : kPersistentContainerNotFound;
543 impl->reserve(capacity);
574 Global<V> persistent(isolate_, value);
575 Traits::Append(&impl_, ClearAndLeak(&persistent));
582 Traits::Append(&impl_, ClearAndLeak(&persistent));
589 return Traits::IsEmpty(&impl_);
596 return Traits::Size(&impl_);
603 return Local<V>::New(isolate_, FromVal(Traits::Get(&impl_, index)));
610 size_t length = Traits::Size(&impl_);
611 for (size_t i = 0; i < length; i++) {
613 p.val_ = FromVal(Traits::Get(&impl_, i));
615 Traits::Clear(&impl_);
623 Traits::ReserveCapacity(&impl_, capacity);
628 V* v = persistent->val_;
629 persistent->val_ = 0;
634 return reinterpret_cast<V*>(v);
638 typename Traits::Impl impl_;