00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef TOOL_GMP_64_WRAPPER_HXX_
00023 # define TOOL_GMP_64_WRAPPER_HXX_
00024
00025 # include <stdexcept>
00026
00027 # include <wipal/tool/gmp_64_wrapper.hh>
00028
00029 namespace wpl
00030 {
00031
00032 namespace tool
00033 {
00034
00035 inline
00036 mpz_class
00037 mpz_of_uint64(uint64_t u)
00038 {
00039 const mpz_class u_hi = uint32_t (u >> 32);
00040 const mpz_class u_lo = uint32_t (u);
00041
00042 return (u_hi << 32) | u_lo;
00043 }
00044
00045 inline
00046 uint64_t
00047 uint64_of_mpz(const mpz_class u)
00048 {
00049 static const mpz_class mask = uint32_t (0xFFFFFFFF);
00050
00051 switch (sgn(u))
00052 {
00053 case -1:
00054 {
00055 const mpz_class t = -u;
00056 const mpz_class l = t & mask;
00057 const mpz_class h = t >> 32;
00058 const uint64_t v = (uint64_t (h.get_ui()) << 32) | l.get_ui();
00059
00060 return -v;
00061 }
00062
00063 case 0:
00064 return 0;
00065
00066 case 1:
00067 {
00068 const mpz_class l = u & mask;
00069 const mpz_class h = u >> 32;
00070
00071 return (uint64_t (h.get_ui()) << 32) | l.get_ui();
00072 }
00073
00074 default:
00075 throw std::logic_error ("Internal error, please fill a bug report");
00076 }
00077 }
00078
00079 }
00080
00081 }
00082
00083 #endif // TOOL_GMP_64_WRAPPER_HXX_