23static const uintptr_t kPersistentContainerNotFound = 0;
39template<
typename K,
typename V>
43 typedef std::map<K, PersistentContainerValue>
Impl;
46 static bool Empty(
Impl* impl) {
return impl->empty(); }
47 static size_t Size(
Impl* impl) {
return impl->size(); }
55 std::pair<Iterator, bool> res = impl->insert(std::make_pair(key, value));
58 old_value = res.first->second;
59 res.first->second = value;
65 if (it == impl->end())
return kPersistentContainerNotFound;
70 if (it == impl->end())
return kPersistentContainerNotFound;
86template<
typename K,
typename V>
112template <
typename K,
typename V>
115 template <
typename T>
116 struct RemovePointer;
144 template <
typename T>
145 struct RemovePointer<T*> {
161template <
typename K,
typename V,
typename Traits>
169 size_t Size() {
return Traits::Size(&impl_); }
187 return Traits::Get(&impl_, key) != kPersistentContainerNotFound;
196 return SetReturnValueFromVal(&returnValue, Traits::Get(&impl_, key));
205 reinterpret_cast<internal::Object**
>(parent.val_),
206 reinterpret_cast<internal::Object**
>(
FromVal(Traits::Get(&impl_, key))));
215 V8::RegisterExternallyReferencedObject(
216 reinterpret_cast<internal::Object**
>(
FromVal(Traits::Get(&impl_, key))),
217 reinterpret_cast<internal::Isolate*
>(
GetIsolate()));
224 return Release(Traits::Remove(&impl_, key)).Pass();
232 typedef typename Traits::Iterator It;
235 while (!Traits::Empty(&impl_)) {
236 typename Traits::Impl
impl;
237 Traits::Swap(impl_,
impl);
238 for (It i = Traits::Begin(&
impl); i != Traits::End(&
impl); ++i) {
239 Traits::Dispose(isolate_,
Release(Traits::Value(i)).Pass(),
253 : value_(other.value_) { }
259 return value_ == kPersistentContainerNotFound;
263 return SetReturnValueFromVal(&returnValue, value_);
266 value_ = kPersistentContainerNotFound;
269 value_ = other.value_;
307 typename Traits::Impl*
impl() {
return &impl_; }
310 return reinterpret_cast<V*
>(v);
314 V* v = persistent->val_;
315 persistent->val_ = 0;
332 Traits::DisposeCallbackData(
333 p.template ClearWeak<typename Traits::WeakCallbackDataType>());
340 p.val_ =
FromVal(Traits::Remove(&impl_, key));
350 bool hasValue = value != kPersistentContainerNotFound;
352 returnValue->SetInternal(
353 *
reinterpret_cast<internal::Object**
>(
FromVal(value)));
359 typename Traits::Impl impl_;
363template <
typename K,
typename V,
typename Traits>
395 if (Traits::kCallbackType !=
kNotWeak) {
397 persistent->template SetWeak<typename Traits::WeakCallbackDataType>(
398 Traits::WeakCallbackParameter(
this, key, value), WeakCallback);
402 return this->
Release(old_value).Pass();
411 *reference = this->
Leak(&value);
416 static void WeakCallback(
418 if (Traits::kCallbackType !=
kNotWeak) {
420 Traits::MapFromWeakCallbackInfo(data);
421 K key = Traits::KeyFromWeakCallbackInfo(data);
423 persistentValueMap->
Remove(key).Pass(), key);
430template <
typename K,
typename V,
typename Traits>
462 if (Traits::kCallbackType !=
kNotWeak) {
468 persistent->template SetWeak<typename Traits::WeakCallbackDataType>(
469 Traits::WeakCallbackParameter(
this, key, value), OnWeakCallback,
474 return this->
Release(old_value).Pass();
483 *reference = this->
Leak(&value);
488 static void OnWeakCallback(
490 if (Traits::kCallbackType !=
kNotWeak) {
491 auto map = Traits::MapFromWeakCallbackInfo(data);
492 K key = Traits::KeyFromWeakCallbackInfo(data);
493 map->RemoveWeak(key);
494 Traits::OnWeakCallback(data);
499 static void SecondWeakCallback(
500 const WeakCallbackInfo<typename Traits::WeakCallbackDataType>& data) {
501 Traits::DisposeWeak(data);
513template<
typename K,
typename V,
514 typename Traits = DefaultPersistentValueMapTraits<K, V> >
529template <
typename K,
typename V,
530 typename Traits = DefaultGlobalMapTraits<K, V> >
540 typedef std::vector<PersistentContainerValue>
Impl;
543 impl->push_back(value);
546 return impl->empty();
552 return (i < impl->size()) ? impl->at(i) : kPersistentContainerNotFound;
555 impl->reserve(capacity);
573template<
typename V,
typename Traits = DefaultPersistentValueVectorTraits>
587 Traits::Append(&impl_, ClearAndLeak(&persistent));
594 Traits::Append(&impl_, ClearAndLeak(&persistent));
601 return Traits::IsEmpty(&impl_);
608 return Traits::Size(&impl_);
615 return Local<V>::New(isolate_, FromVal(Traits::Get(&impl_, index)));
622 size_t length = Traits::Size(&impl_);
623 for (
size_t i = 0; i < length; i++) {
625 p.val_ = FromVal(Traits::Get(&impl_, i));
627 Traits::Clear(&impl_);
635 Traits::ReserveCapacity(&impl_, capacity);
640 V* v = persistent->val_;
641 persistent->val_ = 0;
646 return reinterpret_cast<V*
>(v);
650 typename Traits::Impl impl_;
Definition: v8-util.h:113
static void DisposeCallbackData(WeakCallbackDataType *data)
Definition: v8-util.h:136
static void OnWeakCallback(const WeakCallbackInfo< WeakCallbackDataType > &data)
Definition: v8-util.h:137
static K KeyFromWeakCallbackInfo(const WeakCallbackInfo< WeakCallbackDataType > &data)
Definition: v8-util.h:132
GlobalValueMap< K, V, DefaultGlobalMapTraits< K, V > > MapType
Definition: v8-util.h:121
static MapType * MapFromWeakCallbackInfo(const WeakCallbackInfo< WeakCallbackDataType > &data)
Definition: v8-util.h:128
static const PersistentContainerCallbackType kCallbackType
Definition: v8-util.h:120
static void DisposeWeak(const WeakCallbackInfo< WeakCallbackDataType > &data)
Definition: v8-util.h:141
static WeakCallbackDataType * WeakCallbackParameter(MapType *map, const K &key, Local< V > value)
Definition: v8-util.h:124
static void Dispose(Isolate *isolate, Global< V > value, K key)
Definition: v8-util.h:139
void WeakCallbackDataType
Definition: v8-util.h:122
PersistentValueMap< K, V, DefaultPersistentValueMapTraits< K, V > > MapType
Definition: v8-util.h:92
static const PersistentContainerCallbackType kCallbackType
Definition: v8-util.h:90
static WeakCallbackDataType * WeakCallbackParameter(MapType *map, const K &key, Local< V > value)
Definition: v8-util.h:95
static void Dispose(Isolate *isolate, Global< V > value, K key)
Definition: v8-util.h:108
void WeakCallbackDataType
Definition: v8-util.h:93
static K KeyFromWeakCallbackInfo(const WeakCallbackInfo< WeakCallbackDataType > &data)
Definition: v8-util.h:103
static void DisposeCallbackData(WeakCallbackDataType *data)
Definition: v8-util.h:107
static MapType * MapFromWeakCallbackInfo(const WeakCallbackInfo< WeakCallbackDataType > &data)
Definition: v8-util.h:99
Definition: v8-util.h:538
static size_t Size(const Impl *impl)
Definition: v8-util.h:548
static bool IsEmpty(const Impl *impl)
Definition: v8-util.h:545
static void Clear(Impl *impl)
Definition: v8-util.h:557
static PersistentContainerValue Get(const Impl *impl, size_t i)
Definition: v8-util.h:551
static void Append(Impl *impl, PersistentContainerValue value)
Definition: v8-util.h:542
std::vector< PersistentContainerValue > Impl
Definition: v8-util.h:540
static void ReserveCapacity(Impl *impl, size_t capacity)
Definition: v8-util.h:554
Definition: v8-util.h:431
Global< V > Set(const K &key, Local< V > value)
Definition: v8-util.h:445
Global< V > Set(const K &key, Global< V > value)
Definition: v8-util.h:453
Global< V > SetUnique(const K &key, Global< V > *persistent)
Definition: v8-util.h:461
GlobalValueMap(Isolate *isolate)
Definition: v8-util.h:433
PersistentValueMapBase< K, V, Traits >::PersistentValueReference PersistentValueReference
Definition: v8-util.h:438
Global< V > Set(const K &key, Global< V > value, PersistentValueReference *reference)
Definition: v8-util.h:481
Global Pass()
Definition: v8.h:820
static Local< T > New(Isolate *isolate, Local< T > that)
Definition: v8.h:9136
void Reset()
Definition: v8.h:9242
bool IsWeak() const
Definition: v8.h:9233
Definition: v8-util.h:249
bool SetReturnValue(ReturnValue< T > returnValue)
Definition: v8-util.h:262
PersistentValueReference(const PersistentValueReference &other)
Definition: v8-util.h:252
bool IsEmpty() const
Definition: v8-util.h:258
void Reset()
Definition: v8-util.h:265
Local< V > NewLocal(Isolate *isolate) const
Definition: v8-util.h:255
PersistentValueReference()
Definition: v8-util.h:251
void operator=(const PersistentValueReference &other)
Definition: v8-util.h:268
Definition: v8-util.h:162
Traits::Impl * impl()
Definition: v8-util.h:307
PersistentValueMapBase(Isolate *isolate)
Definition: v8-util.h:302
void Clear()
Definition: v8-util.h:231
PersistentValueReference GetReference(const K &key)
Definition: v8-util.h:297
~PersistentValueMapBase()
Definition: v8-util.h:304
Local< V > Get(const K &key)
Definition: v8-util.h:179
void RemoveWeak(const K &key)
Definition: v8-util.h:338
void SetReference(const K &key, const Persistent< Object > &parent)
Definition: v8-util.h:202
static PersistentContainerValue ClearAndLeak(Global< V > *persistent)
Definition: v8-util.h:313
void RegisterExternallyReferencedObject(K &key)
Definition: v8-util.h:213
bool SetReturnValue(const K &key, ReturnValue< Value > returnValue)
Definition: v8-util.h:194
bool Contains(const K &key)
Definition: v8-util.h:186
bool IsWeak()
Definition: v8-util.h:174
static V * FromVal(PersistentContainerValue v)
Definition: v8-util.h:309
Isolate * isolate()
Definition: v8-util.h:306
Isolate * GetIsolate()
Definition: v8-util.h:164
static PersistentContainerValue Leak(Global< V > *persistent)
Definition: v8-util.h:319
size_t Size()
Definition: v8-util.h:169
static Global< V > Release(PersistentContainerValue v)
Definition: v8-util.h:328
Global< V > Remove(const K &key)
Definition: v8-util.h:223
Definition: v8-util.h:364
Global< V > Set(const K &key, Global< V > value, PersistentValueReference *reference)
Definition: v8-util.h:409
Global< V > Set(const K &key, Global< V > value)
Definition: v8-util.h:386
Global< V > SetUnique(const K &key, Global< V > *persistent)
Definition: v8-util.h:394
Global< V > Set(const K &key, Local< V > value)
Definition: v8-util.h:378
PersistentValueMapBase< K, V, Traits >::PersistentValueReference PersistentValueReference
Definition: v8-util.h:371
PersistentValueMap(Isolate *isolate)
Definition: v8-util.h:366
Definition: v8-util.h:574
void Append(Local< V > value)
Definition: v8-util.h:585
~PersistentValueVector()
Definition: v8-util.h:578
Local< V > Get(size_t index) const
Definition: v8-util.h:614
bool IsEmpty() const
Definition: v8-util.h:600
PersistentValueVector(Isolate *isolate)
Definition: v8-util.h:576
void Append(Global< V > persistent)
Definition: v8-util.h:593
void Clear()
Definition: v8-util.h:621
void ReserveCapacity(size_t capacity)
Definition: v8-util.h:634
size_t Size() const
Definition: v8-util.h:607
Definition: v8-util.h:531
StdGlobalValueMap(Isolate *isolate)
Definition: v8-util.h:533
static PersistentContainerValue Set(Impl *impl, K key, PersistentContainerValue value)
Definition: v8-util.h:53
static Iterator End(Impl *impl)
Definition: v8-util.h:50
static size_t Size(Impl *impl)
Definition: v8-util.h:47
static bool Empty(Impl *impl)
Definition: v8-util.h:46
static PersistentContainerValue Get(Impl *impl, K key)
Definition: v8-util.h:63
static K Key(Iterator it)
Definition: v8-util.h:51
static Iterator Begin(Impl *impl)
Definition: v8-util.h:49
std::map< K, PersistentContainerValue > Impl
Definition: v8-util.h:43
Impl::iterator Iterator
Definition: v8-util.h:44
static PersistentContainerValue Remove(Impl *impl, K key)
Definition: v8-util.h:68
static PersistentContainerValue Value(Iterator it)
Definition: v8-util.h:52
static void Swap(Impl &a, Impl &b)
Definition: v8-util.h:48
Definition: v8-util.h:515
StdPersistentValueMap(Isolate *isolate)
Definition: v8-util.h:517
Isolate * GetIsolate() const
Definition: v8.h:427
T * GetParameter() const
Definition: v8.h:428
void SetSecondPassCallback(Callback callback) const
Definition: v8.h:451
Definition: libplatform.h:12
WeakCallbackType
Definition: v8.h:466
PersistentContainerCallbackType
Definition: v8-util.h:24
@ kWeak
Definition: v8-util.h:29
@ kWeakWithInternalFields
Definition: v8-util.h:28
@ kWeakWithParameter
Definition: v8-util.h:27
@ kNotWeak
Definition: v8-util.h:25
uintptr_t PersistentContainerValue
Definition: v8-util.h:22