#ifndef _TW_DATASIZES_H
#define _TW_DATASIZES_H

#ifndef _TW_TWAUTOCONF_H
# include <Tw/autoconf.h>
#endif

#if defined(TW_HAVE_LIMITS_H)
# include <limits.h> /* for CHAR_BIT and (U|S)?(CHAR|SHRT|INT)_(MIN|MAX) */
#endif

#ifdef TW_WORDS_BIGENDIAN
# define TW_IS_LITTLE_ENDIAN 0
# define TW_IS_BIG_ENDIAN    1
#else
# define TW_IS_LITTLE_ENDIAN 1
# define TW_IS_BIG_ENDIAN    0
#endif

#ifdef CHAR_BIT
# define TW_CHAR_BIT CHAR_BIT
#else
# define TW_CHAR_BIT 8 /* guess and hope... */
#endif

#define TW_MAXU(t)	((t)~(t)0)
#define TW_MINS(t)	((t)((t)1<<(TW_CHAR_BIT*sizeof(t)-1)))
#define TW_MAXS(t)	((t)~TW_MINS(t))


#define TW_SIZEOF_BYTE		TW_SIZEOF_CHAR
#define TW_SIZEOF_SBYTE		TW_SIZEOF_CHAR
#define TW_SIZEOF_DAT		TW_SIZEOF_SHORT
#define TW_SIZEOF_UDAT		TW_SIZEOF_SHORT
#define TW_SIZEOF_LDAT		TW_SIZEOF_INT
#define TW_SIZEOF_ULDAT		TW_SIZEOF_INT
#define TW_SIZEOF_TOBJ		TW_SIZEOF_INT
#define TW_SIZEOF_TOPAQUE	TW_SIZEOF_SIZE_T
#define TW_SIZEOF_TANY		TW_SIZEOF_SIZE_T
#define TW_SIZEOF_HWCOL		1
#define TW_SIZEOF_HWFONT	4
#define TW_SIZEOF_HWATTR	4


#ifdef UCHAR_MAX
# define TW_MAXBYTE	UCHAR_MAX
# define TW_MAXUDAT	USHRT_MAX
# define TW_MAXULDAT	UINT_MAX

# define TW_MINSBYTE	SCHAR_MIN
# define TW_MAXSBYTE	SCHAR_MAX
# define TW_MINDAT	SHRT_MIN
# define TW_MAXDAT	SHRT_MAX
# define TW_MINLDAT	INT_MIN
# define TW_MAXLDAT	INT_MAX
#else
# define TW_MAXBYTE	TW_MAXU(byte)
# define TW_MAXUDAT	TW_MAXU(udat)
# define TW_MAXULDAT	TW_MAXU(uldat)

# define TW_MINSBYTE	TW_MINS(sbyte)
# define TW_MAXSBYTE	TW_MAXS(sbyte)
# define TW_MINDAT	TW_MINS(dat)
# define TW_MAXDAT	TW_MAXS(dat)
# define TW_MINLDAT	TW_MINS(ldat)
# define TW_MAXLDAT	TW_MAXS(ldat)
#endif

#ifdef SIZE_MAX
# define TW_MAXTOBJ	TW_MAXULDAT
# define TW_MAXTOPAQUE	SIZE_MAX
# define TW_MAXTANY	SIZE_MAX
#else
# define TW_MAXTOBJ	TW_MAXULDAT
# define TW_MAXTOPAQUE	TW_MAXU(topaque)
# define TW_MAXTANY	TW_MAXU(tany)
#endif

#define TW_MAXWCOL      0xFF
#define TW_MAXWFONT     0xFFFFFFFF
#define TW_MAXWATTR     0xFFFFFFFF

#endif /* _TW_DATASIZES_H */
