#ifndef FIXEDTYPES_H
#define FIXEDTYPES_H

// ----------------------------------------------------------------------
//
// FixedTypes.h
//
// Synopsis:  Define and provide the following fixed-size types:
//   Int1, Int2, Int4, Int8; UInt1, UInt2, UInt4, UInt8; Float4, Float8
//
//
// Requirements:  One of the following symbols must be #define'd BEFORE
//   #include-ing this file:
//
//   platform	op. sys.	compiler		symbol
//
//   DEC Alpha	OSF/1		g++ 2.7.2.3		OSF1_4_0_GPP_2_7_2_3 
//
//   IBM	AIX 4.1.4	xlC 3.1.4		AIX_4_1_4_XLC_3_1_4
//   		AIX 4.1.4	g++ 2.7.2.1		AIX_4_1_4_GPP_2_7_2_1
//
//   PC		Windows NT 4.0	Borland C++ 5.0		NT_4_0_BORLANDCPP_5_0
//		Windows NT 4.0	MS Visual C++ 4.0	NT_4_0_MSVCPP_4_0
//		Windows NT 4.0	MS Visual C++ 5.0	NT_4_0_MSVCPP_5_0
//		Linux 2.0	g++ 2.7.2.1		LINUX_2_0_GPP_2_7_2_1
//		Linux 2.0	KAI C++ 3.2		LINUX_2_0_KCC_3_2
//		Linux 2.0	KAI C++ 3.3		LINUX_2_0_KCC_3_3
//
//   SGI	IRIX 5.3	g++ 2.7.2.1		IRIX_5_3_GPP_2_7_2_1
//		IRIX 5.3	KAI C++ 3.2		IRIX_5_3_KCC_3_2
//		IRIX 6.2	g++ 2.7.2.1		IRIX_6_2_GPP_2_7_2_1
//		IRIX 6.2	Delta C++		IRIX_6_2_DCC
//		IRIX 6.2	OCC 2.19 (-32 switch)	IRIX_6_2_CC32_2_19
//		IRIX 6.2	OCC 2.19 (-64 switch)	IRIX_6_2_CC64_2_19
//		IRIX 6.2	KAI C++ 3.2		IRIX_6_2_KCC_3_2
//		IRIX 6.2	KAI C++ 3.3		IRIX_6_2_KCC_3_3
//
//   Sun	Solaris 2.4	SC 4.0			SOLARIS_2_4_SC_4_0
//      	Solaris 2.6	KAI C++ 3.2		SOLARIS_2_6_KCC_3_2
//
//
// Note:  other, more generic, symbols (e.g., IRIX) are also acceptable,
//   but are not recommended, as they are less specific and hence admit
//   the possibility of inaccuracy if used in an untested environment.
//   These generic symbols typically consist of the OS name, or the OS
//   name followed by the compiler name (separated by an underscore).
//
//
// History:
//   05-Feb-1997  WEB  Initial draft w/ native & gcc under IRIX
//   07-Feb-1997  WEB  Add Borland C++ 5.0 under NT 4.0
//   08-Feb-1997  WEB  Add AIX
//   11-Feb-1997  WEB  Add DCC & CC's under IRIX
//   14-Feb-1997  WEB  Restructure the testbed environment
//   18-Feb-1997  WEB  Add SC 4.0 under SOLARIS 2.4
//   21-Feb-1997  WEB  Add MicroSoft Visual C++ 4.0 under NT 4.0
//   16-Apr-1997  WEB  Code review by FPCLTF; add internal guard;
//     general issues re environment identification yet to be resolved
//   10-Sep-1997  WEB  Add gcc 2.7.2.1 under IRIX 6.2
//   26-Nov-1997  WEB  Merge into ZMftUtility package; add tests for
//     generic OS and OS-compiler combinations, keeping the previous
//     more-detailed version-number orientation, as well
//   02-Dec-1997  WEB  Made the #undef's conditional upon need; update
//     documentation; add KAI under LINUX & IRIX; other cleanup
//   14-Jan-1998  WEB  Add gcc 2.7.2.3 under OSF/1 (DEC Alpha) per
//     request of P Schemitz, Univ of Karlsruhe
//   02-Mar-1998  WEB  Version 2.0:  employ typedef's
//   14-Jan-1998  WEB  Add KAI 3.2 under SOLARIS 2.6 per Leo Michelotti
//   15-Jun-1998  WEB  Add namespace support
//   10-Nov-1998  WEB  Add KAI 3.3 under IRIX 6.2; remove IRIX4.0.5F
//   19-Feb-1999  WEB  Add generic OSF1; minor cleanups
//   10-Mar-2000  WEB  Add generic SunOS
//   23-Jun-2000  WEB  Add generic IRIX6, IRIX6_2, IRIX6_5
//
// ----------------------------------------------------------------------


#include "ZMutility/ZMenvironment.h"


ZM_BEGIN_NAMESPACE(zmfxt)	/*  namespace zmfxt  {  */


// ----------------------------------------------------------------------


// ----------
// Establish a code, if not already done, identifying our environment;
// this code may be updated later to reflect our true environment:
// ----------

#ifndef FIXED_TYPES_ENV
  #define FIXED_TYPES_ENV  (-1)
#endif  // FIXED_TYPES_ENV


// ----------
// Establish the most prevalent definitions for fixed-size types;
// these may be overridden and/or augmented as needed for the specific
// environment selected:
// ----------

    #define ZMftInt1    signed char
    #define ZMftInt2    signed short
    #define ZMftInt4    signed int

    #define ZMftUInt1   unsigned char
    #define ZMftUInt2   unsigned short
    #define ZMftUInt4   unsigned int

    #define ZMftFloat4  float
    #define ZMftFloat8  double


