📄 algparam_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++: algparam.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>algparam.h</h1><div class="fragment"><pre>00001 <span class="preprocessor">#ifndef CRYPTOPP_ALGPARAM_H</span>00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_ALGPARAM_H</span>00003 <span class="preprocessor"></span>00004 <span class="preprocessor">#include "<a class="code" href="cryptlib_8h.html">cryptlib.h</a>"</span>00005 <span class="preprocessor">#include "smartptr.h"</span>00006 <span class="preprocessor">#include "secblock.h"</span>00007 00008 NAMESPACE_BEGIN(CryptoPP)00009 00010 <span class="comment">//! used to pass byte array input as part of a NameValuePairs object</span>00011 <span class="comment"></span><span class="comment">/*! the deepCopy option is used when the NameValuePairs object can't</span>00012 <span class="comment"> keep a copy of the data available */</span><a name="l00013"></a><a class="code" href="class_const_byte_array_parameter.html">00013</a> <span class="keyword">class </span><a class="code" href="class_const_byte_array_parameter.html">ConstByteArrayParameter</a>00014 {00015 <span class="keyword">public</span>:00016 <a class="code" href="class_const_byte_array_parameter.html">ConstByteArrayParameter</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *data = NULL, <span class="keywordtype">bool</span> deepCopy = <span class="keyword">false</span>)00017 {00018 Assign((<span class="keyword">const</span> byte *)data, data ? strlen(data) : 0, deepCopy);00019 }00020 <a class="code" href="class_const_byte_array_parameter.html">ConstByteArrayParameter</a>(<span class="keyword">const</span> byte *data, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size, <span class="keywordtype">bool</span> deepCopy = <span class="keyword">false</span>)00021 {00022 Assign(data, size, deepCopy);00023 }00024 <span class="keyword">template</span> <<span class="keyword">class</span> T> <a class="code" href="class_const_byte_array_parameter.html">ConstByteArrayParameter</a>(<span class="keyword">const</span> T &string, <span class="keywordtype">bool</span> deepCopy = <span class="keyword">false</span>)00025 {00026 CRYPTOPP_COMPILE_ASSERT(<span class="keyword">sizeof</span>(string[0])==1);00027 Assign((<span class="keyword">const</span> byte *)string.data(), string.size(), deepCopy);00028 }00029 00030 <span class="keywordtype">void</span> Assign(<span class="keyword">const</span> byte *data, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size, <span class="keywordtype">bool</span> deepCopy)00031 {00032 <span class="keywordflow">if</span> (deepCopy)00033 m_block.<a class="code" href="class_sec_block.html#_sec_block_with_hinta15">Assign</a>(data, size);00034 <span class="keywordflow">else</span>00035 {00036 m_data = data;00037 m_size = size;00038 }00039 m_deepCopy = deepCopy;00040 }00041 00042 <span class="keyword">const</span> byte *begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_deepCopy ? m_block.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>() : m_data;}00043 <span class="keyword">const</span> byte *end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_deepCopy ? m_block.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">end</a>() : m_data + m_size;}00044 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_deepCopy ? m_block.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>() : m_size;}00045 00046 <span class="keyword">private</span>:00047 <span class="keywordtype">bool</span> m_deepCopy;00048 <span class="keyword">const</span> byte *m_data;00049 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_size;00050 <a class="code" href="class_sec_block.html">SecByteBlock</a> m_block;00051 };00052 00053 <span class="keyword">class </span>ByteArrayParameter00054 {00055 <span class="keyword">public</span>:00056 ByteArrayParameter(byte *data = NULL, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size = 0)00057 : m_data(data), m_size(size) {}00058 ByteArrayParameter(<a class="code" href="class_sec_block.html">SecByteBlock</a> &block)00059 : m_data(block.begin()), m_size(block.size()) {}00060 00061 byte *begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_data;}00062 byte *end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_data + m_size;}00063 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_size;}00064 00065 <span class="keyword">private</span>:00066 byte *m_data;00067 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_size;00068 };00069 00070 <span class="keyword">class </span>CombinedNameValuePairs : <span class="keyword">public</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a>00071 {00072 <span class="keyword">public</span>:00073 CombinedNameValuePairs(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &pairs1, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &pairs2)00074 : m_pairs1(pairs1), m_pairs2(pairs2) {}00075 00076 <span class="keywordtype">bool</span> GetVoidValue(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &valueType, <span class="keywordtype">void</span> *pValue)<span class="keyword"> const</span>00077 <span class="keyword"> </span>{00078 <span class="keywordflow">if</span> (strcmp(name, <span class="stringliteral">"ValueNames"</span>) == 0)00079 <span class="keywordflow">return</span> m_pairs1.GetVoidValue(name, valueType, pValue) && m_pairs2.GetVoidValue(name, valueType, pValue);00080 <span class="keywordflow">else</span>00081 <span class="keywordflow">return</span> m_pairs1.GetVoidValue(name, valueType, pValue) || m_pairs2.GetVoidValue(name, valueType, pValue);00082 }00083 00084 <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &m_pairs1, &m_pairs2;00085 };00086 00087 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> BASE>00088 <span class="keyword">class </span>GetValueHelperClass00089 {00090 <span class="keyword">public</span>:00091 GetValueHelperClass(<span class="keyword">const</span> T *pObject, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &valueType, <span class="keywordtype">void</span> *pValue)00092 : m_pObject(pObject), m_name(name), m_valueType(&valueType), m_pValue(pValue), m_found(false), m_getValueNames(false)00093 {00094 <span class="keywordflow">if</span> (strcmp(name, <span class="stringliteral">"ValueNames"</span>) == 0)00095 m_found = m_getValueNames = <span class="keyword">true</span>;00096 00097 std::string thisPointerName = std::string(<span class="stringliteral">"ThisPointer:"</span>) + <span class="keyword">typeid</span>(T).name();00098 00099 <span class="keywordflow">if</span> (m_getValueNames)00100 {00101 <a class="code" href="class_name_value_pairs.html#_x_t_r___d_he0">NameValuePairs::ThrowIfTypeMismatch</a>(name, <span class="keyword">typeid</span>(std::string), *m_valueType);00102 <span class="keywordflow">if</span> (<span class="keyword">typeid</span>(T) != <span class="keyword">typeid</span>(BASE))00103 pObject->BASE::GetVoidValue(name, valueType, pValue);00104 (*reinterpret_cast<std::string *>(m_pValue) += thisPointerName) += <span class="stringliteral">";"</span>;00105 }00106 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (name == thisPointerName)00107 {00108 <a class="code" href="class_name_value_pairs.html#_x_t_r___d_he0">NameValuePairs::ThrowIfTypeMismatch</a>(name, <span class="keyword">typeid</span>(T *), *m_valueType);00109 *reinterpret_cast<const T **>(pValue) = pObject;00110 m_found = <span class="keyword">true</span>;00111 }00112 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">typeid</span>(T) != <span class="keyword">typeid</span>(BASE))00113 m_found = pObject->BASE::GetVoidValue(name, valueType, pValue);00114 }00115 00116 operator bool()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_found;}00117 00118 <span class="keyword">template</span> <<span class="keyword">class</span> R>00119 GetValueHelperClass<T,BASE> & operator()(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> R & (T::*pm)() <span class="keyword">const</span>)00120 {00121 <span class="keywordflow">if</span> (m_getValueNames)00122 (*reinterpret_cast<std::string *>(m_pValue) += name) += <span class="stringliteral">";"</span>;00123 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!m_found && strcmp(name, m_name) == 0)00124 {00125 <a class="code" href="class_name_value_pairs.html#_x_t_r___d_he0">NameValuePairs::ThrowIfTypeMismatch</a>(name, <span class="keyword">typeid</span>(R), *m_valueType);00126 *reinterpret_cast<R *>(m_pValue) = (m_pObject->*pm)();00127 m_found = <span class="keyword">true</span>;00128 }00129 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00130 }00131 00132 GetValueHelperClass<T,BASE> &Assignable()00133 {00134 std::string thisObjectName = std::string(<span class="stringliteral">"ThisObject:"</span>) + <span class="keyword">typeid</span>(T).name();00135 <span class="keywordflow">if</span> (m_getValueNames)00136 (*reinterpret_cast<std::string *>(m_pValue) += thisObjectName) += <span class="stringliteral">";"</span>;00137 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!m_found && m_name == thisObjectName)00138 {00139 <a class="code" href="class_name_value_pairs.html#_x_t_r___d_he0">NameValuePairs::ThrowIfTypeMismatch</a>(m_name, <span class="keyword">typeid</span>(T), *m_valueType);00140 *reinterpret_cast<T *>(m_pValue) = *m_pObject;00141 m_found = <span class="keyword">true</span>;00142 }00143 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00144 }00145 00146 <span class="keyword">private</span>:00147 <span class="keyword">const</span> T *m_pObject;00148 <span class="keyword">const</span> <span class="keywordtype">char</span> *m_name;00149 <span class="keyword">const</span> std::type_info *m_valueType;00150 <span class="keywordtype">void</span> *m_pValue;00151 <span class="keywordtype">bool</span> m_found, m_getValueNames;00152 };00153 00154 <span class="keyword">template</span> <<span class="keyword">class</span> BASE, <span class="keyword">class</span> T>00155 GetValueHelperClass<T, BASE> GetValueHelper(<span class="keyword">const</span> T *pObject, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &valueType, <span class="keywordtype">void</span> *pValue, BASE *dummy=NULL)00156 {00157 <span class="keywordflow">return</span> GetValueHelperClass<T, BASE>(pObject, name, valueType, pValue);00158 }00159 00160 <span class="keyword">template</span> <<span class="keyword">class</span> T>00161 GetValueHelperClass<T, T> GetValueHelper(<span class="keyword">const</span> T *pObject, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &valueType, <span class="keywordtype">void</span> *pValue)00162 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -