16 #ifndef INCLUDE_NN_NLIB_THREADING_LIMITEDSHAREDPTR_H_ 17 #define INCLUDE_NN_NLIB_THREADING_LIMITEDSHAREDPTR_H_ 21 #include "nn/nlib/Swap.h" 33 NLIB_MOVE_MEMBER_HELPER_1(LspStatus, value_)
36 value_ =
new (std::nothrow) int32_t(2);
37 if (!value_)
return ENOMEM;
41 NLIB_ASSERT(!ptr->value_);
46 if (!value_)
return false;
56 if (!value_)
return true;
61 swap(value_, rhs.value_);
73 template <
class T,
class DEL = DefaultDelete<T> >
74 class LimitedSharedPtr {
78 explicit LimitedSharedPtr(nullptr_t)
NLIB_NOEXCEPT : ptr_(NULL) {}
82 NLIB_MOVE_MEMBER_HELPER_2(LimitedSharedPtr, ptr_, status_)
83 void reset(T* p = 0)
NLIB_NOEXCEPT { LimitedSharedPtr<T>(p).swap(*
this); }
85 NLIB_ASSERT(ptr_ != NULL);
89 NLIB_ASSERT(ptr_ != NULL);
94 bool IsUnique() const NLIB_NOEXCEPT {
return status_.IsUnique(); }
96 void swap(LimitedSharedPtr& rhs) NLIB_NOEXCEPT {
99 status_.swap(rhs.status_);
101 LimitedSharedPtr& operator=(nullptr_t) NLIB_NOEXCEPT {
108 void release() NLIB_NOEXCEPT {
109 if (!status_.ToUnshare()) DEL()(ptr_);
115 mutable internal::LspStatus status_;
119 template <
class T,
class DEL>
120 errno_t LimitedSharedPtr<T, DEL>::MakeSharedFrom(
const LimitedSharedPtr& p)
122 LimitedSharedPtr tmp;
124 errno_t e = p.status_.ToShare(&tmp.status_);
125 if (e != 0)
return e;
132 template <
class T,
class DEL>
133 bool LimitedSharedPtr<T, DEL>::MakeUniquePtr(UniquePtr<T>& p) NLIB_NOEXCEPT {
144 template <
class T,
class DEL>
145 class LimitedSharedPtr<T[], DEL> {
153 #ifndef NLIB_STD_SWAP_WORKAROUND 157 NLIB_DEFINE_STD_SWAP_T_BEGIN1(threading)
158 NLIB_DEFINE_STD_SWAP_T2(T, DEL, NLIB_NS::threading::LimitedSharedPtr)
159 NLIB_DEFINE_STD_SWAP_T_END1(threading)
161 #ifndef NLIB_STD_SWAP_WORKAROUND 165 #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 倍します。