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
10namespace mojo {
11namespace 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.
16template <typename P>
17class 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_CPP_BINDINGS_LIB_SHARED_PTR_H_
64