improve Integer initialization

pull/2/head
weidai 2006-06-09 06:28:22 +00:00
parent e5f8b8851a
commit 1012e664ef
2 changed files with 17 additions and 5 deletions

View File

@ -50,8 +50,6 @@ bool AssignIntToInteger(const std::type_info &valueType, void *pInteger, const v
return true; return true;
} }
static const char s_RunAtStartup = (g_pAssignIntToInteger = AssignIntToInteger, 0);
#ifdef SSE2_INTRINSICS_AVAILABLE #ifdef SSE2_INTRINSICS_AVAILABLE
template <class T> template <class T>
CPP_TYPENAME AllocatorBase<T>::pointer AlignedAllocator<T>::allocate(size_type n, const void *) CPP_TYPENAME AllocatorBase<T>::pointer AlignedAllocator<T>::allocate(size_type n, const void *)
@ -1047,8 +1045,6 @@ static void SetPentiumFunctionPointers()
#endif #endif
} }
static const char s_RunAtStartupSetPentiumFunctionPointers = (SetPentiumFunctionPointers(), 0);
void DisableSSE2() void DisableSSE2()
{ {
s_sse2Enabled = false; s_sse2Enabled = false;
@ -2726,6 +2722,17 @@ void MultiplyByPower2Mod(word *R, const word *A, size_t k, const word *M, size_t
// ****************************************************************** // ******************************************************************
InitializeInteger::InitializeInteger()
{
if (!g_pAssignIntToInteger)
{
#ifdef CRYPTOPP_X86ASM_AVAILABLE
SetPentiumFunctionPointers();
#endif
g_pAssignIntToInteger = AssignIntToInteger;
}
}
static const unsigned int RoundupSizeTable[] = {2, 2, 2, 4, 4, 8, 8, 8, 8}; static const unsigned int RoundupSizeTable[] = {2, 2, 2, 4, 4, 8, 8, 8, 8};
static inline size_t RoundupSize(size_t n) static inline size_t RoundupSize(size_t n)

View File

@ -67,12 +67,17 @@ NAMESPACE_BEGIN(CryptoPP)
void CRYPTOPP_DLL CRYPTOPP_API DisableSSE2(); void CRYPTOPP_DLL CRYPTOPP_API DisableSSE2();
struct InitializeInteger // used to initialize static variables
{
InitializeInteger();
};
//! multiple precision integer and basic arithmetics //! multiple precision integer and basic arithmetics
/*! This class can represent positive and negative integers /*! This class can represent positive and negative integers
with absolute value less than (256**sizeof(word)) ** (256**sizeof(int)). with absolute value less than (256**sizeof(word)) ** (256**sizeof(int)).
\nosubgrouping \nosubgrouping
*/ */
class CRYPTOPP_DLL Integer : public ASN1Object class CRYPTOPP_DLL Integer : private InitializeInteger, public ASN1Object
{ {
public: public:
//! \name ENUMS, EXCEPTIONS, and TYPEDEFS //! \name ENUMS, EXCEPTIONS, and TYPEDEFS