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.
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_SHARED_DATA_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_SHARED_DATA_H_
8 #include "mojo/public/cpp/system/macros.h"
13 // Used to allocate an instance of T that can be shared via reference counting.
21 SharedData() : holder_(new Holder()) {
24 explicit SharedData(const T
& value
) : holder_(new Holder(value
)) {
27 SharedData(const SharedData
<T
>& other
) : holder_(other
.holder_
) {
31 SharedData
<T
>& operator=(const SharedData
<T
>& other
) {
32 if (other
.holder_
== holder_
)
35 holder_
= other
.holder_
;
42 holder_
= new Holder();
45 void reset(const T
& value
) {
47 holder_
= new Holder(value
);
50 void set_value(const T
& value
) {
51 holder_
->value
= value
;
54 return &holder_
->value
;
56 const T
& value() const {
57 return holder_
->value
;
63 Holder() : value(), ref_count_(1) {
65 Holder(const T
& value
) : value(value
), ref_count_(1) {
68 void Retain() { ++ref_count_
; }
69 void Release() { if (--ref_count_
== 0) delete this; }
75 MOJO_DISALLOW_COPY_AND_ASSIGN(Holder
);
81 } // namespace internal
84 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_SHARED_DATA_H_