diff options
author | Minteck <contact@minteck.org> | 2022-02-25 18:08:27 +0100 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2022-02-25 18:08:27 +0100 |
commit | a5c417748112e9d88d9ca522561e338eb9ba9007 (patch) | |
tree | ddab6e854fe8b50942a397a0d9fd8330ad662a97 /node_modules/nan/nan_persistent_pre_12_inl.h | |
download | argon-cdn-a5c417748112e9d88d9ca522561e338eb9ba9007.tar.gz argon-cdn-a5c417748112e9d88d9ca522561e338eb9ba9007.tar.bz2 argon-cdn-a5c417748112e9d88d9ca522561e338eb9ba9007.zip |
Initial commit
Diffstat (limited to 'node_modules/nan/nan_persistent_pre_12_inl.h')
-rw-r--r-- | node_modules/nan/nan_persistent_pre_12_inl.h | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/node_modules/nan/nan_persistent_pre_12_inl.h b/node_modules/nan/nan_persistent_pre_12_inl.h new file mode 100644 index 0000000..4c9c59d --- /dev/null +++ b/node_modules/nan/nan_persistent_pre_12_inl.h @@ -0,0 +1,242 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md> + ********************************************************************/ + +#ifndef NAN_PERSISTENT_PRE_12_INL_H_ +#define NAN_PERSISTENT_PRE_12_INL_H_ + +template<typename T> +class PersistentBase { + v8::Persistent<T> persistent; + template<typename U> + friend v8::Local<U> New(const PersistentBase<U> &p); + template<typename U, typename M> + friend v8::Local<U> New(const Persistent<U, M> &p); + template<typename U> + friend v8::Local<U> New(const Global<U> &p); + template<typename S> friend class ReturnValue; + + public: + inline PersistentBase() : + persistent() {} + + inline void Reset() { + persistent.Dispose(); + persistent.Clear(); + } + + template<typename S> + inline void Reset(const v8::Local<S> &other) { + TYPE_CHECK(T, S); + + if (!persistent.IsEmpty()) { + persistent.Dispose(); + } + + if (other.IsEmpty()) { + persistent.Clear(); + } else { + persistent = v8::Persistent<T>::New(other); + } + } + + template<typename S> + inline void Reset(const PersistentBase<S> &other) { + TYPE_CHECK(T, S); + + if (!persistent.IsEmpty()) { + persistent.Dispose(); + } + + if (other.IsEmpty()) { + persistent.Clear(); + } else { + persistent = v8::Persistent<T>::New(other.persistent); + } + } + + inline bool IsEmpty() const { return persistent.IsEmpty(); } + + inline void Empty() { persistent.Clear(); } + + template<typename S> + inline bool operator==(const PersistentBase<S> &that) const { + return this->persistent == that.persistent; + } + + template<typename S> + inline bool operator==(const v8::Local<S> &that) const { + return this->persistent == that; + } + + template<typename S> + inline bool operator!=(const PersistentBase<S> &that) const { + return !operator==(that); + } + + template<typename S> + inline bool operator!=(const v8::Local<S> &that) const { + return !operator==(that); + } + + template<typename P> + inline void SetWeak( + P *parameter + , typename WeakCallbackInfo<P>::Callback callback + , WeakCallbackType type); + + inline void ClearWeak() { persistent.ClearWeak(); } + + inline void MarkIndependent() { persistent.MarkIndependent(); } + + inline bool IsIndependent() const { return persistent.IsIndependent(); } + + inline bool IsNearDeath() const { return persistent.IsNearDeath(); } + + inline bool IsWeak() const { return persistent.IsWeak(); } + + private: + inline explicit PersistentBase(v8::Persistent<T> that) : + persistent(that) { } + inline explicit PersistentBase(T *val) : persistent(val) {} + template<typename S, typename M> friend class Persistent; + template<typename S> friend class Global; + friend class ObjectWrap; +}; + +template<typename T> +class NonCopyablePersistentTraits { + public: + typedef Persistent<T, NonCopyablePersistentTraits<T> > + NonCopyablePersistent; + static const bool kResetInDestructor = false; + template<typename S, typename M> + inline static void Copy(const Persistent<S, M> &source, + NonCopyablePersistent *dest) { + Uncompilable<v8::Object>(); + } + + template<typename O> inline static void Uncompilable() { + TYPE_CHECK(O, v8::Primitive); + } +}; + +template<typename T> +struct CopyablePersistentTraits { + typedef Persistent<T, CopyablePersistentTraits<T> > CopyablePersistent; + static const bool kResetInDestructor = true; + template<typename S, typename M> + static inline void Copy(const Persistent<S, M> &source, + CopyablePersistent *dest) {} +}; + +template<typename T, typename M> class Persistent : + public PersistentBase<T> { + public: + inline Persistent() {} + + template<typename S> inline Persistent(v8::Handle<S> that) + : PersistentBase<T>(v8::Persistent<T>::New(that)) { + TYPE_CHECK(T, S); + } + + inline Persistent(const Persistent &that) : PersistentBase<T>() { + Copy(that); + } + + template<typename S, typename M2> + inline Persistent(const Persistent<S, M2> &that) : + PersistentBase<T>() { + Copy(that); + } + + inline Persistent &operator=(const Persistent &that) { + Copy(that); + return *this; + } + + template <class S, class M2> + inline Persistent &operator=(const Persistent<S, M2> &that) { + Copy(that); + return *this; + } + + inline ~Persistent() { + if (M::kResetInDestructor) this->Reset(); + } + + private: + inline T *operator*() const { return *PersistentBase<T>::persistent; } + + template<typename S, typename M2> + inline void Copy(const Persistent<S, M2> &that) { + TYPE_CHECK(T, S); + + this->Reset(); + + if (!that.IsEmpty()) { + this->persistent = v8::Persistent<T>::New(that.persistent); + M::Copy(that, this); + } + } +}; + +template<typename T> +class Global : public PersistentBase<T> { + struct RValue { + inline explicit RValue(Global* obj) : object(obj) {} + Global* object; + }; + + public: + inline Global() : PersistentBase<T>(0) { } + + template <typename S> + inline Global(v8::Local<S> that) // NOLINT(runtime/explicit) + : PersistentBase<T>(v8::Persistent<T>::New(that)) { + TYPE_CHECK(T, S); + } + + template <typename S> + inline Global(const PersistentBase<S> &that) // NOLINT(runtime/explicit) + : PersistentBase<T>(that) { + TYPE_CHECK(T, S); + } + /** + * Move constructor. + */ + inline Global(RValue rvalue) // NOLINT(runtime/explicit) + : PersistentBase<T>(rvalue.object->persistent) { + rvalue.object->Reset(); + } + inline ~Global() { this->Reset(); } + /** + * Move via assignment. + */ + template<typename S> + inline Global &operator=(Global<S> rhs) { + TYPE_CHECK(T, S); + this->Reset(rhs.persistent); + rhs.Reset(); + return *this; + } + /** + * Cast operator for moves. + */ + inline operator RValue() { return RValue(this); } + /** + * Pass allows returning uniques from functions, etc. + */ + Global Pass() { return Global(RValue(this)); } + + private: + Global(Global &); + void operator=(Global &); + template<typename S> friend class ReturnValue; +}; + +#endif // NAN_PERSISTENT_PRE_12_INL_H_ |