📄 algparam_8h-source.html
字号:
00163 <span class="keywordflow">return</span> GetValueHelperClass<T, T>(pObject, name, valueType, pValue);00164 }00165 00166 <span class="comment">// ********************************************************</span>00167 00168 <span class="keyword">template</span> <<span class="keyword">class</span> R>00169 R Hack_DefaultValueFromConstReferenceType(<span class="keyword">const</span> R &)00170 {00171 <span class="keywordflow">return</span> R();00172 }00173 00174 <span class="keyword">template</span> <<span class="keyword">class</span> R>00175 <span class="keywordtype">bool</span> Hack_GetValueIntoConstReference(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &source, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> R &value)00176 {00177 <span class="keywordflow">return</span> source.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha39">GetValue</a>(name, const_cast<R &>(value));00178 }00179 00180 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> BASE>00181 <span class="keyword">class </span>AssignFromHelperClass00182 {00183 <span class="keyword">public</span>:00184 AssignFromHelperClass(T *pObject, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &source)00185 : m_pObject(pObject), m_source(source), m_done(false)00186 {00187 <span class="keywordflow">if</span> (source.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha37">GetThisObject</a>(*pObject))00188 m_done = <span class="keyword">true</span>;00189 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">typeid</span>(BASE) != <span class="keyword">typeid</span>(T))00190 pObject->BASE::AssignFrom(source);00191 }00192 00193 <span class="keyword">template</span> <<span class="keyword">class</span> R>00194 AssignFromHelperClass & operator()(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">void</span> (T::*pm)(R)) <span class="comment">// VC60 workaround: "const R &" here causes compiler error</span>00195 {00196 <span class="keywordflow">if</span> (!m_done)00197 {00198 R value = Hack_DefaultValueFromConstReferenceType(reinterpret_cast<R>(*(<span class="keywordtype">int</span> *)NULL));00199 <span class="keywordflow">if</span> (!Hack_GetValueIntoConstReference(m_source, name, value))00200 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(std::string(<span class="keyword">typeid</span>(T).name()) + <span class="stringliteral">": Missing required parameter '"</span> + name + <span class="stringliteral">"'"</span>);00201 (m_pObject->*pm)(value);00202 }00203 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00204 }00205 00206 <span class="keyword">template</span> <<span class="keyword">class</span> R, <span class="keyword">class</span> S>00207 AssignFromHelperClass & operator()(<span class="keyword">const</span> <span class="keywordtype">char</span> *name1, <span class="keyword">const</span> <span class="keywordtype">char</span> *name2, <span class="keywordtype">void</span> (T::*pm)(R, S)) <span class="comment">// VC60 workaround: "const R &" here causes compiler error</span>00208 {00209 <span class="keywordflow">if</span> (!m_done)00210 {00211 R value1 = Hack_DefaultValueFromConstReferenceType(reinterpret_cast<R>(*(<span class="keywordtype">int</span> *)NULL));00212 <span class="keywordflow">if</span> (!Hack_GetValueIntoConstReference(m_source, name1, value1))00213 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(std::string(<span class="keyword">typeid</span>(T).name()) + <span class="stringliteral">": Missing required parameter '"</span> + name1 + <span class="stringliteral">"'"</span>);00214 S value2 = Hack_DefaultValueFromConstReferenceType(reinterpret_cast<S>(*(<span class="keywordtype">int</span> *)NULL));00215 <span class="keywordflow">if</span> (!Hack_GetValueIntoConstReference(m_source, name2, value2))00216 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(std::string(<span class="keyword">typeid</span>(T).name()) + <span class="stringliteral">": Missing required parameter '"</span> + name2 + <span class="stringliteral">"'"</span>);00217 (m_pObject->*pm)(value1, value2);00218 }00219 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00220 }00221 00222 <span class="keyword">private</span>:00223 T *m_pObject;00224 <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &m_source;00225 <span class="keywordtype">bool</span> m_done;00226 };00227 00228 <span class="keyword">template</span> <<span class="keyword">class</span> BASE, <span class="keyword">class</span> T>00229 AssignFromHelperClass<T, BASE> AssignFromHelper(T *pObject, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &source, BASE *dummy=NULL)00230 {00231 <span class="keywordflow">return</span> AssignFromHelperClass<T, BASE>(pObject, source);00232 }00233 00234 <span class="keyword">template</span> <<span class="keyword">class</span> T>00235 AssignFromHelperClass<T, T> AssignFromHelper(T *pObject, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &source)00236 {00237 <span class="keywordflow">return</span> AssignFromHelperClass<T, T>(pObject, source);00238 }00239 00240 <span class="comment">// ********************************************************</span>00241 00242 CRYPTOPP_DLL <span class="keywordtype">void</span> AssignIntToInteger(<span class="keywordtype">void</span> *pInteger, <span class="keyword">const</span> <span class="keywordtype">void</span> *pInt);00243 00244 CRYPTOPP_DLL <span class="keyword">extern</span> <span class="keyword">const</span> std::type_info &g_typeidInteger;00245 00246 <span class="keyword">template</span> <<span class="keyword">class</span> BASE, <span class="keyword">class</span> T>00247 <span class="keyword">class </span>AlgorithmParameters : <span class="keyword">public</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a>00248 {00249 <span class="keyword">public</span>:00250 AlgorithmParameters(<span class="keyword">const</span> BASE &base, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> T &value)00251 : m_base(base), m_name(name), m_value(value)00252 #ifndef NDEBUG00253 , m_used(false)00254 #endif00255 {}00256 00257 <span class="preprocessor">#ifndef NDEBUG</span>00258 <span class="preprocessor"></span> AlgorithmParameters(<span class="keyword">const</span> AlgorithmParameters &copy)00259 : m_base(copy.m_base), m_name(copy.m_name), m_value(copy.m_value), m_used(false)00260 {00261 copy.m_used = <span class="keyword">true</span>;00262 }00263 00264 <span class="comment">// TODO: revisit after implementing some tracing mechanism, this won't work because of exceptions</span>00265 <span class="comment">// ~AlgorithmParameters() {assert(m_used);} // use assert here because we don't want to throw out of a destructor</span>00266 <span class="preprocessor">#endif</span>00267 <span class="preprocessor"></span>00268 <span class="keyword">template</span> <<span class="keyword">class</span> R>00269 AlgorithmParameters<AlgorithmParameters<BASE,T>, R> operator()(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> R &value)<span class="keyword"> const</span>00270 <span class="keyword"> </span>{00271 <span class="keywordflow">return</span> AlgorithmParameters<AlgorithmParameters<BASE,T>, R>(*<span class="keyword">this</span>, name, value);00272 }00273 00274 <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>00275 <span class="keyword"> </span>{00276 <span class="keywordflow">if</span> (strcmp(name, <span class="stringliteral">"ValueNames"</span>) == 0)00277 {00278 <a class="code" href="class_name_value_pairs.html#_x_t_r___d_he0">ThrowIfTypeMismatch</a>(name, <span class="keyword">typeid</span>(std::string), valueType);00279 m_base.GetVoidValue(name, valueType, pValue);00280 (*reinterpret_cast<std::string *>(pValue) += m_name) += <span class="stringliteral">";"</span>;00281 <span class="keywordflow">return</span> <span class="keyword">true</span>;00282 }00283 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strcmp(name, m_name) == 0)00284 {00285 <span class="comment">// special case for retrieving an Integer parameter when an int was passed in</span>00286 <span class="keywordflow">if</span> (valueType == g_typeidInteger && <span class="keyword">typeid</span>(T) == <span class="keyword">typeid</span>(<span class="keywordtype">int</span>))00287 AssignIntToInteger(pValue, &m_value);00288 <span class="keywordflow">else</span>00289 {00290 <a class="code" href="class_name_value_pairs.html#_x_t_r___d_he0">ThrowIfTypeMismatch</a>(name, <span class="keyword">typeid</span>(T), valueType);00291 *reinterpret_cast<T *>(pValue) = m_value;00292 }00293 <span class="preprocessor">#ifndef NDEBUG</span>00294 <span class="preprocessor"></span> m_used = <span class="keyword">true</span>;00295 <span class="preprocessor">#endif</span>00296 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;00297 }00298 <span class="keywordflow">else</span>00299 <span class="keywordflow">return</span> m_base.GetVoidValue(name, valueType, pValue);00300 }00301 00302 <span class="keyword">private</span>:00303 BASE m_base;00304 <span class="keyword">const</span> <span class="keywordtype">char</span> *m_name;00305 T m_value;00306 <span class="preprocessor">#ifndef NDEBUG</span>00307 <span class="preprocessor"></span> <span class="keyword">mutable</span> <span class="keywordtype">bool</span> m_used;00308 <span class="preprocessor">#endif</span>00309 <span class="preprocessor"></span>};00310 00311 <span class="keyword">template</span> <<span class="keyword">class</span> T>00312 AlgorithmParameters<NullNameValuePairs,T> MakeParameters(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> T &value)00313 {00314 <span class="keywordflow">return</span> AlgorithmParameters<NullNameValuePairs,T>(g_nullNameValuePairs, name, value);00315 }00316 00317 <span class="preprocessor">#define CRYPTOPP_GET_FUNCTION_ENTRY(name) (Name::name(), &ThisClass::Get##name)</span>00318 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_SET_FUNCTION_ENTRY(name) (Name::name(), &ThisClass::Set##name)</span>00319 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_SET_FUNCTION_ENTRY2(name1, name2) (Name::name1(), Name::name2(), &ThisClass::Set##name1##And##name2)</span>00320 <span class="preprocessor"></span>00321 NAMESPACE_END00322 00323 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:07 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -