• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_SHARED_PTR_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_SHARED_PTR_H_
7 
8 #include "mojo/public/cpp/bindings/lib/shared_data.h"
9 
10 namespace mojo {
11 namespace internal {
12 
13 // Used to manage a heap-allocated instance of P that can be shared via
14 // reference counting. When the last reference is dropped, the instance is
15 // deleted.
16 template <typename P>
17 class SharedPtr {
18  public:
SharedPtr()19   SharedPtr() {}
20 
SharedPtr(P * ptr)21   explicit SharedPtr(P* ptr) {
22     impl_.mutable_value()->ptr = ptr;
23   }
24 
25   // Default copy-constructor and assignment operator are OK.
26 
get()27   P* get() {
28     return impl_.value().ptr;
29   }
get()30   const P* get() const {
31     return impl_.value().ptr;
32   }
33 
34   P* operator->() { return get(); }
35   const P* operator->() const { return get(); }
36 
37  private:
38   class Impl {
39    public:
~Impl()40     ~Impl() {
41       if (ptr)
42         delete ptr;
43     }
44 
Impl()45     Impl() : ptr(NULL) {
46     }
47 
Impl(P * ptr)48     Impl(P* ptr) : ptr(ptr) {
49     }
50 
51     P* ptr;
52 
53    private:
54     MOJO_DISALLOW_COPY_AND_ASSIGN(Impl);
55   };
56 
57   SharedData<Impl> impl_;
58 };
59 
60 }  // namespace mojo
61 }  // namespace internal
62 
63 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SHARED_PTR_H_
64