Server IP : 127.0.0.2 / Your IP : 3.16.50.164 Web Server : Apache/2.4.18 (Ubuntu) System : User : www-data ( ) PHP Version : 7.0.33-0ubuntu0.16.04.16 Disable Function : disk_free_space,disk_total_space,diskfreespace,dl,exec,fpaththru,getmyuid,getmypid,highlight_file,ignore_user_abord,leak,listen,link,opcache_get_configuration,opcache_get_status,passthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,php_uname,phpinfo,posix_ctermid,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix,_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_times,posix_ttyname,posix_uname,pclose,popen,proc_open,proc_close,proc_get_status,proc_nice,proc_terminate,shell_exec,source,show_source,system,virtual MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /usr/include/nodejs/src/ |
Upload File : |
#ifndef SRC_UTIL_INL_H_ #define SRC_UTIL_INL_H_ #include "util.h" namespace node { template <typename T> ListNode<T>::ListNode() : prev_(this), next_(this) {} template <typename T> ListNode<T>::~ListNode() { Remove(); } template <typename T> void ListNode<T>::Remove() { prev_->next_ = next_; next_->prev_ = prev_; prev_ = this; next_ = this; } template <typename T> bool ListNode<T>::IsEmpty() const { return prev_ == this; } template <typename T, ListNodeMember(T) M> ListHead<T, M>::Iterator::Iterator(ListNode<T>* node) : node_(node) {} template <typename T, ListNodeMember(T) M> T* ListHead<T, M>::Iterator::operator*() const { return ContainerOf(M, node_); } template <typename T, ListNodeMember(T) M> const typename ListHead<T, M>::Iterator& ListHead<T, M>::Iterator::operator++() { node_ = node_->next_; return *this; } template <typename T, ListNodeMember(T) M> bool ListHead<T, M>::Iterator::operator!=(const Iterator& that) const { return node_ != that.node_; } template <typename T, ListNodeMember(T) M> ListHead<T, M>::~ListHead() { while (IsEmpty() == false) head_.next_->Remove(); } template <typename T, ListNodeMember(T) M> void ListHead<T, M>::MoveBack(ListHead* that) { if (IsEmpty()) return; ListNode<T>* to = &that->head_; head_.next_->prev_ = to->prev_; to->prev_->next_ = head_.next_; head_.prev_->next_ = to; to->prev_ = head_.prev_; head_.prev_ = &head_; head_.next_ = &head_; } template <typename T, ListNodeMember(T) M> void ListHead<T, M>::PushBack(T* element) { ListNode<T>* that = &(element->*M); head_.prev_->next_ = that; that->prev_ = head_.prev_; that->next_ = &head_; head_.prev_ = that; } template <typename T, ListNodeMember(T) M> void ListHead<T, M>::PushFront(T* element) { ListNode<T>* that = &(element->*M); head_.next_->prev_ = that; that->prev_ = &head_; that->next_ = head_.next_; head_.next_ = that; } template <typename T, ListNodeMember(T) M> bool ListHead<T, M>::IsEmpty() const { return head_.IsEmpty(); } template <typename T, ListNodeMember(T) M> T* ListHead<T, M>::PopFront() { if (IsEmpty()) return nullptr; ListNode<T>* node = head_.next_; node->Remove(); return ContainerOf(M, node); } template <typename T, ListNodeMember(T) M> typename ListHead<T, M>::Iterator ListHead<T, M>::begin() const { return Iterator(head_.next_); } template <typename T, ListNodeMember(T) M> typename ListHead<T, M>::Iterator ListHead<T, M>::end() const { return Iterator(const_cast<ListNode<T>*>(&head_)); } template <typename Inner, typename Outer> ContainerOfHelper<Inner, Outer>::ContainerOfHelper(Inner Outer::*field, Inner* pointer) : pointer_(reinterpret_cast<Outer*>( reinterpret_cast<uintptr_t>(pointer) - reinterpret_cast<uintptr_t>(&(static_cast<Outer*>(0)->*field)))) { } template <typename Inner, typename Outer> template <typename TypeName> ContainerOfHelper<Inner, Outer>::operator TypeName*() const { return static_cast<TypeName*>(pointer_); } template <typename Inner, typename Outer> inline ContainerOfHelper<Inner, Outer> ContainerOf(Inner Outer::*field, Inner* pointer) { return ContainerOfHelper<Inner, Outer>(field, pointer); } template <class TypeName> inline v8::Local<TypeName> PersistentToLocal( v8::Isolate* isolate, const v8::Persistent<TypeName>& persistent) { if (persistent.IsWeak()) { return WeakPersistentToLocal(isolate, persistent); } else { return StrongPersistentToLocal(persistent); } } template <class TypeName> inline v8::Local<TypeName> StrongPersistentToLocal( const v8::Persistent<TypeName>& persistent) { return *reinterpret_cast<v8::Local<TypeName>*>( const_cast<v8::Persistent<TypeName>*>(&persistent)); } template <class TypeName> inline v8::Local<TypeName> WeakPersistentToLocal( v8::Isolate* isolate, const v8::Persistent<TypeName>& persistent) { return v8::Local<TypeName>::New(isolate, persistent); } inline v8::Local<v8::String> OneByteString(v8::Isolate* isolate, const char* data, int length) { return v8::String::NewFromOneByte(isolate, reinterpret_cast<const uint8_t*>(data), v8::String::kNormalString, length); } inline v8::Local<v8::String> OneByteString(v8::Isolate* isolate, const signed char* data, int length) { return v8::String::NewFromOneByte(isolate, reinterpret_cast<const uint8_t*>(data), v8::String::kNormalString, length); } inline v8::Local<v8::String> OneByteString(v8::Isolate* isolate, const unsigned char* data, int length) { return v8::String::NewFromOneByte(isolate, reinterpret_cast<const uint8_t*>(data), v8::String::kNormalString, length); } template <typename TypeName> void Wrap(v8::Local<v8::Object> object, TypeName* pointer) { CHECK_EQ(false, object.IsEmpty()); CHECK_GT(object->InternalFieldCount(), 0); object->SetAlignedPointerInInternalField(0, pointer); } void ClearWrap(v8::Local<v8::Object> object) { Wrap<void>(object, nullptr); } template <typename TypeName> TypeName* Unwrap(v8::Local<v8::Object> object) { CHECK_EQ(false, object.IsEmpty()); CHECK_GT(object->InternalFieldCount(), 0); void* pointer = object->GetAlignedPointerFromInternalField(0); return static_cast<TypeName*>(pointer); } } // namespace node #endif // SRC_UTIL_INL_H_