#ifndef CLOOG_MATRIX_H
#define CLOOG_MATRIX_H
#if defined(__cplusplus)
extern "C"
  {
#endif

/* The CloogMatrix structure is equivalent to the PolyLib Matrix data structure
 * (see Wil93). This structure is devoted to represent a set of constraints.
 *
 * The whole matrix is stored in memory row after row at the p_Init address. p
 * is an array of pointers where p[i] points to the first element of the i^{th
 * row. NbRows and NbColumns are respectively the number of rows and columns of
 * the matrix. Each row corresponds to a constraint. The first element of each
 * row is an equality/inequality tag. The constraint is an equality p(x) = 0 if
 * the first element is 0, but it is an inequality p(x) \geq 0 if the first
 * element is 1. The next elements are the unknown coefficients, followed by
 * the parameter coefficients, then the constant term. For instance, the
 * following three constraints:
 *
 *     -i + m  = 0
 *     -j + n >= 0
 *  i + j - k >= 0
 *
 * would be represented by the following rows:
 *
 * # eq/in  i   j   k   m   n   cst
 *     0    0  -1   0   1   0    0
 *     1   -1   0   0   0   1    0
 *     1    1   1  -1   0   0    0
 *
 * To be able to provide different precision version (CLooG supports 32 bits,
 * 64 bits and arbitrary precision through the GMP library), the cloog_int_t
 * type depends on the configuration options (it may be long int for 32 bits
 * version, long long int for 64 bits version, and mpz_t for multiple precision
 * version). */

struct cloogmatrix
{ unsigned NbRows;    /* Number of rows. */
  unsigned NbColumns; /* Number of columns. */
  cloog_int_t ** p;         /* Array of pointers to the matrix rows. */
  cloog_int_t * p_Init;     /* Matrix rows contiguously in memory. */
};

typedef struct cloogmatrix CloogMatrix;

CloogMatrix *cloog_matrix_alloc (unsigned, unsigned);
void cloog_matrix_free (CloogMatrix *);
void cloog_matrix_print_structure(FILE *file, CloogMatrix *M,
		const char *prefix, const char *suffix);
CloogMatrix *cloog_matrix_read(FILE *input);
CloogMatrix *cloog_matrix_read_of_size(FILE *input,
		unsigned n_row, unsigned n_col);
void cloog_matrix_print(FILE*, CloogMatrix*);

#if defined(__cplusplus)
  }
#endif
#endif /* define _H */