#ifndef __DTSENDIAN_H
#define __DTSENDIAN_H

// Big endian support.  Note that one should not hold onto the 
// returned reference in the FIX_ENDIAN methods.  Return reference
// to a static variable so that one can use & operator on return value.

namespace DTS
{

   inline bool isLittleEndian()
   {
      int test = 1;
      char * t0 = (char*)&test;
      ++*t0;
      return (test==2);
   }
   inline void FIX_ENDIAN2(void * val)
   {
      char * ptr = (char*)val;
      char tmp = ptr[0];
      ptr[0] = ptr[1];
      ptr[1] = tmp;
   }

   inline void FIX_ENDIAN4(void * val)
   {
      char * ptr = (char*)val;
      char tmp = ptr[0];
      ptr[0] = ptr[3];
      ptr[3] = tmp;
      tmp = ptr[1];
      ptr[1] = ptr[2];
      ptr[2] = tmp;
   }

   inline short & FIX_ENDIAN(short val)
   {
      if (!isLittleEndian())
         FIX_ENDIAN2(&val);
      static short out;
      out = val;
      return out;
   }

   inline unsigned short & FIX_ENDIAN(unsigned short val)
   {
      return (unsigned short&)FIX_ENDIAN(short(val));
   }

   inline int & FIX_ENDIAN(int val)
   {
      if (!isLittleEndian())
         FIX_ENDIAN4(&val);
      static int out;
      out = val;
      return out;
   }

   inline unsigned int & FIX_ENDIAN(unsigned int val)
   {
      return (unsigned int&)FIX_ENDIAN( int(val));
   }

   inline float & FIX_ENDIAN(float val)
   {
      if (!isLittleEndian())
         FIX_ENDIAN4(&val);
      static float out;
      out = val;
      return out;
   }

#ifdef __APPLE__
   inline int & FIX_ENDIAN(size_t val)
   {
      static int out;
	  out = val;
      if (!isLittleEndian())
         FIX_ENDIAN4(&out);
      return out;
   }
#endif
}
#endif