⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 secblock_8h-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!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++: secblock.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>secblock.h</h1><div class="fragment"><pre>00001 <span class="comment">// secblock.h - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#ifndef CRYPTOPP_SECBLOCK_H</span>00004 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_SECBLOCK_H</span>00005 <span class="preprocessor"></span>00006 <span class="preprocessor">#include "config.h"</span>00007 <span class="preprocessor">#include "misc.h"</span>00008 <span class="preprocessor">#include &lt;string.h&gt;</span>             <span class="comment">// CodeWarrior doesn't have memory.h</span>00009 <span class="preprocessor">#include &lt;assert.h&gt;</span>00010 00011 NAMESPACE_BEGIN(CryptoPP)00012 00013 <span class="comment">// ************** secure memory allocation ***************</span>00014 00015 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;00016 <span class="keyword">class </span>AllocatorBase00017 {00018 <span class="keyword">public</span>:00019         <span class="keyword">typedef</span> T value_type;00020         <span class="keyword">typedef</span> size_t size_type;00021 <span class="preprocessor">#ifdef CRYPTOPP_MSVCRT6</span>00022 <span class="preprocessor"></span>        <span class="keyword">typedef</span> ptrdiff_t difference_type;00023 <span class="preprocessor">#else</span>00024 <span class="preprocessor"></span>        <span class="keyword">typedef</span> std::ptrdiff_t difference_type;00025 <span class="preprocessor">#endif</span>00026 <span class="preprocessor"></span>        <span class="keyword">typedef</span> T * pointer;00027         <span class="keyword">typedef</span> <span class="keyword">const</span> T * const_pointer;00028         <span class="keyword">typedef</span> T &amp; reference;00029         <span class="keyword">typedef</span> <span class="keyword">const</span> T &amp; const_reference;00030 00031         pointer address(reference r)<span class="keyword"> const </span>{<span class="keywordflow">return</span> (&amp;r);}00032         const_pointer address(const_reference r)<span class="keyword"> const </span>{<span class="keywordflow">return</span> (&amp;r); }00033         <span class="keywordtype">void</span> construct(pointer p, <span class="keyword">const</span> T&amp; val) {<span class="keyword">new</span> (p) T(val);}00034         <span class="keywordtype">void</span> destroy(pointer p) {p-&gt;~T();}00035         size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size_type(-1)/<span class="keyword">sizeof</span>(T);}00036 };00037 00038 <span class="preprocessor">#define CRYPTOPP_INHERIT_ALLOCATOR_TYPES        \</span>00039 <span class="preprocessor">typedef typename AllocatorBase&lt;T&gt;::value_type value_type;\</span>00040 <span class="preprocessor">typedef typename AllocatorBase&lt;T&gt;::size_type size_type;\</span>00041 <span class="preprocessor">typedef typename AllocatorBase&lt;T&gt;::difference_type difference_type;\</span>00042 <span class="preprocessor">typedef typename AllocatorBase&lt;T&gt;::pointer pointer;\</span>00043 <span class="preprocessor">typedef typename AllocatorBase&lt;T&gt;::const_pointer const_pointer;\</span>00044 <span class="preprocessor">typedef typename AllocatorBase&lt;T&gt;::reference reference;\</span>00045 <span class="preprocessor">typedef typename AllocatorBase&lt;T&gt;::const_reference const_reference;</span>00046 <span class="preprocessor"></span>00047 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> A&gt;00048 <span class="keyword">typename</span> A::pointer StandardReallocate(A&amp; a, T *p, <span class="keyword">typename</span> A::size_type oldSize, <span class="keyword">typename</span> A::size_type newSize, <span class="keywordtype">bool</span> preserve)00049 {00050         <span class="keywordflow">if</span> (oldSize == newSize)00051                 <span class="keywordflow">return</span> p;00052 00053         <span class="keywordflow">if</span> (preserve)00054         {00055                 <span class="keyword">typename</span> A::pointer newPointer = a.allocate(newSize, NULL);00056                 memcpy(newPointer, p, <span class="keyword">sizeof</span>(T)*STDMIN(oldSize, newSize));00057                 a.deallocate(p, oldSize);00058                 <span class="keywordflow">return</span> newPointer;00059         }00060         <span class="keywordflow">else</span>00061         {00062                 a.deallocate(p, oldSize);00063                 <span class="keywordflow">return</span> a.allocate(newSize, NULL);00064         }00065 }00066 00067 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00068 <span class="keyword">class </span>AllocatorWithCleanup : <span class="keyword">public</span> AllocatorBase&lt;T&gt;00069 {00070 <span class="keyword">public</span>:00071         CRYPTOPP_INHERIT_ALLOCATOR_TYPES00072 00073         pointer allocate(size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> * = NULL)00074         {00075                 <span class="keywordflow">if</span> (n &gt; 0)00076                         <span class="keywordflow">return</span> <span class="keyword">new</span> T[n];00077                 <span class="keywordflow">else</span>00078                         <span class="keywordflow">return</span> NULL;00079         }00080 00081         <span class="keywordtype">void</span> deallocate(<span class="keywordtype">void</span> *p, size_type n)00082         {00083                 memset(p, 0, n*<span class="keyword">sizeof</span>(T));00084                 <span class="keyword">delete</span> [] (T *)p;00085         }00086 00087         pointer reallocate(T *p, size_type oldSize, size_type newSize, <span class="keywordtype">bool</span> preserve)00088         {00089                 <span class="keywordflow">return</span> StandardReallocate(*<span class="keyword">this</span>, p, oldSize, newSize, preserve);00090         }00091 00092         <span class="comment">// VS.NET STL enforces the policy of "All STL-compliant allocators have to provide a</span>00093         <span class="comment">// template class member called rebind".</span>00094     <span class="keyword">template</span> &lt;<span class="keyword">class</span> U&gt; <span class="keyword">struct </span>rebind { <span class="keyword">typedef</span> AllocatorWithCleanup&lt;U&gt; other; };00095 };00096 00097 CRYPTOPP_DLL_TEMPLATE_CLASS AllocatorWithCleanup&lt;byte&gt;;00098 CRYPTOPP_DLL_TEMPLATE_CLASS AllocatorWithCleanup&lt;word16&gt;;00099 CRYPTOPP_DLL_TEMPLATE_CLASS AllocatorWithCleanup&lt;word32&gt;;00100 00101 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00102 <span class="keyword">class </span>NullAllocator : <span class="keyword">public</span> AllocatorBase&lt;T&gt;00103 {00104 <span class="keyword">public</span>:00105         CRYPTOPP_INHERIT_ALLOCATOR_TYPES00106 00107         pointer allocate(size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> * = NULL)00108         {00109                 assert(<span class="keyword">false</span>);00110                 <span class="keywordflow">return</span> NULL;00111         }00112 00113         <span class="keywordtype">void</span> deallocate(<span class="keywordtype">void</span> *p, size_type n)00114         {00115                 assert(<span class="keyword">false</span>);00116         }00117 };00118 00119 <span class="comment">// this allocator can't be used with standard collections</span>00120 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> S, <span class="keyword">class</span> A = NullAllocator&lt;T&gt; &gt;00121 <span class="keyword">class </span>FixedSizeAllocatorWithCleanup : <span class="keyword">public</span> AllocatorBase&lt;T&gt;00122 {00123 <span class="keyword">public</span>:00124         CRYPTOPP_INHERIT_ALLOCATOR_TYPES00125 00126         pointer allocate(size_type n)00127         {00128                 <span class="keywordflow">if</span> (n &lt;= S)00129                 {00130                         assert(!m_allocated);00131 <span class="preprocessor">#ifndef NDEBUG</span>00132 <span class="preprocessor"></span>                        m_allocated = <span class="keyword">true</span>;00133 <span class="preprocessor">#endif</span>00134 <span class="preprocessor"></span>                        <span class="keywordflow">return</span> m_array;00135                 }00136                 <span class="keywordflow">else</span>00137                         <span class="keywordflow">return</span> m_fallbackAllocator.allocate(n);00138         }00139 00140         pointer allocate(size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> *hint)00141         {00142                 <span class="keywordflow">if</span> (n &lt;= S)00143                 {00144                         assert(!m_allocated);00145 <span class="preprocessor">#ifndef NDEBUG</span>00146 <span class="preprocessor"></span>                        m_allocated = <span class="keyword">true</span>;00147 <span class="preprocessor">#endif</span>00148 <span class="preprocessor"></span>                        <span class="keywordflow">return</span> m_array;00149                 }00150                 <span class="keywordflow">else</span>00151                         <span class="keywordflow">return</span> m_fallbackAllocator.allocate(n, hint);00152         }00153 00154         <span class="keywordtype">void</span> deallocate(<span class="keywordtype">void</span> *p, size_type n)00155         {00156                 <span class="keywordflow">if</span> (n &lt;= S)00157                 {00158                         assert(m_allocated);00159                         assert(p == m_array);00160 <span class="preprocessor">#ifndef NDEBUG</span>00161 <span class="preprocessor"></span>                        m_allocated = <span class="keyword">false</span>;00162 <span class="preprocessor">#endif</span>00163 <span class="preprocessor"></span>                        memset(p, 0, n*<span class="keyword">sizeof</span>(T));00164                 }00165                 <span class="keywordflow">else</span>00166                         m_fallbackAllocator.deallocate(p, n);00167         }00168 00169         pointer reallocate(pointer p, size_type oldSize, size_type newSize, <span class="keywordtype">bool</span> preserve)00170         {00171                 <span class="keywordflow">if</span> (oldSize &lt;= S &amp;&amp; newSize &lt;= S)00172                         <span class="keywordflow">return</span> p;00173 00174                 <span class="keywordflow">return</span> StandardReallocate(*<span class="keyword">this</span>, p, oldSize, newSize, preserve);00175         }00176 00177         size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_fallbackAllocator.max_size();}00178 00179 <span class="keyword">private</span>:00180         A m_fallbackAllocator;00181         T m_array[S];00182 00183 <span class="preprocessor">#ifndef NDEBUG</span>00184 <span class="preprocessor"></span><span class="keyword">public</span>:00185         FixedSizeAllocatorWithCleanup() : m_allocated(false) {}00186         <span class="keywordtype">bool</span> m_allocated;00187 <span class="preprocessor">#endif</span>00188 <span class="preprocessor"></span>};00189 <span class="comment"></span>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -