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&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Compound&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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 &lt;algorithm&gt;</span>00006 00007 NAMESPACE_BEGIN(CryptoPP)00008 00009 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <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&amp; operator*()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *m_p; }00017         T&amp; operator*() { <span class="keywordflow">return</span> *m_p; }00018 00019         <span class="keyword">const</span> T* operator-&gt;()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_p; }00020         T* operator-&gt;() { <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&lt;T&gt;&amp; rhs);           <span class="comment">// copy not allowed</span>00036         <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> member_ptr&lt;T&gt;&amp; rhs);       <span class="comment">// assignment not allowed</span>00037 00038         T *m_p;00039 };00040 00041 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; member_ptr&lt;T&gt;::~member_ptr() {<span class="keyword">delete</span> m_p;}00042 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">void</span> member_ptr&lt;T&gt;::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>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">class </span>value_ptr : <span class="keyword">public</span> member_ptr&lt;T&gt;00047 {00048 <span class="keyword">public</span>:00049         value_ptr(<span class="keyword">const</span> T &amp;obj) : member_ptr&lt;T&gt;(new T(obj)) {}00050         value_ptr(T *p = NULL) : member_ptr&lt;T&gt;(p) {}00051         value_ptr(<span class="keyword">const</span> value_ptr&lt;T&gt;&amp; rhs)00052                 : member_ptr&lt;T&gt;(rhs.m_p ? new T(*rhs.m_p) : NULL) {}00053 00054         value_ptr&lt;T&gt;&amp; operator=(<span class="keyword">const</span> value_ptr&lt;T&gt;&amp; rhs);00055         <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> value_ptr&lt;T&gt;&amp; rhs)00056         {00057                 <span class="keywordflow">return</span> (!m_p &amp;&amp; !rhs.m_p) || (m_p &amp;&amp; rhs.m_p &amp;&amp; *m_p == *rhs.m_p);00058         }00059 };00060 00061 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; value_ptr&lt;T&gt;&amp; value_ptr&lt;T&gt;::operator=(<span class="keyword">const</span> value_ptr&lt;T&gt;&amp; 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>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">class </span>clonable_ptr : <span class="keyword">public</span> member_ptr&lt;T&gt;00072 {00073 <span class="keyword">public</span>:00074         clonable_ptr(<span class="keyword">const</span> T &amp;obj) : member_ptr&lt;T&gt;(obj.Clone()) {}00075         clonable_ptr(T *p = NULL) : member_ptr&lt;T&gt;(p) {}00076         clonable_ptr(<span class="keyword">const</span> clonable_ptr&lt;T&gt;&amp; rhs)00077                 : member_ptr&lt;T&gt;(rhs.m_p ? rhs.m_p-&gt;Clone() : NULL) {}00078 00079         clonable_ptr&lt;T&gt;&amp; operator=(<span class="keyword">const</span> clonable_ptr&lt;T&gt;&amp; rhs);00080 };00081 00082 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; clonable_ptr&lt;T&gt;&amp; clonable_ptr&lt;T&gt;::operator=(<span class="keyword">const</span> clonable_ptr&lt;T&gt;&amp; rhs)00083 {00084         T *old_p = m_p;00085         m_p = rhs.m_p ? rhs.m_p-&gt;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>&lt;<span class="keyword">class</span> T&gt; <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 &amp;r) : m_p(0) {attach(r);}00097         counted_ptr(<span class="keyword">const</span> counted_ptr&lt;T&gt;&amp; rhs);00098 00099         ~counted_ptr();00100 00101         <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *m_p; }00102         T&amp; operator*() { <span class="keywordflow">return</span> *m_p; }00103 00104         <span class="keyword">const</span> T* operator-&gt;()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_p; }00105         T* operator-&gt;() { <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 &amp;p);00111 00112         counted_ptr&lt;T&gt; &amp; operator=(<span class="keyword">const</span> counted_ptr&lt;T&gt;&amp; rhs);00113 00114 <span class="keyword">private</span>:00115         T *m_p;00116 };00117 00118 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; counted_ptr&lt;T&gt;::counted_ptr(T *p)00119         : m_p(p) 00120 {00121         <span class="keywordflow">if</span> (m_p)00122                 m_p-&gt;m_referenceCount = 1;00123 }00124 00125 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; counted_ptr&lt;T&gt;::counted_ptr(<span class="keyword">const</span> counted_ptr&lt;T&gt;&amp; rhs)00126         : m_p(rhs.m_p)00127 {00128         <span class="keywordflow">if</span> (m_p)00129                 m_p-&gt;m_referenceCount++;00130 }00131 00132 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; counted_ptr&lt;T&gt;::~counted_ptr()00133 {00134         <span class="keywordflow">if</span> (m_p &amp;&amp; --m_p-&gt;m_referenceCount == 0)00135                 <span class="keyword">delete</span> m_p;00136 }00137 00138 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keywordtype">void</span> counted_ptr&lt;T&gt;::attach(<span class="keyword">const</span> T &amp;r)00139 {00140         <span class="keywordflow">if</span> (m_p &amp;&amp; --m_p-&gt;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-&gt;m_referenceCount = 1;00146         }00147         <span class="keywordflow">else</span>00148         {00149                 m_p = const_cast&lt;T *&gt;(&amp;r);00150                 m_p-&gt;m_referenceCount++;00151         }00152 }00153 00154 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; T* counted_ptr&lt;T&gt;::get()00155 {00156         <span class="keywordflow">if</span> (m_p &amp;&amp; m_p-&gt;m_referenceCount &gt; 1)00157         {00158                 T *temp = m_p-&gt;clone();00159                 m_p-&gt;m_referenceCount--;00160                 m_p = temp;00161                 m_p-&gt;m_referenceCount = 1;00162         }00163         <span class="keywordflow">return</span> m_p;00164 }00165 00166 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; counted_ptr&lt;T&gt; &amp; counted_ptr&lt;T&gt;::operator=(<span class="keyword">const</span> counted_ptr&lt;T&gt;&amp; rhs)00167 {00168         <span class="keywordflow">if</span> (m_p != rhs.m_p)00169         {00170                 <span class="keywordflow">if</span> (m_p &amp;&amp; --m_p-&gt;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-&gt;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> &lt;<span class="keyword">class</span> T&gt; <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&lt;T&gt;[_size];}00186         ~vector_member_ptrs()00187                 {<span class="keyword">delete</span> [] ptr;}00188 00189         member_ptr&lt;T&gt;&amp; operator[](<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index)00190                 {assert(index&lt;_size); <span class="keywordflow">return</span> ptr[index];}00191         <span class="keyword">const</span> member_ptr&lt;T&gt;&amp; operator[](<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index)<span class="keyword"> const</span>00192 <span class="keyword">                </span>{assert(index&lt;_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&lt;T&gt; *newPtr = <span class="keyword">new</span> member_ptr&lt;T&gt;[newSize];00198                 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i&lt;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&lt;T&gt; &amp;c);     <span class="comment">// copy not allowed</span>00207         <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> vector_member_ptrs&lt;T&gt; &amp;x);         <span class="comment">// assignment not allowed</span>00208 00209         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> _size;00210         member_ptr&lt;T&gt; *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 + -
显示快捷键?