TNB Library
TnbPointerHandle.h
[詳解]
1#pragma once
15#include "TnbDef.h"
16#pragma warning( disable : 4284 )
17
18
19
20//TNB Library
21namespace TNB
22{
23
24
25
39template<typename TYP, typename DELE, INT_PTR NUL = 0>
41{
43 struct THead
44 {
45 LONG refs;
46 TYP type;
52 THead(TYP t = reinterpret_cast<TYP>(NUL), LONG l = 1) : refs(l) , type(t)
53 {
54 }
55 };
56
57 THead* m_ptHead;
58
60 void m_SetHeadNull(void)
61 {
62 m_ptHead = reinterpret_cast<THead*>(g_plNullBase);
63 }
64
66 bool m_IsHeadNull(void)
67 {
68 return m_ptHead == reinterpret_cast<THead*>(g_plNullBase);
69 }
70
71 void m_Null(void)
72 {
73 if ( ! m_IsHeadNull() )
74 {
75 if ( ::InterlockedDecrement(&(m_ptHead->refs)) <= 0 )
76 {
77 if ( m_ptHead->type != reinterpret_cast<TYP>(NUL) )
78 {
79 DELE()(m_ptHead->type);
80 }
81 delete m_ptHead;
82 }
83 m_SetHeadNull();
84 }
85 }
86
87public:
88
94 {
95 m_SetHeadNull();
96 if ( NUL != 0 ) { m_ptHead = new THead; }
97 }
98
106 {
107 m_SetHeadNull();
108 operator=(t);
109 }
110
118 {
119 m_SetHeadNull();
120 operator=(other);
121 }
122
129 {
130 m_Null();
131 }
132
141 {
142 if ( m_ptHead->type != t )
143 {
144 if ( t != reinterpret_cast<TYP>(NUL) )
145 {
146 m_Null();
147 m_ptHead = new THead(t);
148 }
149 else
150 {
151 Null();
152 }
153 }
154 return *this;
155 }
156
166 {
167 if ( m_ptHead != other.m_ptHead )
168 {
169 if ( other.IsNull() )
170 {
171 //t は空。
172 Null();
173 }
174 else if ( InterlockedCompareExchange(&(other.m_ptHead->refs), 2, 1) == 1 )
175 {
176 //前が1だったら2にして、新しくバッファアドレスを共有
177 m_Null();
178 m_ptHead = other.m_ptHead;
179 }
180 else if ( (other.m_ptHead->refs) >= 1 )
181 {
182 //前が1以上だったら+1して、新しくバッファアドレスを共有
183 m_Null();
184 other.m_ptHead->refs++; // 参照数をプライス1
185 m_ptHead = other.m_ptHead;
186 }
187 }
188 ASEERT_NULLBASE;
189 return *this;
190 }
191
197 bool IsNull(void) const
198 {
199 return m_ptHead->type == reinterpret_cast<TYP>(NUL);
200 }
201
209 int SetReferCount(int iCount)
210 {
211 if ( m_IsHeadNull() ){ return 0; }
212 return ::InterlockedExchange(&(m_ptHead->refs), iCount);
213 }
214
221 int GetReferCount(void) const { return m_ptHead->refs; }
222
229 void Null(void)
230 {
231 m_Null();
232 if ( NUL != 0 )
233 {
234 m_ptHead = new THead;
235 }
236 }
237
242 TYP* ReferP(void) { return &(m_ptHead->type); }
243
248 TYP const* ReferP(void) const { return &(m_ptHead->type); }
249
255 operator TYP(void) { return m_ptHead->type; }
256
262 operator const TYP(void) const { return m_ptHead->type; }
263
269 TYP operator->(void) { return m_ptHead->type; }
270
276 const TYP operator->(void) const { return m_ptHead->type; }
277
285 bool operator==(TYP t) const { return m_ptHead->type == t; }
286
294 bool operator!=(TYP t) const { return ! operator==(t); }
295
296private:
297 friend class CPointerHandleTest;
298};
299
300
301
302#ifndef _TnbDOXYGEN //Document作成用シンボル
303
305struct TPhDeleteSinglePtr
306{
307 template<typename TYP> void operator()(TYP* P) { delete P; }
308};
310struct TPhDeleteArrayPtr
311{
312 template<typename TYP> void operator()(TYP* P) { delete[] P; }
313};
314
315#endif // _TnbDOXYGEN
316
317
318
346template<typename TYP>
347class CPointerHandleT : public CPointerHandleBaseT<TYP*, TPhDeleteSinglePtr>
348{
350 DEFSUPER(_super);
351public:
352
358 {
359 }
360
368 {
369 }
370
378 {
379 }
380
387 TYP& operator*(void) { return **_super::ReferP(); }
388
395 const TYP& operator*(void) const { return **_super::ReferP(); }
396};
397
398
399
435template<typename TYP>
436class CArrayPtrHandleT : public CPointerHandleBaseT<TYP*, TPhDeleteArrayPtr>
437{
439 DEFSUPER(_super);
440public:
441
447 {
448 }
449
457 {
458 }
459
467 {
468 }
469
477 TYP& operator[](int ind) { return (*_super::ReferP())[ind]; }
478
486 const TYP& operator[](int ind) const { return (*_super::ReferP())[ind]; }
487};
488
489
490
491};//TNB
TNBライブラリの定義ヘッダ
ポインタ型ハンドルテンプレート
const TYP & operator[](int ind) const
[取得] TYPポインタ取得.
CArrayPtrHandleT(TYP *P)
代入コンストラクタ.
TYP & operator[](int ind)
[取得] TYPポインタ取得.
CArrayPtrHandleT(void)
コンストラクタ.
CArrayPtrHandleT(const CArrayPtrHandleT &t)
コピーコンストラクタ.
ポインタハンドルテンプレートベースクラス
TYP operator->(void)
[取得] TYP取得.
CPointerHandleBaseT & operator=(const CPointerHandleBaseT &other)
[代入] コピーオペレータ.
friend class CPointerHandleTest
フレンドクラス宣言
const TYP operator->(void) const
[取得] TYP取得.
int SetReferCount(int iCount)
[設定] 参照数設定
CPointerHandleBaseT(TYP t)
代入コンストラクタ.
int GetReferCount(void) const
[取得] 参照数取得.
bool operator!=(TYP t) const
[比較] TYP比較.
TYP * ReferP(void)
[取得] TYPのポインタ取得.
CPointerHandleBaseT & operator=(TYP t)
[代入] 代入.
bool IsNull(void) const
[確認] NULLチェック
void Null(void)
[設定] 開放.
~CPointerHandleBaseT(void)
デストラクタ.
CPointerHandleBaseT(const CPointerHandleBaseT &other)
コピーコンストラクタ.
CPointerHandleBaseT(void)
コンストラクタ.
TYP const * ReferP(void) const
[取得] TYPのポインタ取得.
bool operator==(TYP t) const
[比較] TYP比較.
ポインタ型ハンドルテンプレート
CPointerHandleT(void)
コンストラクタ.
CPointerHandleT(TYP *P)
代入コンストラクタ.
const TYP & operator*(void) const
[取得] TYPポインタ取得.
CPointerHandleT(const CPointerHandleT &t)
コピーコンストラクタ.
TYP & operator*(void)
[取得] TYPポインタ取得.
TNB Library
Definition: TnbDoxyTitle.txt:2