29 std::shared_ptr<T> base_;
30 std::shared_ptr<internal::life> ptr_life_;
33 const std::string &type_name()
const {
34 return internal::get_type_name<shared_ptr>();
42 : base_(
nullptr), ptr_life_(
nullptr), life_(this) {}
47 : base_(other.base_), ptr_life_(other.ptr_life_), life_(this) {}
52 if (
this != std::addressof(other)) {
54 ptr_life_ = other.ptr_life_;
62 : base_(std::move(other.base_)), ptr_life_(std::move(other.ptr_life_)),
68 if (
this != std::addressof(other)) {
69 base_ = std::move(other.base_);
70 ptr_life_ = std::move(other.ptr_life_);
91 ptr_life_ = std::make_shared<internal::life>(base_.get());
99 : base_(std::move(
ptr)),
105 template <
typename U>
107 base_ = std::move(
ptr);
108 ptr_life_ = std::make_shared<internal::life>(base_.get());
115 template <
typename U>
117 : base_(other.base_), ptr_life_(other.ptr_life_), life_(this) {}
121 template <
typename U>
124 ptr_life_ = other.ptr_life_;
130 template <
typename U>
132 : base_(std::move(other.base_)), ptr_life_(std::move(other.ptr_life_)),
137 template <
typename U>
139 base_ = std::move(other.base_);
140 ptr_life_ = std::move(other.ptr_life_);
144 template <
typename U>
160 base_.swap(other.base_);
161 ptr_life_.swap(other.ptr_life_);
185 template <
typename E = element_type,
typename =
internal::skip_trace_tag>
188 static std::string func = type_name() +
"::operator*()";
201 template <
typename =
internal::skip_trace_tag>
204 static std::string func = type_name() +
"::operator->()";
223 long use_count() const noexcept {
return base_.use_count(); }
229 explicit operator bool() const noexcept {
return static_cast<bool>(base_); }
234 return base_.owner_before(arg.base_);
240 operator const std::shared_ptr<T> &()
const noexcept {
return base_; }
252 return static_cast<const std::shared_ptr<T> &
>(wrapper);
260template <
typename T,
typename U>
264template <
typename T,
typename U>
268template <
typename T,
typename U>
272template <
typename T,
typename U>
276template <
typename T,
typename U>
280template <
typename T,
typename U>
285template <
class CharT,
class Traits,
typename T>
286std::basic_ostream<CharT, Traits> &
287operator<<(std::basic_ostream<CharT, Traits> &os,
const shared_ptr<T> &p) {
297template <
typename T,
typename... Args>
299 return shared_ptr<T>(std::make_shared<T>(std::forward<Args>(args)...));
オブジェクトのライフタイムを管理するクラス
Definition life.h:207
life_observer observer() const
Definition life.h:233
所有権を共有するスマートポインタ (std::shared_ptr)
Definition shared_ptr.h:28
void reset() noexcept
所有権を放棄
Definition shared_ptr.h:152
shared_ptr(const std::shared_ptr< U > &ptr)
std::shared_ptrからのコピー
Definition shared_ptr.h:82
shared_ptr & operator=(const std::shared_ptr< U > &ptr)
std::shared_ptrからのコピー
Definition shared_ptr.h:89
ptr< element_type > get() const noexcept
ポインタを取得
Definition shared_ptr.h:171
shared_ptr & operator=(std::shared_ptr< U > &&ptr)
std::shared_ptrからの所有権の移動
Definition shared_ptr.h:106
shared_ptr & operator=(shared_ptr &&other)
ムーブ代入: 所有権を移動する
Definition shared_ptr.h:67
long use_count() const noexcept
所有権を共有しているshared_ptrの数を取得
Definition shared_ptr.h:223
shared_ptr(std::shared_ptr< U > &&ptr)
std::shared_ptrからの所有権の移動
Definition shared_ptr.h:98
shared_ptr & operator=(const shared_ptr< U > &other)
別の要素型のshared_ptrとリソースを共有する
Definition shared_ptr.h:122
bool owner_before(const shared_ptr &arg) const
所有権ベースでのポインタ比較
Definition shared_ptr.h:233
shared_ptr(shared_ptr< U > &&other)
別の要素型のshared_ptrから所有権を移動
Definition shared_ptr.h:131
wrap< const shared_ptr * > operator&() const
Definition shared_ptr.h:245
element_type * operator->() const
メンバアクセス
Definition shared_ptr.h:202
T element_type
Definition shared_ptr.h:76
void swap(shared_ptr &other) noexcept
所有権を入れ替える
Definition shared_ptr.h:159
shared_ptr(const shared_ptr< U > &other)
別の要素型のshared_ptrとリソースを共有する
Definition shared_ptr.h:116
shared_ptr(shared_ptr &&other)
ムーブコンストラクタ: 所有権を移動する
Definition shared_ptr.h:61
y3c::wrap_ref< E > operator*() const
要素の間接参照
Definition shared_ptr.h:186
shared_ptr & operator=(shared_ptr< U > &&other)
別の要素型のshared_ptrから所有権を移動
Definition shared_ptr.h:138
shared_ptr(const shared_ptr &other)
コピーコンストラクタ: リソースを共有する
Definition shared_ptr.h:46
shared_ptr & operator=(const shared_ptr &other)
コピー代入: リソースを共有する
Definition shared_ptr.h:51
shared_ptr(std::nullptr_t=nullptr) noexcept
デフォルトコンストラクタ: nullptrを指す
Definition shared_ptr.h:41
ポインタ型wrap: element_type型のデータへのポインタと、 このポインタ自体の生存状態を管理するクラス
Definition wrap.h:318
参照型wrap: element_type型のデータへの参照を持つクラス
Definition wrap.h:168
値型wrap: base_type型のデータと、このデータの生存状態を管理するクラス
Definition wrap.h:26
void terminate_ub_access_nullptr(std::string func, Args &&...args)
Definition terminate.h:133
std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const shared_ptr< T > &p)
Definition shared_ptr.h:287
shared_ptr< T > make_shared(Args &&...args)
shared_ptrを構築する
Definition shared_ptr.h:298
bool operator!=(const array< T, N > &lhs, const array< T, N > &rhs)
Definition array.h:390
bool operator<=(const array< T, N > &lhs, const array< T, N > &rhs)
Definition array.h:398
void swap(array< T, N > &lhs, array< T, N > &rhs)
Definition array.h:381
bool operator==(const array< T, N > &lhs, const array< T, N > &rhs)
Definition array.h:386
std::array< T, N > & unwrap(array< T, N > &wrapper) noexcept
Definition array.h:372
bool operator>(const array< T, N > &lhs, const array< T, N > &rhs)
Definition array.h:402
bool operator<(const array< T, N > &lhs, const array< T, N > &rhs)
Definition array.h:394
wrap< element_type * > ptr
Definition wrap.h:487
bool operator>=(const array< T, N > &lhs, const array< T, N > &rhs)
Definition array.h:406
#define y3c_assert_internal(cond)
Definition terminate.h:148