smartptr_8h-source.html
来自「Crypto++是一个非常强大的密码学库,主要是功能全」· HTML 代码 · 共 229 行
HTML
229 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: smartptr.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Compound List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Compound Members</a> | <a class="qindex" href="globals.html">File Members</a></div><h1>smartptr.h</h1><div class="fragment"><pre>00001 <span class="preprocessor">#ifndef CRYPTOPP_SMARTPTR_H</span>00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_SMARTPTR_H</span>00003 <span class="preprocessor"></span>00004 <span class="preprocessor">#include "config.h"</span>00005 <span class="preprocessor">#include <algorithm></span>00006 00007 NAMESPACE_BEGIN(CryptoPP)00008 00009 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">class </span>member_ptr00010 {00011 <span class="keyword">public</span>:00012 <span class="keyword">explicit</span> member_ptr(T *p = NULL) : m_p(p) {}00013 00014 ~member_ptr();00015 00016 <span class="keyword">const</span> T& operator*()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *m_p; }00017 T& operator*() { <span class="keywordflow">return</span> *m_p; }00018 00019 <span class="keyword">const</span> T* operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_p; }00020 T* operator->() { <span class="keywordflow">return</span> m_p; }00021 00022 <span class="keyword">const</span> T* get()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_p; }00023 T* get() { <span class="keywordflow">return</span> m_p; }00024 00025 T* release()00026 {00027 T *old_p = m_p;00028 m_p = 0;00029 <span class="keywordflow">return</span> old_p;00030 } 00031 00032 <span class="keywordtype">void</span> reset(T *p = 0);00033 00034 <span class="keyword">protected</span>:00035 member_ptr(<span class="keyword">const</span> member_ptr<T>& rhs); <span class="comment">// copy not allowed</span>00036 <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> member_ptr<T>& rhs); <span class="comment">// assignment not allowed</span>00037 00038 T *m_p;00039 };00040 00041 <span class="keyword">template</span> <<span class="keyword">class</span> T> member_ptr<T>::~member_ptr() {<span class="keyword">delete</span> m_p;}00042 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keywordtype">void</span> member_ptr<T>::reset(T *p) {<span class="keyword">delete</span> m_p; m_p = p;}00043 00044 <span class="comment">// ********************************************************</span>00045 00046 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">class </span>value_ptr : <span class="keyword">public</span> member_ptr<T>00047 {00048 <span class="keyword">public</span>:00049 value_ptr(<span class="keyword">const</span> T &obj) : member_ptr<T>(new T(obj)) {}00050 value_ptr(T *p = NULL) : member_ptr<T>(p) {}00051 value_ptr(<span class="keyword">const</span> value_ptr<T>& rhs)00052 : member_ptr<T>(rhs.m_p ? new T(*rhs.m_p) : NULL) {}00053 00054 value_ptr<T>& operator=(<span class="keyword">const</span> value_ptr<T>& rhs);00055 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> value_ptr<T>& rhs)00056 {00057 <span class="keywordflow">return</span> (!m_p && !rhs.m_p) || (m_p && rhs.m_p && *m_p == *rhs.m_p);00058 }00059 };00060 00061 <span class="keyword">template</span> <<span class="keyword">class</span> T> value_ptr<T>& value_ptr<T>::operator=(<span class="keyword">const</span> value_ptr<T>& rhs)00062 {00063 T *old_p = m_p;00064 m_p = rhs.m_p ? <span class="keyword">new</span> T(*rhs.m_p) : NULL;00065 <span class="keyword">delete</span> old_p;00066 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00067 }00068 00069 <span class="comment">// ********************************************************</span>00070 00071 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">class </span>clonable_ptr : <span class="keyword">public</span> member_ptr<T>00072 {00073 <span class="keyword">public</span>:00074 clonable_ptr(<span class="keyword">const</span> T &obj) : member_ptr<T>(obj.Clone()) {}00075 clonable_ptr(T *p = NULL) : member_ptr<T>(p) {}00076 clonable_ptr(<span class="keyword">const</span> clonable_ptr<T>& rhs)00077 : member_ptr<T>(rhs.m_p ? rhs.m_p->Clone() : NULL) {}00078 00079 clonable_ptr<T>& operator=(<span class="keyword">const</span> clonable_ptr<T>& rhs);00080 };00081 00082 <span class="keyword">template</span> <<span class="keyword">class</span> T> clonable_ptr<T>& clonable_ptr<T>::operator=(<span class="keyword">const</span> clonable_ptr<T>& rhs)00083 {00084 T *old_p = m_p;00085 m_p = rhs.m_p ? rhs.m_p->Clone() : NULL;00086 <span class="keyword">delete</span> old_p;00087 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00088 }00089 00090 <span class="comment">// ********************************************************</span>00091 00092 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">class </span>counted_ptr00093 {00094 <span class="keyword">public</span>:00095 <span class="keyword">explicit</span> counted_ptr(T *p = 0);00096 counted_ptr(<span class="keyword">const</span> T &r) : m_p(0) {attach(r);}00097 counted_ptr(<span class="keyword">const</span> counted_ptr<T>& rhs);00098 00099 ~counted_ptr();00100 00101 <span class="keyword">const</span> T& operator*()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *m_p; }00102 T& operator*() { <span class="keywordflow">return</span> *m_p; }00103 00104 <span class="keyword">const</span> T* operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_p; }00105 T* operator->() { <span class="keywordflow">return</span> get(); }00106 00107 <span class="keyword">const</span> T* get()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_p; }00108 T* get();00109 00110 <span class="keywordtype">void</span> attach(<span class="keyword">const</span> T &p);00111 00112 counted_ptr<T> & operator=(<span class="keyword">const</span> counted_ptr<T>& rhs);00113 00114 <span class="keyword">private</span>:00115 T *m_p;00116 };00117 00118 <span class="keyword">template</span> <<span class="keyword">class</span> T> counted_ptr<T>::counted_ptr(T *p)00119 : m_p(p) 00120 {00121 <span class="keywordflow">if</span> (m_p)00122 m_p->m_referenceCount = 1;00123 }00124 00125 <span class="keyword">template</span> <<span class="keyword">class</span> T> counted_ptr<T>::counted_ptr(<span class="keyword">const</span> counted_ptr<T>& rhs)00126 : m_p(rhs.m_p)00127 {00128 <span class="keywordflow">if</span> (m_p)00129 m_p->m_referenceCount++;00130 }00131 00132 <span class="keyword">template</span> <<span class="keyword">class</span> T> counted_ptr<T>::~counted_ptr()00133 {00134 <span class="keywordflow">if</span> (m_p && --m_p->m_referenceCount == 0)00135 <span class="keyword">delete</span> m_p;00136 }00137 00138 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keywordtype">void</span> counted_ptr<T>::attach(<span class="keyword">const</span> T &r)00139 {00140 <span class="keywordflow">if</span> (m_p && --m_p->m_referenceCount == 0)00141 <span class="keyword">delete</span> m_p;00142 <span class="keywordflow">if</span> (r.m_referenceCount == 0)00143 {00144 m_p = r.clone();00145 m_p->m_referenceCount = 1;00146 }00147 <span class="keywordflow">else</span>00148 {00149 m_p = const_cast<T *>(&r);00150 m_p->m_referenceCount++;00151 }00152 }00153 00154 <span class="keyword">template</span> <<span class="keyword">class</span> T> T* counted_ptr<T>::get()00155 {00156 <span class="keywordflow">if</span> (m_p && m_p->m_referenceCount > 1)00157 {00158 T *temp = m_p->clone();00159 m_p->m_referenceCount--;00160 m_p = temp;00161 m_p->m_referenceCount = 1;00162 }00163 <span class="keywordflow">return</span> m_p;00164 }00165 00166 <span class="keyword">template</span> <<span class="keyword">class</span> T> counted_ptr<T> & counted_ptr<T>::operator=(<span class="keyword">const</span> counted_ptr<T>& rhs)00167 {00168 <span class="keywordflow">if</span> (m_p != rhs.m_p)00169 {00170 <span class="keywordflow">if</span> (m_p && --m_p->m_referenceCount == 0)00171 <span class="keyword">delete</span> m_p;00172 m_p = rhs.m_p;00173 <span class="keywordflow">if</span> (m_p)00174 m_p->m_referenceCount++;00175 }00176 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00177 }00178 00179 <span class="comment">// ********************************************************</span>00180 00181 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">class </span>vector_member_ptrs00182 {00183 <span class="keyword">public</span>:00184 vector_member_ptrs(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size=0)00185 : _size(size) {ptr = <span class="keyword">new</span> member_ptr<T>[_size];}00186 ~vector_member_ptrs()00187 {<span class="keyword">delete</span> [] ptr;}00188 00189 member_ptr<T>& operator[](<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index)00190 {assert(index<_size); <span class="keywordflow">return</span> ptr[index];}00191 <span class="keyword">const</span> member_ptr<T>& operator[](<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index)<span class="keyword"> const</span>00192 <span class="keyword"> </span>{assert(index<_size); <span class="keywordflow">return</span> ptr[index];}00193 00194 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> _size;}00195 <span class="keywordtype">void</span> resize(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> newSize)00196 {00197 member_ptr<T> *newPtr = <span class="keyword">new</span> member_ptr<T>[newSize];00198 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<STDMIN(_size, newSize); i++)00199 newPtr[i].reset(ptr[i].release());00200 <span class="keyword">delete</span> [] ptr;00201 _size = newSize;00202 ptr = newPtr;00203 }00204 00205 <span class="keyword">private</span>:00206 vector_member_ptrs(<span class="keyword">const</span> vector_member_ptrs<T> &c); <span class="comment">// copy not allowed</span>00207 <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> vector_member_ptrs<T> &x); <span class="comment">// assignment not allowed</span>00208 00209 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> _size;00210 member_ptr<T> *ptr;00211 };00212 00213 NAMESPACE_END00214 00215 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:26 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?