📄 secblock_8h-source.html
字号:
<!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 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>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 <string.h></span> <span class="comment">// CodeWarrior doesn't have memory.h</span>00009 <span class="preprocessor">#include <assert.h></span>00010 00011 NAMESPACE_BEGIN(CryptoPP)00012 00013 <span class="comment">// ************** secure memory allocation ***************</span>00014 00015 <span class="keyword">template</span><<span class="keyword">class</span> T>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 & reference;00029 <span class="keyword">typedef</span> <span class="keyword">const</span> T & const_reference;00030 00031 pointer address(reference r)<span class="keyword"> const </span>{<span class="keywordflow">return</span> (&r);}00032 const_pointer address(const_reference r)<span class="keyword"> const </span>{<span class="keywordflow">return</span> (&r); }00033 <span class="keywordtype">void</span> construct(pointer p, <span class="keyword">const</span> T& val) {<span class="keyword">new</span> (p) T(val);}00034 <span class="keywordtype">void</span> destroy(pointer p) {p->~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<T>::value_type value_type;\</span>00040 <span class="preprocessor">typedef typename AllocatorBase<T>::size_type size_type;\</span>00041 <span class="preprocessor">typedef typename AllocatorBase<T>::difference_type difference_type;\</span>00042 <span class="preprocessor">typedef typename AllocatorBase<T>::pointer pointer;\</span>00043 <span class="preprocessor">typedef typename AllocatorBase<T>::const_pointer const_pointer;\</span>00044 <span class="preprocessor">typedef typename AllocatorBase<T>::reference reference;\</span>00045 <span class="preprocessor">typedef typename AllocatorBase<T>::const_reference const_reference;</span>00046 <span class="preprocessor"></span>00047 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> A>00048 <span class="keyword">typename</span> A::pointer StandardReallocate(A& 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> <<span class="keyword">class</span> T>00068 <span class="keyword">class </span>AllocatorWithCleanup : <span class="keyword">public</span> AllocatorBase<T>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 > 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> <<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind { <span class="keyword">typedef</span> AllocatorWithCleanup<U> other; };00095 };00096 00097 CRYPTOPP_DLL_TEMPLATE_CLASS AllocatorWithCleanup<byte>;00098 CRYPTOPP_DLL_TEMPLATE_CLASS AllocatorWithCleanup<word16>;00099 CRYPTOPP_DLL_TEMPLATE_CLASS AllocatorWithCleanup<word32>;00100 00101 <span class="keyword">template</span> <<span class="keyword">class</span> T>00102 <span class="keyword">class </span>NullAllocator : <span class="keyword">public</span> AllocatorBase<T>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> <<span class="keyword">class</span> T, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> S, <span class="keyword">class</span> A = NullAllocator<T> >00121 <span class="keyword">class </span>FixedSizeAllocatorWithCleanup : <span class="keyword">public</span> AllocatorBase<T>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 <= 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 <= 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 <= 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 <= S && newSize <= 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 + -