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);
89 class linked_ptr_internal {
108 void join(linked_ptr_internal
const* ptr)
109 GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
110 MutexLock lock(&g_linked_ptr_mutex);
112 linked_ptr_internal
const* p = ptr;
113 while (p->next_ != ptr) p = p->next_;
121 GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
122 MutexLock lock(&g_linked_ptr_mutex);
124 if (next_ ==
this)
return true;
125 linked_ptr_internal
const* p = next_;
126 while (p->next_ !=
this) p = p->next_;
132 mutable linked_ptr_internal
const* next_;
135 template <
typename T>
138 typedef T element_type;
142 explicit linked_ptr(
T* ptr = NULL) { capture(ptr); }
143 ~linked_ptr() { depart(); }
146 template <
typename U> linked_ptr(linked_ptr<U>
const& ptr) { copy(&ptr); }
147 linked_ptr(linked_ptr
const& ptr) {
148 assert(&ptr !=
this);
153 template <
typename U> linked_ptr& operator=(linked_ptr<U>
const& ptr) {
159 linked_ptr& operator=(linked_ptr
const& ptr) {
168 void reset(
T* ptr = NULL) {
172 T*
get()
const {
return value_; }
173 T* operator->()
const {
return value_; }
176 bool operator==(
T* p)
const {
return value_ == p; }
177 bool operator!=(
T* p)
const {
return value_ != p; }
178 template <
typename U>
179 bool operator==(linked_ptr<U>
const& ptr)
const {
180 return value_ == ptr.get();
182 template <
typename U>
183 bool operator!=(linked_ptr<U>
const& ptr)
const {
184 return value_ != ptr.get();
188 template <
typename U>
189 friend class linked_ptr;
192 linked_ptr_internal link_;
195 if (link_.depart())
delete value_;
198 void capture(
T* ptr) {
203 template <
typename U>
void copy(linked_ptr<U>
const* ptr) {
206 link_.join(&ptr->link_);
212 template<
typename T>
inline 213 bool operator==(
T* ptr,
const linked_ptr<T>& x) {
214 return ptr == x.get();
217 template<
typename T>
inline 218 bool operator!=(
T* ptr,
const linked_ptr<T>& x) {
219 return ptr != x.get();
225 template <
typename T>
226 linked_ptr<T> make_linked_ptr(
T* ptr) {
227 return linked_ptr<T>(ptr);
233 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ Definition: gtest-all.cc:113
const internal::permut_matrix_product_retval< PermutationDerived, Derived, OnTheRight > operator*(const MatrixBase< Derived > &matrix, const PermutationBase< PermutationDerived > &permutation)
Definition: PermutationMatrix.h:539
A small structure to hold a non zero as a triplet (i,j,value).
Definition: SparseUtil.h:148
Definition: BandTriangularSolver.h:13