9 #include "CLHEP/Random/DoubConv.h" 
   16 CLHEP_THREAD_LOCAL 
bool DoubConv::byte_order_known = 
false;
 
   17 CLHEP_THREAD_LOCAL 
int  DoubConv::byte_order[8];
 
   19 void DoubConv::fill_byte_order () {
 
   28   for (
int k=0; k<6; k++) {
 
   41   static const int UNSET = -1; 
 
   43     byte_order[
n] = UNSET;
 
   73         throw DoubConvException(
 
   74                 "Cannot determine byte-ordering of doubles on this system");
 
   76     if (byte_order[n] != UNSET) {
 
   77         throw DoubConvException(
 
   78                 "Confusion in byte-ordering of doubles on this system");
 
   80     byte_order[
n] = order;
 
   81     byte_order_known = 
true;
 
   86 std::string DoubConv::d2x(
double d) {
 
   87   if ( !byte_order_known ) fill_byte_order ();
 
   90   std::ostringstream ss;
 
   91   for (
int i=0; i<8; ++i) {
 
   92     int k = byte_order[i];
 
   93     ss << std::hex << std::setw(2) << std::setfill(
'0') << (int)db.b[k];
 
   98 std::vector<unsigned long> DoubConv::dto2longs(
double d) {
 
   99   std::vector<unsigned long> v(2);
 
  100   if ( !byte_order_known ) fill_byte_order ();
 
  103   v[0] =   ((
static_cast<unsigned long>(db.b[byte_order[0]])) << 24)
 
  104          | ((static_cast<unsigned long>(db.b[byte_order[1]])) << 16)
 
  105          | ((
static_cast<unsigned long>(db.b[byte_order[2]])) <<  8)
 
  106          | ((static_cast<unsigned long>(db.b[byte_order[3]]))      );
 
  107   v[1] =   ((
static_cast<unsigned long>(db.b[byte_order[4]])) << 24)
 
  108          | ((static_cast<unsigned long>(db.b[byte_order[5]])) << 16)
 
  109          | ((
static_cast<unsigned long>(db.b[byte_order[6]])) <<  8)
 
  110          | ((static_cast<unsigned long>(db.b[byte_order[7]]))      );
 
  114 double DoubConv::longs2double (
const std::vector<unsigned long> & v) {
 
  116   unsigned char bytes[8];
 
  117   if ( !byte_order_known ) fill_byte_order ();
 
  118   bytes[0] = 
static_cast<unsigned char>((v[0] >> 24) & 0xFF);
 
  119   bytes[1] = 
static_cast<unsigned char>((v[0] >> 16) & 0xFF);
 
  120   bytes[2] = 
static_cast<unsigned char>((v[0] >>  8) & 0xFF);
 
  121   bytes[3] = 
static_cast<unsigned char>((v[0]      ) & 0xFF);
 
  122   bytes[4] = 
static_cast<unsigned char>((v[1] >> 24) & 0xFF);
 
  123   bytes[5] = 
static_cast<unsigned char>((v[1] >> 16) & 0xFF);
 
  124   bytes[6] = 
static_cast<unsigned char>((v[1] >>  8) & 0xFF);
 
  125   bytes[7] = 
static_cast<unsigned char>((v[1]      ) & 0xFF);
 
  126   for (
int i=0; i<8; ++i) {
 
  127     db.b[byte_order[i]] =  bytes[i];