#ifndef ISL_MULTI_H
 
#define ISL_MULTI_H
 
 
 
#include <isl/val_type.h>
 
#include <isl/space_type.h>
 
#include <isl/list.h>
 
#include <isl/set_type.h>
 
 
 
#if defined(__cplusplus)
 
extern "C" {
 
#endif
 
 
 
#define ISL_DECLARE_MULTI(BASE)                                         \
 
isl_ctx *isl_multi_##BASE##_get_ctx(                                    \
 
        __isl_keep isl_multi_##BASE *multi);                            \
 
__isl_export                                                            \
 
__isl_give isl_space *isl_multi_##BASE##_get_space(                     \
 
        __isl_keep isl_multi_##BASE *multi);                            \
 
__isl_give isl_space *isl_multi_##BASE##_get_domain_space(              \
 
        __isl_keep isl_multi_##BASE *multi);                            \
 
__isl_export                                                            \
 
__isl_give isl_##BASE##_list *isl_multi_##BASE##_get_list(              \
 
        __isl_keep isl_multi_##BASE *multi);                            \
 
__isl_constructor                                                       \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_from_##BASE##_list(     \
 
        __isl_take isl_space *space, __isl_take isl_##BASE##_list *list); \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_space_multi_##BASE(                    \
 
        __isl_take isl_space *space, __isl_take isl_##BASE##_list *list); \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_copy(                   \
 
        __isl_keep isl_multi_##BASE *multi);                            \
 
__isl_null isl_multi_##BASE *isl_multi_##BASE##_free(                   \
 
        __isl_take isl_multi_##BASE *multi);                            \
 
__isl_export                                                            \
 
isl_bool isl_multi_##BASE##_plain_is_equal(                             \
 
        __isl_keep isl_multi_##BASE *multi1,                            \
 
        __isl_keep isl_multi_##BASE *multi2);                           \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_reset_user(             \
 
        __isl_take isl_multi_##BASE *multi);                            \
 
__isl_export                                                            \
 
isl_size isl_multi_##BASE##_size(__isl_keep isl_multi_##BASE *multi);   \
 
__isl_export                                                            \
 
__isl_give isl_##BASE *isl_multi_##BASE##_get_at(                       \
 
        __isl_keep isl_multi_##BASE *multi, int pos);                   \
 
__isl_give isl_##BASE *isl_multi_##BASE##_get_##BASE(                   \
 
        __isl_keep isl_multi_##BASE *multi, int pos);                   \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_set_at(                 \
 
        __isl_take isl_multi_##BASE *multi, int pos,                    \
 
        __isl_take isl_##BASE *el);                                     \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_set_##BASE(             \
 
        __isl_take isl_multi_##BASE *multi, int pos,                    \
 
        __isl_take isl_##BASE *el);                                     \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_range_splice(           \
 
        __isl_take isl_multi_##BASE *multi1, unsigned pos,              \
 
        __isl_take isl_multi_##BASE *multi2);                           \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_flatten_range(          \
 
        __isl_take isl_multi_##BASE *multi);                            \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_flat_range_product(     \
 
        __isl_take isl_multi_##BASE *multi1,                            \
 
        __isl_take isl_multi_##BASE *multi2);                           \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_range_product(          \
 
        __isl_take isl_multi_##BASE *multi1,                            \
 
        __isl_take isl_multi_##BASE *multi2);                           \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_factor_range(           \
 
        __isl_take isl_multi_##BASE *multi);                            \
 
isl_bool isl_multi_##BASE##_range_is_wrapping(                          \
 
        __isl_keep isl_multi_##BASE *multi);                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_range_factor_domain(    \
 
        __isl_take isl_multi_##BASE *multi);                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_range_factor_range(     \
 
        __isl_take isl_multi_##BASE *multi);                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_align_params(           \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        __isl_take isl_space *model);                                   \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_from_range(             \
 
        __isl_take isl_multi_##BASE *multi);
 
 
 
#define ISL_DECLARE_MULTI_IDENTITY(BASE)                                \
 
__isl_overload                                                          \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_identity_multi_##BASE(  \
 
        __isl_take isl_multi_##BASE *multi);                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_identity(               \
 
        __isl_take isl_space *space);                                   \
 
__isl_overload                                                          \
 
__isl_give isl_multi_##BASE *                                           \
 
isl_multi_##BASE##_identity_on_domain_space(                            \
 
        __isl_take isl_space *space);                                   \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *                                           \
 
