/* ******************************************************************* */
/*                                                                     */
/*                         Applied Type System                         */
/*                                                                     */
/* ******************************************************************* */

/*
** ATS/Postiats - Unleashing the Potential of Types!
** Copyright (C) 2011-20?? Hongwei Xi, ATS Trustful Software, Inc.
** All rights reserved
**
** ATS is free software;  you can  redistribute it and/or modify it under
** the terms of  the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
** Free Software Foundation; either version 3, or (at  your  option)  any
** later version.
** 
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
** WARRANTY; without  even  the  implied  warranty  of MERCHANTABILITY or
** FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License
** for more details.
** 
** You  should  have  received  a  copy of the GNU General Public License
** along  with  ATS;  see the  file COPYING.  If not, please write to the
** Free Software Foundation,  51 Franklin Street, Fifth Floor, Boston, MA
** 02110-1301, USA.
*/

/* ****** ****** */

/*
(* Author: Hongwei Xi *)
(* Authoremail: hwxi AT cs DOT bu DOT edu *)
(* Start time: October, 2012 *)
*/

/* ****** ****** */

#ifndef PATS_CCOMP_TYPEDEFS_H
#define PATS_CCOMP_TYPEDEFS_H

/* ****** ****** */

/*
** HX:
** of indefinite size
*/
struct atstype_struct ;

/* ****** ****** */

typedef void atstype_void ;
typedef void atsvoid_t0ype ;

/* ****** ****** */

typedef int atstype_int ;
typedef unsigned int atstype_uint ;

typedef long int atstype_lint ;
typedef unsigned long int atstype_ulint ;

typedef long long int atstype_llint ;
typedef unsigned long long int atstype_ullint ;

typedef short int atstype_sint ;
typedef unsigned short int atstype_usint ;

/* ****** ****** */

typedef atstype_lint atstype_ssize ;
typedef atstype_ulint atstype_size ;

/* ****** ****** */
//
// HX: true/false: 1/0
//
typedef int atstype_bool ;
//
/* ****** ****** */

typedef unsigned char atstype_byte ;

/* ****** ****** */

typedef char atstype_char ;
typedef signed char atstype_schar ;
typedef unsigned char atstype_uchar ;

/* ****** ****** */

typedef char *atstype_string ;
typedef char *atstype_stropt ;
typedef char *atstype_strptr ;

/* ****** ****** */

typedef float atstype_float ;
typedef double atstype_double ;
typedef long double atstype_ldouble ;

/* ****** ****** */
/*
** HX: for pointers
*/
typedef void *atstype_ptr ;
typedef void *atstype_ptrk ;
/*
** HX: for references
*/
typedef void *atstype_ref ;
/*
** HX: for boxed values
*/
typedef void* atstype_boxed ;
/*
** HX: for [datconptr]
*/
typedef void* atstype_datconptr ;
/*
** HX: for [datcontyp]
*/
typedef void* atstype_datcontyp ;

/* ****** ****** */

#ifdef \
_ATS_CCOMP_EXCEPTION_NONE_
//
// HX: should a message be issued?
//
#else
//
typedef struct
{
  atstype_int exntag ;
  atstype_string exnmsg ;
} atstype_exncon ;
//
typedef
atstype_exncon *atstype_exnconptr ;
//
#endif // end of [_ATS_CCOMP_EXCEPTION_NONE_]

/* ****** ****** */
/*
** HX: for pointers to arrays
*/
typedef void* atstype_arrptr ;
/*
** HX: for arrays plus size info
*/
typedef
struct {
  atstype_arrptr ptr ; atstype_size size ;
} atstype_arrpsz ;

/* ****** ****** */

typedef void* atstype_funptr ;
typedef void* atstype_cloptr ;

/* ****** ****** */

#define atstkind_type(tk) tk
#define atstkind_t0ype(tk) tk

/* ****** ****** */
//
// HX-2014-09-16:
// making it unusable unless
// _ATS_ARRAY_FIELD is defined
//
#ifdef _ATS_ARRAY_FIELD_
#define atstyarr_field(fname) fname[]
#else
#define atstyarr_field(fname) atstyarr_field_undef(fname)
#endif // end of [_ATS_ARRAY_FIELD_]
//
/* ****** ****** */
//
// HX-2014-05:
// making it not usable!!!
//
#ifdef _ATSTYPE_VAR_SIZE_
// HX: it is set by the user
#else
#define _ATSTYPE_VAR_SIZE_ 0X10000
#endif // end of [#ifdef]
//
// HX-2014-05:
// for 8-bit or 16-bit march,
// _ATSTYPE_VAR_SIZE can be set to 0X100
//
typedef
struct{char _[_ATSTYPE_VAR_SIZE_];} atstype_var[0] ;
//
/* ****** ****** */

#define atstyvar_type(a) atstype_var

/* ****** ****** */

#define atstybox_type(hit) atstype_boxed

/* ****** ****** */

#define atstyclo_top struct{ void *cfun; }
#define atstyclo_type(flab) flab##__closure_t0ype

/* ****** ****** */

#define atsvararg_type(hit) ...

/* ****** ****** */

#define atsrefarg0_type(hit) hit
#define atsrefarg1_type(hit) atstype_ref

/* ****** ****** */

#endif /* PATS_CCOMP_TYPEDEFS_H */

/* ****** ****** */

/* end of [pats_ccomp_typedefs.h] */
