#ifndef SRC_NODE_THREADSAFE_COW_INL_H_ #define SRC_NODE_THREADSAFE_COW_INL_H_ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS namespace node { template T* CopyOnWrite::write() { if (data_.use_count() > 1l) { data_ = std::make_shared(*data_); } return data_.get(); } template ThreadsafeCopyOnWrite::Read::Read(const ThreadsafeCopyOnWrite* cow) : cow_(cow), lock_(cow->impl_->mutex) {} template const T& ThreadsafeCopyOnWrite::Read::operator*() const { return cow_->impl_->data; } template const T* ThreadsafeCopyOnWrite::Read::operator->() const { return &cow_->impl_->data; } template ThreadsafeCopyOnWrite::Write::Write(ThreadsafeCopyOnWrite* cow) : cow_(cow), impl_(cow->impl_.write()), lock_(impl_->mutex) {} template T& ThreadsafeCopyOnWrite::Write::operator*() { return impl_->data; } template T* ThreadsafeCopyOnWrite::Write::operator->() { return &impl_->data; } template ThreadsafeCopyOnWrite::Impl::Impl(const Impl& other) { RwLock::ScopedReadLock lock(other.mutex); data = other.data; } } // namespace node #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #endif // SRC_NODE_THREADSAFE_COW_INL_H_