isl_space_identity_multi_##BASE##_on_domain(                            \
 
        __isl_take isl_space *space);
 
 
 
#define ISL_DECLARE_MULTI_CMP(BASE)                                     \
 
int isl_multi_##BASE##_plain_cmp(__isl_keep isl_multi_##BASE *multi1,   \
 
        __isl_keep isl_multi_##BASE *multi2);
 
 
 
#define ISL_DECLARE_MULTI_ARITH(BASE)                                   \
 
__isl_overload                                                          \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_val(              \
 
        __isl_take isl_multi_##BASE *multi, __isl_take isl_val *v);     \
 
__isl_overload                                                          \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_down_val(         \
 
        __isl_take isl_multi_##BASE *multi, __isl_take isl_val *v);     \
 
__isl_overload                                                          \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_multi_val(        \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        __isl_take isl_multi_val *mv);                                  \
 
__isl_overload                                                          \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_down_multi_val(   \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        __isl_take isl_multi_val *mv);                                  \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_mod_multi_val(          \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        __isl_take isl_multi_val *mv);                                  \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_add(                    \
 
        __isl_take isl_multi_##BASE *multi1,                            \
 
        __isl_take isl_multi_##BASE *multi2);                           \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_sub(                    \
 
        __isl_take isl_multi_##BASE *multi1,                            \
 
        __isl_take isl_multi_##BASE *multi2);                           \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_neg(                    \
 
        __isl_take isl_multi_##BASE *multi);
 
 
 
#define ISL_DECLARE_MULTI_MIN_MAX(BASE)                                 \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_min(                    \
 
        __isl_take isl_multi_##BASE *multi1,                            \
 
        __isl_take isl_multi_##BASE *multi2);                           \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_max(                    \
 
        __isl_take isl_multi_##BASE *multi1,                            \
 
        __isl_take isl_multi_##BASE *multi2);
 
 
 
#define ISL_DECLARE_MULTI_ADD_CONSTANT(BASE)                            \
 
__isl_overload                                                          \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_add_constant_val(       \
 
        __isl_take isl_multi_##BASE *mpa, __isl_take isl_val *v);       \
 
__isl_overload                                                          \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_add_constant_multi_val( \
 
        __isl_take isl_multi_##BASE *mpa, __isl_take isl_multi_val *mv);
 
 
 
#define ISL_DECLARE_MULTI_ZERO(BASE)                                    \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_zero(                   \
 
        __isl_take isl_space *space);                                   \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_space_zero_multi_##BASE(               \
 
        __isl_take isl_space *space);
 
 
 
#define ISL_DECLARE_MULTI_NAN(BASE)                                     \
 
__isl_export                                                            \
 
isl_bool isl_multi_##BASE##_involves_nan(                               \
 
        __isl_keep isl_multi_##BASE *multi);
 
 
 
#define ISL_DECLARE_MULTI_DROP_DIMS(BASE)                               \
 
isl_size isl_multi_##BASE##_dim(__isl_keep isl_multi_##BASE *multi,     \
 
        enum isl_dim_type type);                                        \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_drop_dims(              \
 
        __isl_take isl_multi_##BASE *multi, enum isl_dim_type type,     \
 
        unsigned first, unsigned n);
 
#define ISL_DECLARE_MULTI_DIMS(BASE)                                    \
 
ISL_DECLARE_MULTI_DROP_DIMS(BASE)                                       \
 
isl_bool isl_multi_##BASE##_involves_dims(                              \
 
        __isl_keep isl_multi_##BASE *multi, enum isl_dim_type type,     \
 
        unsigned first, unsigned n);                                    \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_insert_dims(            \
 
        __isl_take isl_multi_##BASE *multi, enum isl_dim_type type,     \
 
        unsigned first, unsigned n);                                    \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_add_dims(               \
 
        __isl_take isl_multi_##BASE *multi, enum isl_dim_type type,     \
 
        unsigned n);                                                    \
 
__isl_give isl_multi_##BASE *                                           \
 
isl_multi_##BASE##_project_domain_on_params(                            \
 
        __isl_take isl_multi_##BASE *multi);
 
 
 
#define ISL_DECLARE_MULTI_INSERT_DOMAIN(BASE)                           \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *                                           \
 
isl_multi_##BASE##_insert_domain(__isl_take isl_multi_##BASE *multi,    \
 
        __isl_take isl_space *domain);
 
 
 
#define ISL_DECLARE_MULTI_LOCALS(BASE)                                  \
 
