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_
11 // Used to allocate an instance of T that can be shared via reference counting.
19 SharedData() : holder_(new Holder()) {
22 explicit SharedData(const T& value) : holder_(new Holder(value)) {
25 SharedData(const SharedData<T>& other) : holder_(other.holder_) {
29 SharedData<T>& operator=(const SharedData<T>& other) {
30 if (other.holder_ == holder_)
33 holder_ = other.holder_;
40 holder_ = new Holder();
43 void reset(const T& value) {
45 holder_ = new Holder(value);
48 void set_value(const T& value) {
49 holder_->value = value;
52 return &holder_->value;
54 const T& value() const {
55 return holder_->value;
61 Holder() : value(), ref_count_(1) {
63 Holder(const T& value) : value(value), ref_count_(1) {
66 void Retain() { ++ref_count_; }
67 void Release() { if (--ref_count_ == 0) delete this; }
73 MOJO_DISALLOW_COPY_AND_ASSIGN(Holder);
79 } // namespace internal
82 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_SHARED_DATA_H_