68 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
69 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
74 #include "gtest/internal/gtest-port.h"
80 GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
109 GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
113 while (p->next_ != ptr) {
114 assert(p->next_ !=
this &&
115 "Trying to join() a linked ring we are already in. "
116 "Is GMock thread safety enabled?");
126 GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
129 if (next_ ==
this)
return true;
131 while (p->next_ !=
this) {
132 assert(p->next_ != next_ &&
133 "Trying to depart() a linked ring we are not in. "
134 "Is GMock thread safety enabled?");
145 template <
typename T>
148 typedef T element_type;
152 explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
158 assert(&ptr !=
this);
178 void reset(T* ptr = NULL) {
182 T*
get()
const {
return value_; }
183 T* operator->()
const {
return value_; }
184 T& operator*()
const {
return *value_; }
186 bool operator==(T* p)
const {
return value_ == p; }
187 bool operator!=(T* p)
const {
return value_ != p; }
188 template <
typename U>
190 return value_ == ptr.get();
192 template <
typename U>
194 return value_ != ptr.get();
198 template <
typename U>
205 if (link_.depart())
delete value_;
208 void capture(T* ptr) {
216 link_.join(&ptr->link_);
222 template<
typename T>
inline
224 return ptr == x.get();
227 template<
typename T>
inline
228 bool operator!=(T* ptr,
const linked_ptr<T>& x) {
229 return ptr != x.get();
235 template <
typename T>
236 linked_ptr<T> make_linked_ptr(T* ptr) {
237 return linked_ptr<T>(ptr);
243 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_