__isl_export                                                            \
 
isl_bool isl_multi_##BASE##_involves_locals(                            \
 
        __isl_keep isl_multi_##BASE *multi);
 
 
 
#define ISL_DECLARE_MULTI_DIM_ID(BASE)                                  \
 
int isl_multi_##BASE##_find_dim_by_name(                                \
 
        __isl_keep isl_multi_##BASE *multi,                             \
 
        enum isl_dim_type type, const char *name);                      \
 
int isl_multi_##BASE##_find_dim_by_id(                                  \
 
        __isl_keep isl_multi_##BASE *multi, enum isl_dim_type type,     \
 
        __isl_keep isl_id *id);                                         \
 
__isl_give isl_id *isl_multi_##BASE##_get_dim_id(                       \
 
        __isl_keep isl_multi_##BASE *multi,                             \
 
        enum isl_dim_type type, unsigned pos);                          \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_set_dim_name(           \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        enum isl_dim_type type, unsigned pos, const char *s);           \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_set_dim_id(             \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);
 
 
 
#define ISL_DECLARE_MULTI_TUPLE_ID(BASE)                                \
 
const char *isl_multi_##BASE##_get_tuple_name(                          \
 
        __isl_keep isl_multi_##BASE *multi, enum isl_dim_type type);    \
 
__isl_export                                                            \
 
isl_bool isl_multi_##BASE##_has_range_tuple_id(                         \
 
        __isl_keep isl_multi_##BASE *multi);                            \
 
isl_bool isl_multi_##BASE##_has_tuple_id(                               \
 
        __isl_keep isl_multi_##BASE *multi, enum isl_dim_type type);    \
 
__isl_export                                                            \
 
__isl_give isl_id *isl_multi_##BASE##_get_range_tuple_id(               \
 
        __isl_keep isl_multi_##BASE *multi);                            \
 
__isl_give isl_id *isl_multi_##BASE##_get_tuple_id(                     \
 
        __isl_keep isl_multi_##BASE *multi, enum isl_dim_type type);    \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_set_tuple_name(         \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        enum isl_dim_type type, const char *s);                         \
 
__isl_overload                                                          \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_set_range_tuple_id(     \
 
        __isl_take isl_multi_##BASE *multi,  __isl_take isl_id *id);    \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_set_tuple_id(           \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        enum isl_dim_type type, __isl_take isl_id *id);                 \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_reset_range_tuple_id(   \
 
        __isl_take isl_multi_##BASE *multi);                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_reset_tuple_id(         \
 
        __isl_take isl_multi_##BASE *multi, enum isl_dim_type type);
 
 
 
#define ISL_DECLARE_MULTI_WITH_DOMAIN(BASE)                             \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_product(                \
 
        __isl_take isl_multi_##BASE *multi1,                            \
 
        __isl_take isl_multi_##BASE *multi2);                           \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_splice(                 \
 
        __isl_take isl_multi_##BASE *multi1, unsigned in_pos,           \
 
        unsigned out_pos, __isl_take isl_multi_##BASE *multi2);
 
 
 
#define ISL_DECLARE_MULTI_BIND_DOMAIN(BASE)                             \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *isl_multi_##BASE##_bind_domain(            \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        __isl_take isl_multi_id *tuple);                                \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *                                           \
 
isl_multi_##BASE##_bind_domain_wrapped_domain(                          \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        __isl_take isl_multi_id *tuple);
 
 
 
#define ISL_DECLARE_MULTI_UNBIND_PARAMS(BASE)                           \
 
__isl_export                                                            \
 
__isl_give isl_multi_##BASE *                                           \
 
isl_multi_##BASE##_unbind_params_insert_domain(                         \
 
        __isl_take isl_multi_##BASE *multi,                             \
 
        __isl_take isl_multi_id *domain);
 
 
 
#define ISL_DECLARE_MULTI_PARAM(BASE)                                   \
 
__isl_overload                                                          \
 
isl_bool isl_multi_##BASE##_involves_param_id(                          \
 
        __isl_keep isl_multi_##BASE *multi, __isl_keep isl_id *id);     \
 
__isl_overload                                                          \
 
isl_bool isl_multi_##BASE##_involves_param_id_list(                     \
 
        __isl_keep isl_multi_##BASE *multi,                             \
 
        __isl_keep isl_id_list *list);
 
 
 
#if defined(__cplusplus)
 
}
 
#endif
 
 
 
#endif