OSDN Git Service

sublexer.cpp -- sublexer.hをインターフェースのみとし、実装をsublexer_impl.cpp/hに
[simplecms/utakata.git] / ref_delete.h
1 #ifndef ___HGL___REF_DELETE___
2 #define ___HGL___REF_DELETE___
3
4 /**
5  ref_delete
6  参照カウントを保持して、
7  0になったときに、保持してあるオブジェクトを破棄するための
8  クラス。
9  smart_ptr中で、配列と非配列オブジェクトとを区別するために
10  使用される。
11 */
12 class ref_delete_base {
13 public:
14
15     virtual ~ref_delete_base() {}
16
17     /**
18      dec_ref
19      参照カウントのデクリメント。
20      これを実行したとき、参照カウントが0になったら、do_deleteを
21      実行する。
22      @access public
23      @return bool true:削除済み false:未削除
24     */
25     bool dec_ref() {
26         if (--m_nRef <= 0) {
27             if (m_bOwner) {
28                 do_delete();
29             }
30             return true;
31         }
32         return false;
33     }
34
35     /**
36      inc_ref
37      参照カウントのインクリメント
38      @access public
39      @return void
40     */
41     void inc_ref() {
42         m_nRef++;
43     }
44
45     /**
46      getRef
47      参照カウントの取得
48      @access public
49      @return int 参照カウント
50     */
51     int getRef() const {return m_nRef;}
52     
53     /**
54      setRef
55      参照カウントの設定
56      @param int i 参照カウント
57      @access public
58      @return void
59     */
60     void setRef(int i) {m_nRef = i;}
61
62     /**
63      setOwner
64      所有権の設定
65      @param bool b 所有権の有無
66      @access public
67      @return void
68     */
69     void setOwner(bool b) {m_bOwner = b;}
70     
71     /**
72      getOwner
73      所有権の取得
74      @access public
75      @return bool
76     */
77     bool getOwner() {return m_bOwner;}
78
79     /**
80      getObjSize
81      オブジェクトサイズの取得
82      @access public
83      @return int オブジェクトサイズ
84     */
85     int getObjSize() const {return m_nObjSize;}
86     
87     /**
88      setObjSize
89      オブジェクトサイズの設定
90      @param int i オブジェクトサイズ
91      @access public
92      @return void
93     */
94     void setObjSize(int i) {m_nObjSize = i;}
95
96     /**
97      getMaxNum
98      最大インデックスの取得
99      @access public
100      @return int 最大インデックス
101     */
102     int getMaxNum() const {return m_nMaxNum;}
103     
104     /**
105      setMaxNum
106      最大インデックスの設定
107      @param int i 最大インデックス
108      @access public
109      @return void
110     */
111     void setMaxNum(int i) {m_nMaxNum = i;}
112
113     /**
114      do_delete
115      参照カウントがゼロになった際に実行される。
116      主に、deleteとdelete[]の違いを埋めるために使う
117      @access protected
118      @return void
119     */
120     virtual void do_delete() = 0;
121
122 protected:
123
124     int m_nRef;         //参照カウント
125     bool m_bOwner;      //所有権
126     int m_nMaxNum;      //最大インデックス
127     int m_nObjSize;     //オブジェクトのサイズ
128
129 };
130
131 /**
132  ref_noarray_object
133  非配列オブジェクトに対する、
134  参照カウントを保持した削除クラス
135 */
136 template<class T>
137 class ref_noarray_object : public ref_delete_base {
138 public:
139
140     ref_noarray_object(T* p) : m_pObj(p) {}
141     
142     virtual void do_delete() {
143         if (m_pObj != NULL) {
144             delete m_pObj;
145         }
146     }
147
148 protected:
149
150     T* m_pObj;
151
152 };
153
154 /**
155  ref_array_object
156  配列オブジェクトに対する、
157  参照カウントを保持した削除クラス
158 */
159 template<class T>
160 class ref_array_object : public ref_delete_base {
161 public:
162
163     ref_array_object(T* p) : m_pObj(p) {}
164     
165     virtual void do_delete() {
166
167         if (m_pObj != NULL) {
168             delete [] m_pObj;
169         }
170     }
171
172 protected:
173
174     T* m_pObj;
175
176 };
177
178 /**
179  ref_null_object
180  所有権を持たないオブジェクトに対する、
181  参照カウントを保持した削除クラス
182 */
183 template<class T>
184 class ref_null_object : public ref_delete_base{
185 public:
186
187     ref_null_object(T* p) : m_pObj(p) {}
188     
189     virtual void do_delete() {
190     }
191
192 protected:
193
194     T* m_pObj;
195
196 };
197
198 #endif