Upstream version 7.35.144.0
[platform/framework/web/crosswalk.git] / src / mojo / public / bindings / lib / shared_ptr.h
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_BINDINGS_LIB_SHARED_PTR_H_
6 #define MOJO_PUBLIC_BINDINGS_LIB_SHARED_PTR_H_
7
8 #include "mojo/public/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:
19   SharedPtr() {}
20
21   explicit SharedPtr(P* ptr) {
22     impl_.mutable_value()->ptr = ptr;
23   }
24
25   // Default copy-constructor and assignment operator are OK.
26
27   P* get() {
28     return impl_.value().ptr;
29   }
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:
40     ~Impl() {
41       if (ptr)
42         delete ptr;
43     }
44
45     Impl() : ptr(NULL) {
46     }
47
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_BINDINGS_LIB_SHARED_PTR_H_