16 #ifndef INCLUDE_NN_NLIB_THREADING_LIMITEDSHAREDPTR_H_ 17 #define INCLUDE_NN_NLIB_THREADING_LIMITEDSHAREDPTR_H_ 22 #include "nn/nlib/Swap.h" 34 NLIB_DEFMOVE_PIMPL(LspStatus);
37 prv_ =
new (std::nothrow) int32_t(2);
38 if (!prv_)
return ENOMEM;
42 NLIB_ASSERT(!ptr->prv_);
47 if (!prv_)
return false;
57 if (!prv_)
return true;
71 template<
class T,
class DEL = DefaultDelete<T> >
72 class LimitedSharedPtr {
76 explicit LimitedSharedPtr(nullptr_t)
NLIB_NOEXCEPT : ptr_(
nullptr) {}
80 #ifdef __cpp_rvalue_references 81 LimitedSharedPtr(LimitedSharedPtr&& rhs)
NLIB_NOEXCEPT : ptr_(rhs.ptr_),
82 status_(std::move(rhs.status_)) {
85 LimitedSharedPtr& operator=(LimitedSharedPtr&& rhs)
NLIB_NOEXCEPT {
86 if (!status_.ToUnshare()) DEL()(ptr_);
89 status_ = std::move(rhs.status_);
93 LimitedSharedPtr(LimitedSharedPtr& rhs, move_tag)
NLIB_NOEXCEPT 95 status_(rhs.status_, move_tag()) {
98 LimitedSharedPtr& assign(LimitedSharedPtr& rhs, move_tag)
NLIB_NOEXCEPT {
99 if (!status_.ToUnshare()) DEL()(ptr_);
102 status_.assign(rhs.status_, move_tag());
106 if (!status_.ToUnshare()) DEL()(ptr_);
110 NLIB_ASSERT(ptr_ !=
nullptr);
114 NLIB_ASSERT(ptr_ !=
nullptr);
119 bool IsUnique() const
NLIB_NOEXCEPT {
return status_.IsUnique(); }
129 if (!status_.ToUnshare()) DEL()(ptr_);
135 mutable internal::LspStatus status_;
139 template<
class T,
class DEL>
141 LimitedSharedPtr tmp;
143 errno_t e = p.status_.ToShare(&tmp.status_);
144 if (e != 0)
return e;
147 this->assign(tmp, move_tag());
151 template<
class T,
class DEL>
152 bool LimitedSharedPtr<T, DEL>::MakeUniquePtr(UniquePtr<T>& p)
NLIB_NOEXCEPT {
163 template<
class T,
class DEL>
164 class LimitedSharedPtr<T[], DEL> {
172 NLIB_DEFINE_STD_SWAP_T_BEGIN3(
nn, nlib, threading)
173 NLIB_DEFINE_STD_SWAP_T2(T, DEL, NLIB_NS::threading::LimitedSharedPtr)
174 NLIB_DEFINE_STD_SWAP_T_END3(
nn, nlib, threading)
176 #endif // INCLUDE_NN_NLIB_THREADING_LIMITEDSHAREDPTR_H_
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
std::unique_ptrに相当するクラスが定義されています。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
TimeSpan operator*(int i, const TimeSpan &rhs) noexcept
rhs を i 倍します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。