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