// ----------
// Override/augment the above definitions per the user-selected environment:
// ----------

#if (FIXED_TYPES_ENV == 1)          \
                                    \
|| defined( AIX                   ) \
|| defined( AIX_XLC               ) \
|| defined( AIX_4_1_4_XLC_3_1_4   ) \
|| defined( AIX_GPP               ) \
|| defined( AIX_4_1_4_GPP_2_7_2_1 ) \
                                    \
|| defined( NT                    ) \
|| defined( NT_BORLANDCPP         ) \
|| defined( NT_4_0_BORLANDCPP_5_0 ) \
|| defined( NT_MSVCPP             ) \
|| defined( NT_4_0_MSVCPP_4_0     ) \
|| defined( NT_4_0_MSVCPP_5_0     ) \
                                    \
|| defined( IRIX                  ) \
|| defined( IRIX5                 ) \
|| defined( IRIX6                 ) \
|| defined( IRIX6_2               ) \
|| defined( IRIX6_5               ) \
|| defined( IRIX_NATIVE_CC        ) \
|| defined( IRIX_GPP              ) \
|| defined( IRIX_5_3_GPP_2_7_2_1  ) \
|| defined( IRIX_KCC              ) \
|| defined( IRIX_5_3_KCC_3_2      ) \
|| defined( IRIX_6_2_GPP_2_7_2_1  ) \
|| defined( IRIX_DCC              ) \
|| defined( IRIX_6_2_DCC          ) \
|| defined( IRIX_CC32             ) \
|| defined( IRIX_6_2_CC32_2_19    ) \
|| defined( IRIX_6_2_KCC_3_2      ) \
|| defined( IRIX_6_2_KCC_3_3      ) \
                                    \
|| defined( LINUX                 ) \
|| defined( LINUX_GPP             ) \
|| defined( LINUX_2_0_GPP_2_7_2_1 ) \
|| defined( LINUX_KCC             ) \
|| defined( LINUX_2_0_KCC_3_2     ) \
                                    \
|| defined( OSF1                  ) \
|| defined( OSF1_4_0_GPP_2_7_2_3  ) \

    #ifdef  FIXED_TYPES_ENV
      #undef  FIXED_TYPES_ENV
    #endif  // FIXED_TYPES_ENV
    #define FIXED_TYPES_ENV  1

    // ----------
    // Just use the fixed-size type defaults (#define'd above) for
    //   Int1, Int2, Int4, UInt1, UInt2, UInt4, Float4, Float8
    // ----------

#elif (FIXED_TYPES_ENV == 2)        \
                                    \
|| defined( IRIX_CC64             ) \
|| defined( IRIX_6_2_CC64_2_19    ) \

    #ifdef  FIXED_TYPES_ENV
      #undef  FIXED_TYPES_ENV
    #endif  // FIXED_TYPES_ENV
    #define FIXED_TYPES_ENV  2

    // ----------
    // Augment the defaults (#define'd above):
    // ----------
    #define ZMftInt8     signed long
    #define ZMftUInt8    unsigned long
    #define ZMftFloat16  long double

#elif (FIXED_TYPES_ENV == 3)        \
                                    \
|| defined( SOLARIS               ) \
|| defined( SOLARIS_SC            ) \
|| defined( SOLARIS_2_4_SC_4_0    ) \
|| defined( SOLARIS_2_6_KCC_3_2   ) \
|| defined( SunOS                 ) \

    #ifdef  FIXED_TYPES_ENV
      #undef  FIXED_TYPES_ENV
    #endif  // FIXED_TYPES_ENV
    #define FIXED_TYPES_ENV  3

    // ----------
    // Augment the defaults (#define'd above):
    // ----------
    #define ZMftFloat16  long double

#else  // (FIXED_TYPES_ENV == (-1))

    // ----------
    // Unknown environment; notify user:
    // ----------
    #error "Must #define FIXED_TYPES_ENV to employ fixed-size types package"

#endif  // FIXED_TYPES_ENV


  // ----------
  // Set up signed integral types Int1, Int2, Int4, Int8:
  // ----------

  #ifdef ZMftInt1
    typedef ZMftInt1 Int1;
  #endif  // ZMftInt1

  #ifdef ZMftInt2
    typedef ZMftInt2 Int2;
  #endif  // ZMftInt2

  #ifdef ZMftInt4
    typedef ZMftInt4 Int4;
  #endif  // ZMftInt4

  #ifdef ZMftInt8
    typedef ZMftInt8 Int8;
  #endif  // ZMftInt8


  // ----------
  // Set up unsigned integral types UInt1, UInt2, UInt4, UInt8:
  // ----------

  #ifdef ZMftUInt1
    typedef ZMftUInt1 UInt1;
  #endif  // ZMftUInt1

  #ifdef ZMftUInt2
    typedef ZMftUInt2 UInt2;
  #endif  // ZMftUInt2

  #ifdef ZMftUInt4
    typedef ZMftUInt4 UInt4;
  #endif  // ZMftUInt4

  #ifdef ZMftUInt8
    typedef ZMftUInt8 UInt8;
  #endif  // ZMftUInt8


  // ----------
  // Set up floating-point types Float4, Float8, Float16:
  // ----------

  #ifdef ZMftFloat4
    typedef ZMftFloat4  Float4;
  #endif  // ZMftFloat4

  #ifdef ZMftFloat8
    typedef ZMftFloat8  Float8;
  #endif  // ZMftFloat8

  #ifdef ZMftFloat16
    typedef ZMftFloat16 Float16;
  #endif  // ZMftFloat16


ZM_END_NAMESPACE(zmfxt)		/*  }  // zmfxt  */


// ----------------------------------------------------------------------


#endif  // FIXEDTYPES_H
