| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_SHARED_PTR_H_ | 
 | #define MOJO_PUBLIC_CPP_BINDINGS_LIB_SHARED_PTR_H_ | 
 |  | 
 | #include "mojo/public/cpp/bindings/lib/shared_data.h" | 
 |  | 
 | namespace mojo { | 
 | namespace internal { | 
 |  | 
 | // Used to manage a heap-allocated instance of P that can be shared via | 
 | // reference counting. When the last reference is dropped, the instance is | 
 | // deleted. | 
 | template <typename P> | 
 | class SharedPtr { | 
 |  public: | 
 |   SharedPtr() {} | 
 |  | 
 |   explicit SharedPtr(P* ptr) { impl_.mutable_value()->ptr = ptr; } | 
 |  | 
 |   // Default copy-constructor and assignment operator are OK. | 
 |  | 
 |   P* get() { return impl_.value().ptr; } | 
 |   const P* get() const { return impl_.value().ptr; } | 
 |  | 
 |   void reset() { impl_.reset(); } | 
 |  | 
 |   P* operator->() { return get(); } | 
 |   const P* operator->() const { return get(); } | 
 |  | 
 |  private: | 
 |   class Impl { | 
 |    public: | 
 |     ~Impl() { | 
 |       if (ptr) | 
 |         delete ptr; | 
 |     } | 
 |  | 
 |     Impl() : ptr(nullptr) {} | 
 |  | 
 |     Impl(P* ptr) : ptr(ptr) {} | 
 |  | 
 |     P* ptr; | 
 |  | 
 |    private: | 
 |     MOJO_DISALLOW_COPY_AND_ASSIGN(Impl); | 
 |   }; | 
 |  | 
 |   SharedData<Impl> impl_; | 
 | }; | 
 |  | 
 | }  // namespace mojo | 
 | }  // namespace internal | 
 |  | 
 | #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SHARED_PTR_H_ |