📄 misc_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++: misc.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>misc.h</h1><div class="fragment"><pre>00001 <span class="preprocessor">#ifndef CRYPTOPP_MISC_H</span>00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_MISC_H</span>00003 <span class="preprocessor"></span>00004 <span class="preprocessor">#include "<a class="code" href="cryptlib_8h.html">cryptlib.h</a>"</span>00005 00006 <span class="preprocessor">#ifdef INTEL_INTRINSICS</span>00007 <span class="preprocessor"></span><span class="preprocessor">#include <stdlib.h></span>00008 <span class="preprocessor">#endif</span>00009 <span class="preprocessor"></span>00010 NAMESPACE_BEGIN(CryptoPP)00011 00012 <span class="comment">// ************** compile-time assertion ***************</span>00013 00014 <span class="keyword">template</span> <<span class="keywordtype">bool</span> b>00015 <span class="keyword">struct </span>CompileAssert00016 {00017 <span class="keyword">static</span> <span class="keywordtype">char</span> dummy[2*b-1];00018 };00019 00020 <span class="preprocessor">#define CRYPTOPP_COMPILE_ASSERT(assertion) CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, __LINE__)</span>00021 <span class="preprocessor"></span><span class="preprocessor">#if defined(CRYPTOPP_EXPORTS) || defined(CRYPTOPP_IMPORTS)</span>00022 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance)</span>00023 <span class="preprocessor"></span><span class="preprocessor">#else</span>00024 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) static CompileAssert<(assertion)> CRYPTOPP_ASSERT_JOIN(cryptopp_assert_, instance)</span>00025 <span class="preprocessor"></span><span class="preprocessor">#endif</span>00026 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_ASSERT_JOIN(X, Y) CRYPTOPP_DO_ASSERT_JOIN(X, Y)</span>00027 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_DO_ASSERT_JOIN(X, Y) X##Y</span>00028 <span class="preprocessor"></span>00029 <span class="comment">// ************** misc classes ***************</span>00030 00031 <span class="keyword">class </span>CRYPTOPP_DLL Empty00032 {00033 };00034 00035 <span class="keyword">template</span> <<span class="keyword">class</span> BASE1, <span class="keyword">class</span> BASE2>00036 <span class="keyword">class </span>TwoBases : <span class="keyword">public</span> BASE1, <span class="keyword">public</span> BASE200037 {00038 };00039 00040 <span class="keyword">template</span> <<span class="keyword">class</span> BASE1, <span class="keyword">class</span> BASE2, <span class="keyword">class</span> BASE3>00041 <span class="keyword">class </span>ThreeBases : <span class="keyword">public</span> BASE1, <span class="keyword">public</span> BASE2, <span class="keyword">public</span> BASE300042 {00043 };00044 00045 <span class="keyword">template</span> <<span class="keyword">class</span> T>00046 <span class="keyword">class </span>ObjectHolder00047 {00048 <span class="keyword">protected</span>:00049 T m_object;00050 };00051 00052 <span class="keyword">class </span>NotCopyable00053 {00054 <span class="keyword">public</span>:00055 NotCopyable() {}00056 <span class="keyword">private</span>:00057 NotCopyable(<span class="keyword">const</span> NotCopyable &);00058 <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> NotCopyable &);00059 };00060 00061 <span class="comment">// ************** misc functions ***************</span>00062 00063 <span class="comment">// can't use std::min or std::max in MSVC60 or Cygwin 1.1.0</span>00064 <span class="keyword">template</span> <<span class="keyword">class</span> _Tp> <span class="keyword">inline</span> <span class="keyword">const</span> _Tp& STDMIN(<span class="keyword">const</span> _Tp& __a, <span class="keyword">const</span> _Tp& __b)00065 {00066 <span class="keywordflow">return</span> __b < __a ? __b : __a;00067 }00068 00069 <span class="keyword">template</span> <<span class="keyword">class</span> _Tp> <span class="keyword">inline</span> <span class="keyword">const</span> _Tp& STDMAX(<span class="keyword">const</span> _Tp& __a, <span class="keyword">const</span> _Tp& __b)00070 {00071 <span class="keywordflow">return</span> __a < __b ? __b : __a;00072 }00073 00074 <span class="preprocessor">#define RETURN_IF_NONZERO(x) unsigned int returnedValue = x; if (returnedValue) return returnedValue</span>00075 <span class="preprocessor"></span>00076 <span class="comment">// this version of the macro is fastest on Pentium 3 and Pentium 4 with MSVC 6 SP5 w/ Processor Pack</span>00077 <span class="preprocessor">#define GETBYTE(x, y) (unsigned int)byte((x)>>(8*(y)))</span>00078 <span class="preprocessor"></span><span class="comment">// these may be faster on other CPUs/compilers</span>00079 <span class="comment">// #define GETBYTE(x, y) (unsigned int)(((x)>>(8*(y)))&255)</span>00080 <span class="comment">// #define GETBYTE(x, y) (((byte *)&(x))[y])</span>00081 00082 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Parity(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>);00083 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BytePrecision(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>);00084 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BitPrecision(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>);00085 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Crop(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size);00086 00087 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BitsToBytes(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitCount)00088 {00089 <span class="keywordflow">return</span> ((bitCount+7)/(8));00090 }00091 00092 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BytesToWords(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> byteCount)00093 {00094 <span class="keywordflow">return</span> ((byteCount+WORD_SIZE-1)/WORD_SIZE);00095 }00096 00097 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BitsToWords(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitCount)00098 {00099 <span class="keywordflow">return</span> ((bitCount+WORD_BITS-1)/(WORD_BITS));00100 }00101 00102 CRYPTOPP_DLL <span class="keywordtype">void</span> xorbuf(byte *buf, <span class="keyword">const</span> byte *mask, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count);00103 CRYPTOPP_DLL <span class="keywordtype">void</span> xorbuf(byte *output, <span class="keyword">const</span> byte *input, <span class="keyword">const</span> byte *mask, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count);00104 00105 <span class="keyword">template</span> <<span class="keyword">class</span> T>00106 <span class="keyword">inline</span> <span class="keywordtype">bool</span> IsPowerOf2(T n)00107 {00108 <span class="keywordflow">return</span> n > 0 && (n & (n-1)) == 0;00109 }00110 00111 <span class="keyword">template</span> <<span class="keyword">class</span> T1, <span class="keyword">class</span> T2>00112 <span class="keyword">inline</span> T2 ModPowerOf2(T1 a, T2 b)00113 {00114 assert(IsPowerOf2(b));00115 <span class="keywordflow">return</span> T2(a) & (b-1);00116 }00117 00118 <span class="keyword">template</span> <<span class="keyword">class</span> T>00119 <span class="keyword">inline</span> T RoundDownToMultipleOf(T n, T m)00120 {00121 <span class="keywordflow">return</span> n - (IsPowerOf2(m) ? ModPowerOf2(n, m) : (n%m));00122 }00123 00124 <span class="keyword">template</span> <<span class="keyword">class</span> T>00125 <span class="keyword">inline</span> T RoundUpToMultipleOf(T n, T m)00126 {00127 <span class="keywordflow">return</span> RoundDownToMultipleOf(n+m-1, m);00128 }00129 00130 <span class="keyword">template</span> <<span class="keyword">class</span> T>00131 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetAlignment(T *dummy=NULL) <span class="comment">// VC60 workaround</span>00132 {00133 <span class="preprocessor">#if (_MSC_VER >= 1300)</span>00134 <span class="preprocessor"></span> <span class="keywordflow">return</span> __alignof(T);00135 <span class="preprocessor">#elif defined(__GNUC__)</span>00136 <span class="preprocessor"></span> <span class="keywordflow">return</span> __alignof__(T);00137 <span class="preprocessor">#else</span>00138 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">sizeof</span>(T);00139 <span class="preprocessor">#endif</span>00140 <span class="preprocessor"></span>}00141 00142 <span class="keyword">inline</span> <span class="keywordtype">bool</span> IsAlignedOn(<span class="keyword">const</span> <span class="keywordtype">void</span> *p, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> alignment)00143 {00144 <span class="keywordflow">return</span> IsPowerOf2(alignment) ? ModPowerOf2((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)p, alignment) == 0 : (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)p % alignment == 0;00145 }00146 00147 <span class="keyword">template</span> <<span class="keyword">class</span> T>00148 <span class="keyword">inline</span> <span class="keywordtype">bool</span> IsAligned(<span class="keyword">const</span> <span class="keywordtype">void</span> *p, T *dummy=NULL) <span class="comment">// VC60 workaround</span>00149 {00150 <span class="keywordflow">return</span> IsAlignedOn(p, GetAlignment<T>());00151 }00152 00153 <span class="preprocessor">#ifdef IS_LITTLE_ENDIAN</span>00154 <span class="preprocessor"></span> <span class="keyword">typedef</span> LittleEndian NativeByteOrder;00155 <span class="preprocessor">#else</span>00156 <span class="preprocessor"></span> <span class="keyword">typedef</span> BigEndian NativeByteOrder;00157 <span class="preprocessor">#endif</span>00158 <span class="preprocessor"></span>00159 <span class="keyword">inline</span> ByteOrder GetNativeByteOrder()00160 {00161 <span class="keywordflow">return</span> NativeByteOrder::ToEnum();00162 }00163 00164 <span class="keyword">inline</span> <span class="keywordtype">bool</span> NativeByteOrderIs(ByteOrder order)00165 {00166 <span class="keywordflow">return</span> order == GetNativeByteOrder();00167 }00168 00169 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="comment">// can't use <sstream> because GCC 2.95.2 doesn't have it</span>00170 std::string IntToString(T a, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> base = 10)00171 {00172 <span class="keywordflow">if</span> (a == 0)00173 <span class="keywordflow">return</span> <span class="stringliteral">"0"</span>;00174 <span class="keywordtype">bool</span> negate = <span class="keyword">false</span>;00175 <span class="keywordflow">if</span> (a < 0)00176 {00177 negate = <span class="keyword">true</span>;00178 a = 0-a; <span class="comment">// VC .NET does not like -a</span>00179 }00180 std::string result;00181 <span class="keywordflow">while</span> (a > 0)00182 {00183 T digit = a % base;00184 result = char((digit < 10 ? <span class="charliteral">'0'</span> : (<span class="charliteral">'a'</span> - 10)) + digit) + result;00185 a /= base;00186 }00187 <span class="keywordflow">if</span> (negate)00188 result = <span class="stringliteral">"-"</span> + result;00189 <span class="keywordflow">return</span> result;00190 }00191 00192 <span class="keyword">template</span> <<span class="keyword">class</span> T1, <span class="keyword">class</span> T2>00193 <span class="keyword">inline</span> T1 SaturatingSubtract(T1 a, T2 b)00194 {00195 CRYPTOPP_COMPILE_ASSERT_INSTANCE(T1(-1)>0, 0); <span class="comment">// T1 is unsigned type</span>00196 CRYPTOPP_COMPILE_ASSERT_INSTANCE(T2(-1)>0, 1); <span class="comment">// T2 is unsigned type</span>00197 <span class="keywordflow">return</span> T1((a > b) ? (a - b) : 0);00198 }00199 00200 <span class="keyword">template</span> <<span class="keyword">class</span> T>00201 <span class="keyword">inline</span> <a class="code" href="cryptlib_8h.html#a11">CipherDir</a> GetCipherDir(<span class="keyword">const</span> T &obj)00202 {00203 <span class="keywordflow">return</span> obj.IsForwardTransformation() ? ENCRYPTION : DECRYPTION;00204 }00205 00206 <span class="comment">// ************** rotate functions ***************</span>00207 00208 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">inline</span> T rotlFixed(T x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> y)00209 {00210 assert(y < <span class="keyword">sizeof</span>(T)*8);00211 <span class="keywordflow">return</span> (x<<y) | (x>>(<span class="keyword">sizeof</span>(T)*8-y));00212 }00213 00214 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">inline</span> T rotrFixed(T x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> y)00215 {00216 assert(y < <span class="keyword">sizeof</span>(T)*8);00217 <span class="keywordflow">return</span> (x>>y) | (x<<(<span class="keyword">sizeof</span>(T)*8-y));00218 }00219 00220 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">inline</span> T rotlVariable(T x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> y)00221 {00222 assert(y < <span class="keyword">sizeof</span>(T)*8);00223 <span class="keywordflow">return</span> (x<<y) | (x>>(<span class="keyword">sizeof</span>(T)*8-y));00224 }00225 00226 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">inline</span> T rotrVariable(T x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> y)00227 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -