3 #ifndef INCLUDE_NN_NLIB_THREADING_LIMITEDSHAREDPTR_H_
4 #define INCLUDE_NN_NLIB_THREADING_LIMITEDSHAREDPTR_H_
8 #include "nn/nlib/Swap.h"
20 NLIB_MOVE_MEMBER_HELPER_1(LspStatus, m_V)
23 m_V =
new (std::nothrow) int32_t(2);
24 if (!m_V)
return ENOMEM;
28 NLIB_ASSERT(!ptr->m_V);
32 bool ToUnshare() NLIB_NOEXCEPT {
33 if (!m_V)
return false;
42 bool IsUnique() NLIB_NOEXCEPT {
43 if (!m_V)
return true;
46 void swap(LspStatus& rhs) NLIB_NOEXCEPT {
60 template <
class T,
class DEL = DefaultDelete<T> >
61 class LimitedSharedPtr {
63 LimitedSharedPtr() NLIB_NOEXCEPT : m_Ptr(NULL) {}
64 ~LimitedSharedPtr() NLIB_NOEXCEPT { release(); }
65 explicit LimitedSharedPtr(nullptr_t) NLIB_NOEXCEPT : m_Ptr(NULL) {}
66 explicit LimitedSharedPtr(T* p) NLIB_NOEXCEPT : m_Ptr(p) {
69 NLIB_MOVE_MEMBER_HELPER_2(LimitedSharedPtr, m_Ptr, m_Status)
70 void reset(T* p = 0) NLIB_NOEXCEPT { LimitedSharedPtr<T>(p).swap(*
this); }
72 NLIB_ASSERT(m_Ptr != NULL);
75 T* operator->() const NLIB_NOEXCEPT {
76 NLIB_ASSERT(m_Ptr != NULL);
79 T*
get()
const NLIB_NOEXCEPT {
return m_Ptr; }
81 bool IsUnique() const NLIB_NOEXCEPT {
return m_Status.IsUnique(); }
83 void swap(LimitedSharedPtr& rhs) NLIB_NOEXCEPT {
85 swap(m_Ptr, rhs.m_Ptr);
86 m_Status.swap(rhs.m_Status);
88 LimitedSharedPtr& operator=(nullptr_t) NLIB_NOEXCEPT {
95 void release() NLIB_NOEXCEPT {
96 if (!m_Status.ToUnshare()) DEL()(m_Ptr);
102 mutable internal::LspStatus m_Status;
106 template <
class T,
class DEL>
107 errno_t LimitedSharedPtr<T, DEL>::MakeSharedFrom(
const LimitedSharedPtr& p)
109 LimitedSharedPtr tmp;
111 errno_t e = p.m_Status.ToShare(&tmp.m_Status);
112 if (e != 0)
return e;
119 template <
class T,
class DEL>
120 bool LimitedSharedPtr<T, DEL>::MakeUniquePtr(UniquePtr<T>& p) NLIB_NOEXCEPT {
131 template <
class T,
class DEL>
132 class LimitedSharedPtr<T[], DEL> {
172 #ifndef NLIB_STD_SWAP_WORKAROUND
176 NLIB_DEFINE_STD_SWAP_T_BEGIN1(threading)
177 NLIB_DEFINE_STD_SWAP_T2(T, DEL, NLIB_NS::threading::LimitedSharedPtr)
178 NLIB_DEFINE_STD_SWAP_T_END1(threading)
180 #ifndef NLIB_STD_SWAP_WORKAROUND
184 #endif // INCLUDE_NN_NLIB_THREADING_LIMITEDSHAREDPTR_H_
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
#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_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
TimeSpan operator*(int i, const TimeSpan &rhs) noexcept
rhs を i 倍します。