13d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Copyright 2003 Google Inc. 23d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// All rights reserved. 33d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 43d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Redistribution and use in source and binary forms, with or without 53d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// modification, are permitted provided that the following conditions are 63d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// met: 73d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 83d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// * Redistributions of source code must retain the above copyright 93d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// notice, this list of conditions and the following disclaimer. 103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// * Redistributions in binary form must reproduce the above 113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// copyright notice, this list of conditions and the following disclaimer 123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// in the documentation and/or other materials provided with the 133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// distribution. 143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// * Neither the name of Google Inc. nor the names of its 153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// contributors may be used to endorse or promote products derived from 163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// this software without specific prior written permission. 173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Authors: Dan Egnor (egnor@google.com) 313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A "smart" pointer type with reference tracking. Every pointer to a 333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// particular object is kept on a circular linked list. When the last pointer 343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// to an object is destroyed or reassigned, the object is deleted. 353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Used properly, this deletes the object when the last reference goes away. 373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// There are several caveats: 383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// - Like all reference counting schemes, cycles lead to leaks. 393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// - Each smart pointer is actually two pointers (8 bytes instead of 4). 403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// - Every time a pointer is assigned, the entire list of pointers to that 413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// object is traversed. This class is therefore NOT SUITABLE when there 423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// will often be more than two or three pointers to a particular object. 433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// - References are only tracked as long as linked_ptr<> objects are copied. 443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS 453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// will happen (double deletion). 463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A good use of this class is storing object references in STL containers. 483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// You can safely put linked_ptr<> in a vector<>. 493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Other uses may not be as good. 503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Note: If you use an incomplete type with linked_ptr<>, the class 523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// *containing* linked_ptr<> must have a constructor and destructor (even 533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// if they do nothing!). 543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Bill Gibbons suggested we use something like this. 563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Thread Safety: 583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Unlike other linked_ptr implementations, in this implementation 593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// a linked_ptr object is thread-safe in the sense that: 603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// - it's safe to copy linked_ptr objects concurrently, 613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// - it's safe to copy *from* a linked_ptr and read its underlying 623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// raw pointer (e.g. via get()) concurrently, and 633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// - it's safe to write to two linked_ptrs that point to the same 643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// shared object concurrently. 653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// TODO(wan@google.com): rename this to safe_linked_ptr to avoid 663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// confusion with normal linked_ptr. 673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ 693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ 703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include <stdlib.h> 723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include <assert.h> 733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include "gtest/internal/gtest-port.h" 753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace testing { 773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace internal { 783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Protects copying of all linked_ptr objects. 803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickGTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex); 813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This is used internally by all instances of linked_ptr<>. It needs to be 833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// a non-template class because different types of linked_ptr<> can refer to 843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)). 853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// So, it needs to be possible for different types of linked_ptr to participate 863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// in the same circular linked list, so we need a single class type here. 873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>. 893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass linked_ptr_internal { 903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public: 913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Create a new circle that includes only this instance. 923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick void join_new() { 933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick next_ = this; 943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Many linked_ptr operations may change p.link_ for some linked_ptr 973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // variable p in the same circle as this object. Therefore we need 983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // to prevent two such operations from occurring concurrently. 993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // 1003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Note that different types of linked_ptr objects can coexist in a 1013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and 1023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // linked_ptr<Derived2>). Therefore we must use a single mutex to 1033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // protect all linked_ptr objects. This can create serious 1043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // contention in production code, but is acceptable in a testing 1053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // framework. 1063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Join an existing circle. 1083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // L < g_linked_ptr_mutex 1093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick void join(linked_ptr_internal const* ptr) { 1103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick MutexLock lock(&g_linked_ptr_mutex); 1113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick linked_ptr_internal const* p = ptr; 1133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick while (p->next_ != ptr) p = p->next_; 1143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick p->next_ = this; 1153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick next_ = ptr; 1163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Leave whatever circle we're part of. Returns true if we were the 1193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // last member of the circle. Once this is done, you can join() another. 1203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // L < g_linked_ptr_mutex 1213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick bool depart() { 1223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick MutexLock lock(&g_linked_ptr_mutex); 1233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick if (next_ == this) return true; 1253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick linked_ptr_internal const* p = next_; 1263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick while (p->next_ != this) p = p->next_; 1273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick p->next_ = next_; 1283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return false; 1293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private: 1323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick mutable linked_ptr_internal const* next_; 1333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}; 1343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T> 1363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass linked_ptr { 1373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public: 1383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick typedef T element_type; 1393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Take over ownership of a raw pointer. This should happen as soon as 1413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // possible after the object is created. 1423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick explicit linked_ptr(T* ptr = NULL) { capture(ptr); } 1433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick ~linked_ptr() { depart(); } 1443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Copy an existing linked_ptr<>, adding ourselves to the list of references. 1463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); } 1473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick linked_ptr(linked_ptr const& ptr) { // NOLINT 1483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick assert(&ptr != this); 1493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick copy(&ptr); 1503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Assignment releases the old value and acquires the new. 1533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) { 1543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick depart(); 1553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick copy(&ptr); 1563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return *this; 1573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick linked_ptr& operator=(linked_ptr const& ptr) { 1603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick if (&ptr != this) { 1613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick depart(); 1623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick copy(&ptr); 1633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return *this; 1653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick // Smart pointer members. 1683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick void reset(T* ptr = NULL) { 1693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick depart(); 1703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick capture(ptr); 1713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick T* get() const { return value_; } 1733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick T* operator->() const { return value_; } 1743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick T& operator*() const { return *value_; } 1753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick bool operator==(T* p) const { return value_ == p; } 1773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick bool operator!=(T* p) const { return value_ != p; } 1783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename U> 1793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick bool operator==(linked_ptr<U> const& ptr) const { 1803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return value_ == ptr.get(); 1813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename U> 1833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick bool operator!=(linked_ptr<U> const& ptr) const { 1843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return value_ != ptr.get(); 1853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick private: 1883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename U> 1893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick friend class linked_ptr; 1903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick T* value_; 1923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick linked_ptr_internal link_; 1933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick void depart() { 1953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick if (link_.depart()) delete value_; 1963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 1973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 1983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick void capture(T* ptr) { 1993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick value_ = ptr; 2003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick link_.join_new(); 2013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 2023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick template <typename U> void copy(linked_ptr<U> const* ptr) { 2043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick value_ = ptr->get(); 2053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick if (value_) 2063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick link_.join(&ptr->link_); 2073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick else 2083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick link_.join_new(); 2093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick } 2103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}; 2113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate<typename T> inline 2133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickbool operator==(T* ptr, const linked_ptr<T>& x) { 2143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return ptr == x.get(); 2153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick} 2163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate<typename T> inline 2183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickbool operator!=(T* ptr, const linked_ptr<T>& x) { 2193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return ptr != x.get(); 2203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick} 2213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A function to convert T* into linked_ptr<T> 2233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation 2243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg)) 2253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T> 2263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicklinked_ptr<T> make_linked_ptr(T* ptr) { 2273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick return linked_ptr<T>(ptr); 2283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick} 2293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick} // namespace internal 2313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick} // namespace testing 2323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick 2333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ 234