/// These are automatically generated checked C++ bindings for isl.
///
/// isl is a library for computing with integer sets and maps described by
/// Presburger formulas. On top of this, isl provides various tools for
/// polyhedral compilation, ranging from dependence analysis over scheduling
/// to AST generation.

#ifndef ISL_CPP_CHECKED
#define ISL_CPP_CHECKED

#include <isl/id.h>
#include <isl/space.h>
#include <isl/val.h>
#include <isl/aff.h>
#include <isl/set.h>
#include <isl/id.h>
#include <isl/map.h>
#include <isl/vec.h>
#include <isl/ilp.h>
#include <isl/union_set.h>
#include <isl/union_map.h>
#include <isl/flow.h>
#include <isl/schedule.h>
#include <isl/schedule_node.h>
#include <isl/ast_build.h>
#include <isl/fixed_box.h>
#include <isl/constraint.h>
#include <isl/polynomial.h>
#include <isl/mat.h>
#include <isl/fixed_box.h>
#include <stdio.h>
#include <stdlib.h>

#include <functional>
#include <string>

namespace isl {
inline namespace noexceptions {

#define ISLPP_STRINGIZE_(X) #X
#define ISLPP_STRINGIZE(X) ISLPP_STRINGIZE_(X)

#define ISLPP_ASSERT(test, message)                          \
  do {                                                       \
    if (test)                                                \
      break;                                                 \
    fputs("Assertion \"" #test "\" failed at " __FILE__      \
      ":" ISLPP_STRINGIZE(__LINE__) "\n  " message "\n",     \
      stderr);                                               \
    abort();                                                 \
  } while (0)

class boolean {
private:
  mutable bool checked = false;
  isl_bool val;

  friend boolean manage(isl_bool val);
  boolean(isl_bool val): val(val) {}
public:
  boolean()
      : val(isl_bool_error) {}
  ~boolean() {
    // ISLPP_ASSERT(checked, "IMPLEMENTATION ERROR: Unchecked state");
  }

  /* implicit */ boolean(bool val)
      : val(val ? isl_bool_true : isl_bool_false) {}

  bool is_error() const { checked = true; return val == isl_bool_error; }
  bool is_false() const { checked = true; return val == isl_bool_false; }
  bool is_true() const { checked = true; return val == isl_bool_true; }

  operator bool() const {
    // ISLPP_ASSERT(checked, "IMPLEMENTATION ERROR: Unchecked error state");
    ISLPP_ASSERT(!is_error(), "IMPLEMENTATION ERROR: Unhandled error state");
    return is_true();
  }

  boolean operator!() const {
    if (is_error())
      return *this;
    return !is_true();
  }
};

inline boolean manage(isl_bool val) {
  return boolean(val);
}

class ctx {
  isl_ctx *ptr;
public:
  /* implicit */ ctx(isl_ctx *ctx)
      : ptr(ctx) {}
  isl_ctx *release() {
    auto tmp = ptr;
    ptr = nullptr;
    return tmp;
  }
  isl_ctx *get() {
    return ptr;
  }
};

/* Class encapsulating an isl_stat value.
 */
class stat {
private:
	mutable bool checked = false;
	isl_stat val;

	friend stat manage(isl_stat val);
public:
	constexpr stat(isl_stat val) : val(val) {}
	static stat ok() {
		return stat(isl_stat_ok);
	}
	static stat error() {
		return stat(isl_stat_error);
	}
	stat() : val(isl_stat_error) {}
	~stat() {
		// ISLPP_ASSERT(checked, "IMPLEMENTATION ERROR: Unchecked state");
	}

	isl_stat release() {
		checked = true;
		return val;
	}

	bool is_error() const {
		checked = true;
		return val == isl_stat_error;
	}
	bool is_ok() const {
		checked = true;
		return val == isl_stat_ok;
	}
};


inline stat manage(isl_stat val)
{
	return stat(val);
}

enum class dim {
  cst = isl_dim_cst,
  param = isl_dim_param,
  in = isl_dim_in,
  out = isl_dim_out,
  set = isl_dim_set,
  div = isl_dim_div,
  all = isl_dim_all
};

}
} // namespace isl

namespace isl {

inline namespace noexceptions {

// forward declarations
class aff;
class aff_list;
class ast_build;
class ast_expr;
class ast_expr_list;
class ast_node;
class ast_node_list;
class basic_map;
class basic_map_list;
class basic_set;
class basic_set_list;
class constraint;
class constraint_list;
class fixed_box;
class id;
class id_list;
class id_to_ast_expr;
class local_space;
class map;
class map_list;
class mat;
class multi_aff;
class multi_id;
class multi_pw_aff;
class multi_union_pw_aff;
class multi_val;
class point;
class pw_aff;
class pw_aff_list;
class pw_multi_aff;
class pw_multi_aff_list;
class pw_qpolynomial;
class pw_qpolynomial_fold_list;
class pw_qpolynomial_list;
class qpolynomial;
class qpolynomial_list;
class schedule;
class schedule_constraints;
class schedule_node;
class set;
class set_list;
class space;
class term;
class union_access_info;
class union_flow;
class union_map;
class union_map_list;
class union_pw_aff;
class union_pw_aff_list;
class union_pw_multi_aff;
class union_pw_multi_aff_list;
class union_pw_qpolynomial;
class union_set;
class union_set_list;
class val;
class val_list;
class vec;

// declarations for isl::aff
inline aff manage(__isl_take isl_aff *ptr);
inline aff manage_copy(__isl_keep isl_aff *ptr);

class aff {
  friend inline aff manage(__isl_take isl_aff *ptr);
  friend inline aff manage_copy(__isl_keep isl_aff *ptr);

  isl_aff *ptr = nullptr;

  inline explicit aff(__isl_take isl_aff *ptr);

public:
  inline /* implicit */ aff();
  inline /* implicit */ aff(const aff &obj);
  inline explicit aff(ctx ctx, const std::string &str);
  inline explicit aff(local_space ls, val val);
  inline explicit aff(local_space ls);
  inline aff &operator=(aff obj);
  inline ~aff();
  inline __isl_give isl_aff *copy() const &;
  inline __isl_give isl_aff *copy() && = delete;
  inline __isl_keep isl_aff *get() const;
  inline __isl_give isl_aff *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline aff add(aff aff2) const;
  inline aff add_coefficient_si(isl::dim type, int pos, int v) const;
  inline aff add_coefficient_val(isl::dim type, int pos, val v) const;
  inline aff add_constant(val v) const;
  inline aff add_constant_num_si(int v) const;
  inline aff add_constant_si(int v) const;
  inline aff add_dims(isl::dim type, unsigned int n) const;
  inline aff align_params(space model) const;
  inline basic_set bind(id id) const;
  inline aff ceil() const;
  inline int coefficient_sgn(isl::dim type, int pos) const;
  inline isl_size dim(isl::dim type) const;
  inline aff div(aff aff2) const;
  inline aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline basic_set eq_basic_set(aff aff2) const;
  inline set eq_set(aff aff2) const;
  inline val eval(point pnt) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline aff floor() const;
  inline aff from_range() const;
  inline basic_set ge_basic_set(aff aff2) const;
  inline set ge_set(aff aff2) const;
  inline val get_coefficient_val(isl::dim type, int pos) const;
  inline val get_constant_val() const;
  inline val get_denominator_val() const;
  inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
  inline aff get_div(int pos) const;
  inline local_space get_domain_local_space() const;
  inline space get_domain_space() const;
  inline uint32_t get_hash() const;
  inline local_space get_local_space() const;
  inline space get_space() const;
  inline aff gist(set context) const;
  inline aff gist_params(set context) const;
  inline basic_set gt_basic_set(aff aff2) const;
  inline set gt_set(aff aff2) const;
  inline aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_locals() const;
  inline boolean is_cst() const;
  inline boolean is_nan() const;
  inline basic_set le_basic_set(aff aff2) const;
  inline set le_set(aff aff2) const;
  inline basic_set lt_basic_set(aff aff2) const;
  inline set lt_set(aff aff2) const;
  inline aff mod(val mod) const;
  inline aff move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  inline aff mul(aff aff2) const;
  static inline aff nan_on_domain(local_space ls);
  static inline aff nan_on_domain_space(space space);
  inline set ne_set(aff aff2) const;
  inline aff neg() const;
  inline basic_set neg_basic_set() const;
  static inline aff param_on_domain_space_id(space space, id id);
  inline boolean plain_is_equal(const aff &aff2) const;
  inline boolean plain_is_zero() const;
  inline aff project_domain_on_params() const;
  inline aff pullback(multi_aff ma) const;
  inline aff pullback_aff(aff aff2) const;
  inline aff scale(val v) const;
  inline aff scale_down(val v) const;
  inline aff scale_down_ui(unsigned int f) const;
  inline aff set_coefficient_si(isl::dim type, int pos, int v) const;
  inline aff set_coefficient_val(isl::dim type, int pos, val v) const;
  inline aff set_constant_si(int v) const;
  inline aff set_constant_val(val v) const;
  inline aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline aff set_tuple_id(isl::dim type, id id) const;
  inline aff sub(aff aff2) const;
  inline aff unbind_params_insert_domain(multi_id domain) const;
  static inline aff val_on_domain_space(space space, val val);
  static inline aff var_on_domain(local_space ls, isl::dim type, unsigned int pos);
  inline basic_set zero_basic_set() const;
  static inline aff zero_on_domain(space space);
};

// declarations for isl::aff_list
inline aff_list manage(__isl_take isl_aff_list *ptr);
inline aff_list manage_copy(__isl_keep isl_aff_list *ptr);

class aff_list {
  friend inline aff_list manage(__isl_take isl_aff_list *ptr);
  friend inline aff_list manage_copy(__isl_keep isl_aff_list *ptr);

  isl_aff_list *ptr = nullptr;

  inline explicit aff_list(__isl_take isl_aff_list *ptr);

public:
  inline /* implicit */ aff_list();
  inline /* implicit */ aff_list(const aff_list &obj);
  inline aff_list &operator=(aff_list obj);
  inline ~aff_list();
  inline __isl_give isl_aff_list *copy() const &;
  inline __isl_give isl_aff_list *copy() && = delete;
  inline __isl_keep isl_aff_list *get() const;
  inline __isl_give isl_aff_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline aff_list add(aff el) const;
  static inline aff_list alloc(ctx ctx, int n);
  inline aff_list clear() const;
  inline aff_list concat(aff_list list2) const;
  inline aff_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(aff)> &fn) const;
  static inline aff_list from_aff(aff el);
  inline aff get_aff(int index) const;
  inline aff get_at(int index) const;
  inline aff_list insert(unsigned int pos, aff el) const;
  inline isl_size n_aff() const;
  inline aff_list reverse() const;
  inline aff_list set_aff(int index, aff el) const;
  inline isl_size size() const;
  inline aff_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::ast_build
inline ast_build manage(__isl_take isl_ast_build *ptr);
inline ast_build manage_copy(__isl_keep isl_ast_build *ptr);

class ast_build {
  friend inline ast_build manage(__isl_take isl_ast_build *ptr);
  friend inline ast_build manage_copy(__isl_keep isl_ast_build *ptr);

  isl_ast_build *ptr = nullptr;

  inline explicit ast_build(__isl_take isl_ast_build *ptr);

public:
  inline /* implicit */ ast_build();
  inline /* implicit */ ast_build(const ast_build &obj);
  inline explicit ast_build(ctx ctx);
  inline ast_build &operator=(ast_build obj);
  inline ~ast_build();
  inline __isl_give isl_ast_build *copy() const &;
  inline __isl_give isl_ast_build *copy() && = delete;
  inline __isl_keep isl_ast_build *get() const;
  inline __isl_give isl_ast_build *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;

  inline ast_expr access_from(multi_pw_aff mpa) const;
  inline ast_expr access_from(pw_multi_aff pma) const;
  inline ast_node ast_from_schedule(union_map schedule) const;
  inline ast_expr call_from(multi_pw_aff mpa) const;
  inline ast_expr call_from(pw_multi_aff pma) const;
  inline ast_expr expr_from(pw_aff pa) const;
  inline ast_expr expr_from(set set) const;
  static inline ast_build from_context(set set);
  inline union_map get_schedule() const;
  inline space get_schedule_space() const;
  inline ast_node node_from(schedule schedule) const;
  inline ast_node node_from_schedule_map(union_map schedule) const;
  inline ast_build restrict(set set) const;
};

// declarations for isl::ast_expr
inline ast_expr manage(__isl_take isl_ast_expr *ptr);
inline ast_expr manage_copy(__isl_keep isl_ast_expr *ptr);

class ast_expr {
  friend inline ast_expr manage(__isl_take isl_ast_expr *ptr);
  friend inline ast_expr manage_copy(__isl_keep isl_ast_expr *ptr);

  isl_ast_expr *ptr = nullptr;

  inline explicit ast_expr(__isl_take isl_ast_expr *ptr);

public:
  inline /* implicit */ ast_expr();
  inline /* implicit */ ast_expr(const ast_expr &obj);
  inline ast_expr &operator=(ast_expr obj);
  inline ~ast_expr();
  inline __isl_give isl_ast_expr *copy() const &;
  inline __isl_give isl_ast_expr *copy() && = delete;
  inline __isl_keep isl_ast_expr *get() const;
  inline __isl_give isl_ast_expr *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline ast_expr access(ast_expr_list indices) const;
  inline ast_expr add(ast_expr expr2) const;
  inline ast_expr address_of() const;
  inline ast_expr call(ast_expr_list arguments) const;
  inline ast_expr div(ast_expr expr2) const;
  inline ast_expr eq(ast_expr expr2) const;
  static inline ast_expr from_id(id id);
  static inline ast_expr from_val(val v);
  inline ast_expr ge(ast_expr expr2) const;
  inline id get_id() const;
  inline ast_expr get_op_arg(int pos) const;
  inline isl_size get_op_n_arg() const;
  inline val get_val() const;
  inline ast_expr gt(ast_expr expr2) const;
  inline id id_get_id() const;
  inline val int_get_val() const;
  inline boolean is_equal(const ast_expr &expr2) const;
  inline ast_expr le(ast_expr expr2) const;
  inline ast_expr lt(ast_expr expr2) const;
  inline ast_expr mul(ast_expr expr2) const;
  inline ast_expr neg() const;
  inline ast_expr op_get_arg(int pos) const;
  inline isl_size op_get_n_arg() const;
  inline ast_expr pdiv_q(ast_expr expr2) const;
  inline ast_expr pdiv_r(ast_expr expr2) const;
  inline ast_expr set_op_arg(int pos, ast_expr arg) const;
  inline ast_expr sub(ast_expr expr2) const;
  inline ast_expr substitute_ids(id_to_ast_expr id2expr) const;
  inline std::string to_C_str() const;
};

// declarations for isl::ast_expr_list
inline ast_expr_list manage(__isl_take isl_ast_expr_list *ptr);
inline ast_expr_list manage_copy(__isl_keep isl_ast_expr_list *ptr);

class ast_expr_list {
  friend inline ast_expr_list manage(__isl_take isl_ast_expr_list *ptr);
  friend inline ast_expr_list manage_copy(__isl_keep isl_ast_expr_list *ptr);

  isl_ast_expr_list *ptr = nullptr;

  inline explicit ast_expr_list(__isl_take isl_ast_expr_list *ptr);

public:
  inline /* implicit */ ast_expr_list();
  inline /* implicit */ ast_expr_list(const ast_expr_list &obj);
  inline ast_expr_list &operator=(ast_expr_list obj);
  inline ~ast_expr_list();
  inline __isl_give isl_ast_expr_list *copy() const &;
  inline __isl_give isl_ast_expr_list *copy() && = delete;
  inline __isl_keep isl_ast_expr_list *get() const;
  inline __isl_give isl_ast_expr_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline ast_expr_list add(ast_expr el) const;
  static inline ast_expr_list alloc(ctx ctx, int n);
  inline ast_expr_list clear() const;
  inline ast_expr_list concat(ast_expr_list list2) const;
  inline ast_expr_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(ast_expr)> &fn) const;
  static inline ast_expr_list from_ast_expr(ast_expr el);
  inline ast_expr get_ast_expr(int index) const;
  inline ast_expr get_at(int index) const;
  inline ast_expr_list insert(unsigned int pos, ast_expr el) const;
  inline isl_size n_ast_expr() const;
  inline ast_expr_list reverse() const;
  inline ast_expr_list set_ast_expr(int index, ast_expr el) const;
  inline isl_size size() const;
  inline ast_expr_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::ast_node
inline ast_node manage(__isl_take isl_ast_node *ptr);
inline ast_node manage_copy(__isl_keep isl_ast_node *ptr);

class ast_node {
  friend inline ast_node manage(__isl_take isl_ast_node *ptr);
  friend inline ast_node manage_copy(__isl_keep isl_ast_node *ptr);

  isl_ast_node *ptr = nullptr;

  inline explicit ast_node(__isl_take isl_ast_node *ptr);

public:
  inline /* implicit */ ast_node();
  inline /* implicit */ ast_node(const ast_node &obj);
  inline ast_node &operator=(ast_node obj);
  inline ~ast_node();
  inline __isl_give isl_ast_node *copy() const &;
  inline __isl_give isl_ast_node *copy() && = delete;
  inline __isl_keep isl_ast_node *get() const;
  inline __isl_give isl_ast_node *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  static inline ast_node alloc_user(ast_expr expr);
  inline ast_node_list block_get_children() const;
  inline ast_node for_get_body() const;
  inline ast_expr for_get_cond() const;
  inline ast_expr for_get_inc() const;
  inline ast_expr for_get_init() const;
  inline ast_expr for_get_iterator() const;
  inline boolean for_is_degenerate() const;
  inline id get_annotation() const;
  inline ast_expr if_get_cond() const;
  inline ast_node if_get_else() const;
  inline ast_node if_get_else_node() const;
  inline ast_node if_get_then() const;
  inline ast_node if_get_then_node() const;
  inline boolean if_has_else() const;
  inline boolean if_has_else_node() const;
  inline id mark_get_id() const;
  inline ast_node mark_get_node() const;
  inline ast_node set_annotation(id annotation) const;
  inline std::string to_C_str() const;
  inline ast_expr user_get_expr() const;
};

// declarations for isl::ast_node_list
inline ast_node_list manage(__isl_take isl_ast_node_list *ptr);
inline ast_node_list manage_copy(__isl_keep isl_ast_node_list *ptr);

class ast_node_list {
  friend inline ast_node_list manage(__isl_take isl_ast_node_list *ptr);
  friend inline ast_node_list manage_copy(__isl_keep isl_ast_node_list *ptr);

  isl_ast_node_list *ptr = nullptr;

  inline explicit ast_node_list(__isl_take isl_ast_node_list *ptr);

public:
  inline /* implicit */ ast_node_list();
  inline /* implicit */ ast_node_list(const ast_node_list &obj);
  inline ast_node_list &operator=(ast_node_list obj);
  inline ~ast_node_list();
  inline __isl_give isl_ast_node_list *copy() const &;
  inline __isl_give isl_ast_node_list *copy() && = delete;
  inline __isl_keep isl_ast_node_list *get() const;
  inline __isl_give isl_ast_node_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline ast_node_list add(ast_node el) const;
  static inline ast_node_list alloc(ctx ctx, int n);
  inline ast_node_list clear() const;
  inline ast_node_list concat(ast_node_list list2) const;
  inline ast_node_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(ast_node)> &fn) const;
  static inline ast_node_list from_ast_node(ast_node el);
  inline ast_node get_ast_node(int index) const;
  inline ast_node get_at(int index) const;
  inline ast_node_list insert(unsigned int pos, ast_node el) const;
  inline isl_size n_ast_node() const;
  inline ast_node_list reverse() const;
  inline ast_node_list set_ast_node(int index, ast_node el) const;
  inline isl_size size() const;
  inline ast_node_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::basic_map
inline basic_map manage(__isl_take isl_basic_map *ptr);
inline basic_map manage_copy(__isl_keep isl_basic_map *ptr);

class basic_map {
  friend inline basic_map manage(__isl_take isl_basic_map *ptr);
  friend inline basic_map manage_copy(__isl_keep isl_basic_map *ptr);

  isl_basic_map *ptr = nullptr;

  inline explicit basic_map(__isl_take isl_basic_map *ptr);

public:
  inline /* implicit */ basic_map();
  inline /* implicit */ basic_map(const basic_map &obj);
  inline explicit basic_map(ctx ctx, const std::string &str);
  inline basic_map &operator=(basic_map obj);
  inline ~basic_map();
  inline __isl_give isl_basic_map *copy() const &;
  inline __isl_give isl_basic_map *copy() && = delete;
  inline __isl_keep isl_basic_map *get() const;
  inline __isl_give isl_basic_map *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline basic_map add_constraint(constraint constraint) const;
  inline basic_map add_dims(isl::dim type, unsigned int n) const;
  inline basic_map affine_hull() const;
  inline basic_map align_params(space model) const;
  inline basic_map apply_domain(basic_map bmap2) const;
  inline basic_map apply_range(basic_map bmap2) const;
  inline boolean can_curry() const;
  inline boolean can_uncurry() const;
  inline boolean can_zip() const;
  inline basic_map curry() const;
  inline basic_set deltas() const;
  inline basic_map deltas_map() const;
  inline basic_map detect_equalities() const;
  inline isl_size dim(isl::dim type) const;
  inline basic_set domain() const;
  inline basic_map domain_map() const;
  inline basic_map domain_product(basic_map bmap2) const;
  inline basic_map drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline basic_map drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline basic_map drop_unused_params() const;
  inline basic_map eliminate(isl::dim type, unsigned int first, unsigned int n) const;
  static inline basic_map empty(space space);
  static inline basic_map equal(space space, unsigned int n_equal);
  inline mat equalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4, isl::dim c5) const;
  inline basic_map equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline basic_map fix_si(isl::dim type, unsigned int pos, int value) const;
  inline basic_map fix_val(isl::dim type, unsigned int pos, val v) const;
  inline basic_map flat_product(basic_map bmap2) const;
  inline basic_map flat_range_product(basic_map bmap2) const;
  inline basic_map flatten() const;
  inline basic_map flatten_domain() const;
  inline basic_map flatten_range() const;
  inline stat foreach_constraint(const std::function<stat(constraint)> &fn) const;
  static inline basic_map from_aff(aff aff);
  static inline basic_map from_aff_list(space domain_space, aff_list list);
  static inline basic_map from_constraint(constraint constraint);
  static inline basic_map from_domain(basic_set bset);
  static inline basic_map from_domain_and_range(basic_set domain, basic_set range);
  static inline basic_map from_multi_aff(multi_aff maff);
  static inline basic_map from_qpolynomial(qpolynomial qp);
  static inline basic_map from_range(basic_set bset);
  inline constraint_list get_constraint_list() const;
  inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
  inline aff get_div(int pos) const;
  inline local_space get_local_space() const;
  inline space get_space() const;
  inline std::string get_tuple_name(isl::dim type) const;
  inline basic_map gist(basic_map context) const;
  inline basic_map gist_domain(basic_set context) const;
  inline boolean has_dim_id(isl::dim type, unsigned int pos) const;
  static inline basic_map identity(space space);
  inline boolean image_is_bounded() const;
  inline mat inequalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4, isl::dim c5) const;
  inline basic_map insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
  inline basic_map intersect(basic_map bmap2) const;
  inline basic_map intersect_domain(basic_set bset) const;
  inline basic_map intersect_range(basic_set bset) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean is_disjoint(const basic_map &bmap2) const;
  inline boolean is_empty() const;
  inline boolean is_equal(const basic_map &bmap2) const;
  inline boolean is_rational() const;
  inline boolean is_single_valued() const;
  inline boolean is_strict_subset(const basic_map &bmap2) const;
  inline boolean is_subset(const basic_map &bmap2) const;
  inline boolean is_universe() const;
  static inline basic_map less_at(space space, unsigned int pos);
  inline map lexmax() const;
  inline map lexmin() const;
  inline pw_multi_aff lexmin_pw_multi_aff() const;
  inline basic_map lower_bound_si(isl::dim type, unsigned int pos, int value) const;
  static inline basic_map more_at(space space, unsigned int pos);
  inline basic_map move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  inline isl_size n_constraint() const;
  static inline basic_map nat_universe(space space);
  inline basic_map neg() const;
  inline basic_map order_ge(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
  inline basic_map order_gt(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
  inline val plain_get_val_if_fixed(isl::dim type, unsigned int pos) const;
  inline boolean plain_is_empty() const;
  inline boolean plain_is_universe() const;
  inline basic_map preimage_domain_multi_aff(multi_aff ma) const;
  inline basic_map preimage_range_multi_aff(multi_aff ma) const;
  inline basic_map product(basic_map bmap2) const;
  inline basic_map project_out(isl::dim type, unsigned int first, unsigned int n) const;
  inline basic_set range() const;
  inline basic_map range_map() const;
  inline basic_map range_product(basic_map bmap2) const;
  inline basic_map remove_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline basic_map remove_divs() const;
  inline basic_map remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline basic_map remove_redundancies() const;
  inline basic_map reverse() const;
  inline basic_map sample() const;
  inline basic_map set_tuple_id(isl::dim type, id id) const;
  inline basic_map set_tuple_name(isl::dim type, const std::string &s) const;
  inline basic_map sum(basic_map bmap2) const;
  inline basic_map uncurry() const;
  inline map unite(basic_map bmap2) const;
  static inline basic_map universe(space space);
  inline basic_map upper_bound_si(isl::dim type, unsigned int pos, int value) const;
  inline basic_set wrap() const;
  inline basic_map zip() const;
};

// declarations for isl::basic_map_list
inline basic_map_list manage(__isl_take isl_basic_map_list *ptr);
inline basic_map_list manage_copy(__isl_keep isl_basic_map_list *ptr);

class basic_map_list {
  friend inline basic_map_list manage(__isl_take isl_basic_map_list *ptr);
  friend inline basic_map_list manage_copy(__isl_keep isl_basic_map_list *ptr);

  isl_basic_map_list *ptr = nullptr;

  inline explicit basic_map_list(__isl_take isl_basic_map_list *ptr);

public:
  inline /* implicit */ basic_map_list();
  inline /* implicit */ basic_map_list(const basic_map_list &obj);
  inline basic_map_list &operator=(basic_map_list obj);
  inline ~basic_map_list();
  inline __isl_give isl_basic_map_list *copy() const &;
  inline __isl_give isl_basic_map_list *copy() && = delete;
  inline __isl_keep isl_basic_map_list *get() const;
  inline __isl_give isl_basic_map_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline basic_map_list add(basic_map el) const;
  static inline basic_map_list alloc(ctx ctx, int n);
  inline basic_map_list clear() const;
  inline basic_map_list concat(basic_map_list list2) const;
  inline basic_map_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(basic_map)> &fn) const;
  static inline basic_map_list from_basic_map(basic_map el);
  inline basic_map get_at(int index) const;
  inline basic_map get_basic_map(int index) const;
  inline basic_map_list insert(unsigned int pos, basic_map el) const;
  inline isl_size n_basic_map() const;
  inline basic_map_list reverse() const;
  inline basic_map_list set_basic_map(int index, basic_map el) const;
  inline isl_size size() const;
  inline basic_map_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::basic_set
inline basic_set manage(__isl_take isl_basic_set *ptr);
inline basic_set manage_copy(__isl_keep isl_basic_set *ptr);

class basic_set {
  friend inline basic_set manage(__isl_take isl_basic_set *ptr);
  friend inline basic_set manage_copy(__isl_keep isl_basic_set *ptr);

  isl_basic_set *ptr = nullptr;

  inline explicit basic_set(__isl_take isl_basic_set *ptr);

public:
  inline /* implicit */ basic_set();
  inline /* implicit */ basic_set(const basic_set &obj);
  inline /* implicit */ basic_set(point pnt);
  inline explicit basic_set(ctx ctx, const std::string &str);
  inline basic_set &operator=(basic_set obj);
  inline ~basic_set();
  inline __isl_give isl_basic_set *copy() const &;
  inline __isl_give isl_basic_set *copy() && = delete;
  inline __isl_keep isl_basic_set *get() const;
  inline __isl_give isl_basic_set *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline basic_set affine_hull() const;
  inline basic_set align_params(space model) const;
  inline basic_set apply(basic_map bmap) const;
  static inline basic_set box_from_points(point pnt1, point pnt2);
  inline basic_set coefficients() const;
  inline basic_set detect_equalities() const;
  inline isl_size dim(isl::dim type) const;
  inline val dim_max_val(int pos) const;
  inline basic_set drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline basic_set drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline basic_set drop_unused_params() const;
  inline basic_set eliminate(isl::dim type, unsigned int first, unsigned int n) const;
  static inline basic_set empty(space space);
  inline mat equalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4) const;
  inline basic_set fix_si(isl::dim type, unsigned int pos, int value) const;
  inline basic_set fix_val(isl::dim type, unsigned int pos, val v) const;
  inline basic_set flat_product(basic_set bset2) const;
  inline basic_set flatten() const;
  inline stat foreach_bound_pair(isl::dim type, unsigned int pos, const std::function<stat(constraint, constraint, basic_set)> &fn) const;
  inline stat foreach_constraint(const std::function<stat(constraint)> &fn) const;
  static inline basic_set from_constraint(constraint constraint);
  static inline basic_set from_multi_aff(multi_aff ma);
  inline basic_set from_params() const;
  inline constraint_list get_constraint_list() const;
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
  inline aff get_div(int pos) const;
  inline local_space get_local_space() const;
  inline space get_space() const;
  inline std::string get_tuple_name() const;
  inline basic_set gist(basic_set context) const;
  inline mat inequalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4) const;
  inline basic_set insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
  inline basic_set intersect(basic_set bset2) const;
  inline basic_set intersect_params(basic_set bset2) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean is_bounded() const;
  inline boolean is_disjoint(const basic_set &bset2) const;
  inline boolean is_empty() const;
  inline boolean is_equal(const basic_set &bset2) const;
  inline int is_rational() const;
  inline boolean is_subset(const basic_set &bset2) const;
  inline boolean is_universe() const;
  inline boolean is_wrapping() const;
  inline set lexmax() const;
  inline set lexmin() const;
  inline basic_set lower_bound_val(isl::dim type, unsigned int pos, val value) const;
  inline val max_val(const aff &obj) const;
  inline basic_set move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  inline isl_size n_constraint() const;
  inline isl_size n_dim() const;
  static inline basic_set nat_universe(space space);
  inline basic_set neg() const;
  inline basic_set params() const;
  inline boolean plain_is_empty() const;
  inline boolean plain_is_equal(const basic_set &bset2) const;
  inline boolean plain_is_universe() const;
  static inline basic_set positive_orthant(space space);
  inline basic_set preimage_multi_aff(multi_aff ma) const;
  inline basic_set project_out(isl::dim type, unsigned int first, unsigned int n) const;
  inline mat reduced_basis() const;
  inline basic_set remove_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline basic_set remove_divs() const;
  inline basic_set remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline basic_set remove_redundancies() const;
  inline basic_set remove_unknown_divs() const;
  inline basic_set sample() const;
  inline point sample_point() const;
  inline basic_set set_tuple_id(id id) const;
  inline basic_set set_tuple_name(const std::string &s) const;
  inline basic_set solutions() const;
  inline set unite(basic_set bset2) const;
  static inline basic_set universe(space space);
  inline basic_map unwrap() const;
  inline basic_set upper_bound_val(isl::dim type, unsigned int pos, val value) const;
};

// declarations for isl::basic_set_list
inline basic_set_list manage(__isl_take isl_basic_set_list *ptr);
inline basic_set_list manage_copy(__isl_keep isl_basic_set_list *ptr);

class basic_set_list {
  friend inline basic_set_list manage(__isl_take isl_basic_set_list *ptr);
  friend inline basic_set_list manage_copy(__isl_keep isl_basic_set_list *ptr);

  isl_basic_set_list *ptr = nullptr;

  inline explicit basic_set_list(__isl_take isl_basic_set_list *ptr);

public:
  inline /* implicit */ basic_set_list();
  inline /* implicit */ basic_set_list(const basic_set_list &obj);
  inline basic_set_list &operator=(basic_set_list obj);
  inline ~basic_set_list();
  inline __isl_give isl_basic_set_list *copy() const &;
  inline __isl_give isl_basic_set_list *copy() && = delete;
  inline __isl_keep isl_basic_set_list *get() const;
  inline __isl_give isl_basic_set_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline basic_set_list add(basic_set el) const;
  static inline basic_set_list alloc(ctx ctx, int n);
  inline basic_set_list clear() const;
  inline basic_set_list coefficients() const;
  inline basic_set_list concat(basic_set_list list2) const;
  inline basic_set_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(basic_set)> &fn) const;
  static inline basic_set_list from_basic_set(basic_set el);
  inline basic_set get_at(int index) const;
  inline basic_set get_basic_set(int index) const;
  inline basic_set_list insert(unsigned int pos, basic_set el) const;
  inline isl_size n_basic_set() const;
  inline basic_set_list reverse() const;
  inline basic_set_list set_basic_set(int index, basic_set el) const;
  inline isl_size size() const;
  inline basic_set_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::constraint
inline constraint manage(__isl_take isl_constraint *ptr);
inline constraint manage_copy(__isl_keep isl_constraint *ptr);

class constraint {
  friend inline constraint manage(__isl_take isl_constraint *ptr);
  friend inline constraint manage_copy(__isl_keep isl_constraint *ptr);

  isl_constraint *ptr = nullptr;

  inline explicit constraint(__isl_take isl_constraint *ptr);

public:
  inline /* implicit */ constraint();
  inline /* implicit */ constraint(const constraint &obj);
  inline constraint &operator=(constraint obj);
  inline ~constraint();
  inline __isl_give isl_constraint *copy() const &;
  inline __isl_give isl_constraint *copy() && = delete;
  inline __isl_keep isl_constraint *get() const;
  inline __isl_give isl_constraint *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  static inline constraint alloc_equality(local_space ls);
  static inline constraint alloc_inequality(local_space ls);
  inline int cmp_last_non_zero(const constraint &c2) const;
  inline aff get_aff() const;
  inline aff get_bound(isl::dim type, int pos) const;
  inline val get_coefficient_val(isl::dim type, int pos) const;
  inline val get_constant_val() const;
  inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
  inline aff get_div(int pos) const;
  inline local_space get_local_space() const;
  inline space get_space() const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean is_div_constraint() const;
  inline boolean is_lower_bound(isl::dim type, unsigned int pos) const;
  inline boolean is_upper_bound(isl::dim type, unsigned int pos) const;
  inline int plain_cmp(const constraint &c2) const;
  inline constraint set_coefficient_si(isl::dim type, int pos, int v) const;
  inline constraint set_coefficient_val(isl::dim type, int pos, val v) const;
  inline constraint set_constant_si(int v) const;
  inline constraint set_constant_val(val v) const;
};

// declarations for isl::constraint_list
inline constraint_list manage(__isl_take isl_constraint_list *ptr);
inline constraint_list manage_copy(__isl_keep isl_constraint_list *ptr);

class constraint_list {
  friend inline constraint_list manage(__isl_take isl_constraint_list *ptr);
  friend inline constraint_list manage_copy(__isl_keep isl_constraint_list *ptr);

  isl_constraint_list *ptr = nullptr;

  inline explicit constraint_list(__isl_take isl_constraint_list *ptr);

public:
  inline /* implicit */ constraint_list();
  inline /* implicit */ constraint_list(const constraint_list &obj);
  inline constraint_list &operator=(constraint_list obj);
  inline ~constraint_list();
  inline __isl_give isl_constraint_list *copy() const &;
  inline __isl_give isl_constraint_list *copy() && = delete;
  inline __isl_keep isl_constraint_list *get() const;
  inline __isl_give isl_constraint_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline constraint_list add(constraint el) const;
  static inline constraint_list alloc(ctx ctx, int n);
  inline constraint_list clear() const;
  inline constraint_list concat(constraint_list list2) const;
  inline constraint_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(constraint)> &fn) const;
  static inline constraint_list from_constraint(constraint el);
  inline constraint get_at(int index) const;
  inline constraint get_constraint(int index) const;
  inline constraint_list insert(unsigned int pos, constraint el) const;
  inline isl_size n_constraint() const;
  inline constraint_list reverse() const;
  inline constraint_list set_constraint(int index, constraint el) const;
  inline isl_size size() const;
  inline constraint_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::fixed_box
inline fixed_box manage(__isl_take isl_fixed_box *ptr);
inline fixed_box manage_copy(__isl_keep isl_fixed_box *ptr);

class fixed_box {
  friend inline fixed_box manage(__isl_take isl_fixed_box *ptr);
  friend inline fixed_box manage_copy(__isl_keep isl_fixed_box *ptr);

  isl_fixed_box *ptr = nullptr;

  inline explicit fixed_box(__isl_take isl_fixed_box *ptr);

public:
  inline /* implicit */ fixed_box();
  inline /* implicit */ fixed_box(const fixed_box &obj);
  inline fixed_box &operator=(fixed_box obj);
  inline ~fixed_box();
  inline __isl_give isl_fixed_box *copy() const &;
  inline __isl_give isl_fixed_box *copy() && = delete;
  inline __isl_keep isl_fixed_box *get() const;
  inline __isl_give isl_fixed_box *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline multi_aff get_offset() const;
  inline multi_val get_size() const;
  inline space get_space() const;
  inline boolean is_valid() const;
};

// declarations for isl::id
inline id manage(__isl_take isl_id *ptr);
inline id manage_copy(__isl_keep isl_id *ptr);

class id {
  friend inline id manage(__isl_take isl_id *ptr);
  friend inline id manage_copy(__isl_keep isl_id *ptr);

  isl_id *ptr = nullptr;

  inline explicit id(__isl_take isl_id *ptr);

public:
  inline /* implicit */ id();
  inline /* implicit */ id(const id &obj);
  inline explicit id(ctx ctx, const std::string &str);
  inline id &operator=(id obj);
  inline ~id();
  inline __isl_give isl_id *copy() const &;
  inline __isl_give isl_id *copy() && = delete;
  inline __isl_keep isl_id *get() const;
  inline __isl_give isl_id *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  static inline id alloc(ctx ctx, const std::string &name, void * user);
  inline uint32_t get_hash() const;
  inline std::string get_name() const;
  inline void * get_user() const;
};

// declarations for isl::id_list
inline id_list manage(__isl_take isl_id_list *ptr);
inline id_list manage_copy(__isl_keep isl_id_list *ptr);

class id_list {
  friend inline id_list manage(__isl_take isl_id_list *ptr);
  friend inline id_list manage_copy(__isl_keep isl_id_list *ptr);

  isl_id_list *ptr = nullptr;

  inline explicit id_list(__isl_take isl_id_list *ptr);

public:
  inline /* implicit */ id_list();
  inline /* implicit */ id_list(const id_list &obj);
  inline id_list &operator=(id_list obj);
  inline ~id_list();
  inline __isl_give isl_id_list *copy() const &;
  inline __isl_give isl_id_list *copy() && = delete;
  inline __isl_keep isl_id_list *get() const;
  inline __isl_give isl_id_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline id_list add(id el) const;
  static inline id_list alloc(ctx ctx, int n);
  inline id_list clear() const;
  inline id_list concat(id_list list2) const;
  inline id_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(id)> &fn) const;
  static inline id_list from_id(id el);
  inline id get_at(int index) const;
  inline id get_id(int index) const;
  inline id_list insert(unsigned int pos, id el) const;
  inline isl_size n_id() const;
  inline id_list reverse() const;
  inline id_list set_id(int index, id el) const;
  inline isl_size size() const;
  inline id_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::id_to_ast_expr
inline id_to_ast_expr manage(__isl_take isl_id_to_ast_expr *ptr);
inline id_to_ast_expr manage_copy(__isl_keep isl_id_to_ast_expr *ptr);

class id_to_ast_expr {
  friend inline id_to_ast_expr manage(__isl_take isl_id_to_ast_expr *ptr);
  friend inline id_to_ast_expr manage_copy(__isl_keep isl_id_to_ast_expr *ptr);

  isl_id_to_ast_expr *ptr = nullptr;

  inline explicit id_to_ast_expr(__isl_take isl_id_to_ast_expr *ptr);

public:
  inline /* implicit */ id_to_ast_expr();
  inline /* implicit */ id_to_ast_expr(const id_to_ast_expr &obj);
  inline id_to_ast_expr &operator=(id_to_ast_expr obj);
  inline ~id_to_ast_expr();
  inline __isl_give isl_id_to_ast_expr *copy() const &;
  inline __isl_give isl_id_to_ast_expr *copy() && = delete;
  inline __isl_keep isl_id_to_ast_expr *get() const;
  inline __isl_give isl_id_to_ast_expr *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  static inline id_to_ast_expr alloc(ctx ctx, int min_size);
  inline id_to_ast_expr drop(id key) const;
  inline stat foreach(const std::function<stat(id, ast_expr)> &fn) const;
  inline ast_expr get(id key) const;
  inline boolean has(const id &key) const;
  inline id_to_ast_expr set(id key, ast_expr val) const;
};

// declarations for isl::local_space
inline local_space manage(__isl_take isl_local_space *ptr);
inline local_space manage_copy(__isl_keep isl_local_space *ptr);

class local_space {
  friend inline local_space manage(__isl_take isl_local_space *ptr);
  friend inline local_space manage_copy(__isl_keep isl_local_space *ptr);

  isl_local_space *ptr = nullptr;

  inline explicit local_space(__isl_take isl_local_space *ptr);

public:
  inline /* implicit */ local_space();
  inline /* implicit */ local_space(const local_space &obj);
  inline explicit local_space(space space);
  inline local_space &operator=(local_space obj);
  inline ~local_space();
  inline __isl_give isl_local_space *copy() const &;
  inline __isl_give isl_local_space *copy() && = delete;
  inline __isl_keep isl_local_space *get() const;
  inline __isl_give isl_local_space *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline local_space add_dims(isl::dim type, unsigned int n) const;
  inline isl_size dim(isl::dim type) const;
  inline local_space domain() const;
  inline local_space drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline local_space flatten_domain() const;
  inline local_space flatten_range() const;
  inline local_space from_domain() const;
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
  inline aff get_div(int pos) const;
  inline space get_space() const;
  inline boolean has_dim_id(isl::dim type, unsigned int pos) const;
  inline boolean has_dim_name(isl::dim type, unsigned int pos) const;
  inline local_space insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline local_space intersect(local_space ls2) const;
  inline boolean is_equal(const local_space &ls2) const;
  inline boolean is_params() const;
  inline boolean is_set() const;
  inline local_space range() const;
  inline local_space set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline local_space set_from_params() const;
  inline local_space set_tuple_id(isl::dim type, id id) const;
  inline local_space wrap() const;
};

// declarations for isl::map
inline map manage(__isl_take isl_map *ptr);
inline map manage_copy(__isl_keep isl_map *ptr);

class map {
  friend inline map manage(__isl_take isl_map *ptr);
  friend inline map manage_copy(__isl_keep isl_map *ptr);

  isl_map *ptr = nullptr;

  inline explicit map(__isl_take isl_map *ptr);

public:
  inline /* implicit */ map();
  inline /* implicit */ map(const map &obj);
  inline /* implicit */ map(basic_map bmap);
  inline explicit map(ctx ctx, const std::string &str);
  inline map &operator=(map obj);
  inline ~map();
  inline __isl_give isl_map *copy() const &;
  inline __isl_give isl_map *copy() && = delete;
  inline __isl_keep isl_map *get() const;
  inline __isl_give isl_map *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline map add_constraint(constraint constraint) const;
  inline map add_dims(isl::dim type, unsigned int n) const;
  inline basic_map affine_hull() const;
  inline map align_params(space model) const;
  inline map apply_domain(map map2) const;
  inline map apply_range(map map2) const;
  inline set bind_domain(multi_id tuple) const;
  inline set bind_range(multi_id tuple) const;
  inline boolean can_curry() const;
  inline boolean can_range_curry() const;
  inline boolean can_uncurry() const;
  inline boolean can_zip() const;
  inline map coalesce() const;
  inline map complement() const;
  inline basic_map convex_hull() const;
  inline map curry() const;
  inline set deltas() const;
  inline map deltas_map() const;
  inline map detect_equalities() const;
  inline isl_size dim(isl::dim type) const;
  inline pw_aff dim_max(int pos) const;
  inline pw_aff dim_min(int pos) const;
  inline set domain() const;
  inline map domain_factor_domain() const;
  inline map domain_factor_range() const;
  inline boolean domain_is_wrapping() const;
  inline map domain_map() const;
  inline map domain_product(map map2) const;
  inline isl_size domain_tuple_dim() const;
  inline map drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline map drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline map drop_unused_params() const;
  inline map eliminate(isl::dim type, unsigned int first, unsigned int n) const;
  static inline map empty(space space);
  inline map eq_at(multi_pw_aff mpa) const;
  inline map equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
  inline map factor_domain() const;
  inline map factor_range() const;
  inline int find_dim_by_id(isl::dim type, const id &id) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline map fix_si(isl::dim type, unsigned int pos, int value) const;
  inline map fix_val(isl::dim type, unsigned int pos, val v) const;
  inline map fixed_power_val(val exp) const;
  inline map flat_domain_product(map map2) const;
  inline map flat_product(map map2) const;
  inline map flat_range_product(map map2) const;
  inline map flatten() const;
  inline map flatten_domain() const;
  inline map flatten_range() const;
  inline map floordiv_val(val d) const;
  inline stat foreach_basic_map(const std::function<stat(basic_map)> &fn) const;
  static inline map from_aff(aff aff);
  static inline map from_domain(set set);
  static inline map from_domain_and_range(set domain, set range);
  static inline map from_multi_aff(multi_aff maff);
  static inline map from_multi_pw_aff(multi_pw_aff mpa);
  static inline map from_pw_aff(pw_aff pwaff);
  static inline map from_pw_multi_aff(pw_multi_aff pma);
  static inline map from_range(set set);
  static inline map from_union_map(union_map umap);
  inline basic_map_list get_basic_map_list() const;
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
  inline uint32_t get_hash() const;
  inline fixed_box get_range_simple_fixed_box_hull() const;
  inline space get_space() const;
  inline id get_tuple_id(isl::dim type) const;
  inline std::string get_tuple_name(isl::dim type) const;
  inline map gist(map context) const;
  inline map gist_basic_map(basic_map context) const;
  inline map gist_domain(set context) const;
  inline map gist_params(set context) const;
  inline map gist_range(set context) const;
  inline boolean has_dim_id(isl::dim type, unsigned int pos) const;
  inline boolean has_dim_name(isl::dim type, unsigned int pos) const;
  inline boolean has_equal_space(const map &map2) const;
  inline boolean has_tuple_id(isl::dim type) const;
  inline boolean has_tuple_name(isl::dim type) const;
  static inline map identity(space space);
  inline map insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
  inline map intersect(map map2) const;
  inline map intersect_domain(set set) const;
  inline map intersect_domain_factor_domain(map factor) const;
  inline map intersect_domain_factor_range(map factor) const;
  inline map intersect_params(set params) const;
  inline map intersect_range(set set) const;
  inline map intersect_range_factor_domain(map factor) const;
  inline map intersect_range_factor_range(map factor) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean is_bijective() const;
  inline boolean is_disjoint(const map &map2) const;
  inline boolean is_empty() const;
  inline boolean is_equal(const map &map2) const;
  inline boolean is_identity() const;
  inline boolean is_injective() const;
  inline boolean is_product() const;
  inline boolean is_single_valued() const;
  inline boolean is_strict_subset(const map &map2) const;
  inline boolean is_subset(const map &map2) const;
  inline int is_translation() const;
  static inline map lex_ge(space set_space);
  inline map lex_ge_at(multi_pw_aff mpa) const;
  static inline map lex_ge_first(space space, unsigned int n);
  inline map lex_ge_map(map map2) const;
  static inline map lex_gt(space set_space);
  inline map lex_gt_at(multi_pw_aff mpa) const;
  static inline map lex_gt_first(space space, unsigned int n);
  inline map lex_gt_map(map map2) const;
  static inline map lex_le(space set_space);
  inline map lex_le_at(multi_pw_aff mpa) const;
  static inline map lex_le_first(space space, unsigned int n);
  inline map lex_le_map(map map2) const;
  static inline map lex_lt(space set_space);
  inline map lex_lt_at(multi_pw_aff mpa) const;
  static inline map lex_lt_first(space space, unsigned int n);
  inline map lex_lt_map(map map2) const;
  inline map lexmax() const;
  inline pw_multi_aff lexmax_pw_multi_aff() const;
  inline map lexmin() const;
  inline pw_multi_aff lexmin_pw_multi_aff() const;
  inline map lower_bound(multi_pw_aff lower) const;
  inline map lower_bound_si(isl::dim type, unsigned int pos, int value) const;
  inline map lower_bound_val(isl::dim type, unsigned int pos, val value) const;
  inline multi_pw_aff max_multi_pw_aff() const;
  inline multi_pw_aff min_multi_pw_aff() const;
  inline map move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  inline isl_size n_basic_map() const;
  static inline map nat_universe(space space);
  inline map neg() const;
  inline map oppose(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
  inline map order_ge(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
  inline map order_gt(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
  inline map order_le(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
  inline map order_lt(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
  inline set params() const;
  inline val plain_get_val_if_fixed(isl::dim type, unsigned int pos) const;
  inline boolean plain_is_empty() const;
  inline boolean plain_is_equal(const map &map2) const;
  inline boolean plain_is_injective() const;
  inline boolean plain_is_single_valued() const;
  inline boolean plain_is_universe() const;
  inline basic_map plain_unshifted_simple_hull() const;
  inline basic_map polyhedral_hull() const;
  inline map preimage_domain(multi_aff ma) const;
  inline map preimage_domain(multi_pw_aff mpa) const;
  inline map preimage_domain(pw_multi_aff pma) const;
  inline map preimage_range(multi_aff ma) const;
  inline map preimage_range(pw_multi_aff pma) const;
  inline map product(map map2) const;
  inline map project_out(isl::dim type, unsigned int first, unsigned int n) const;
  inline map project_out_all_params() const;
  inline set range() const;
  inline map range_curry() const;
  inline map range_factor_domain() const;
  inline map range_factor_range() const;
  inline boolean range_is_wrapping() const;
  inline map range_map() const;
  inline map range_product(map map2) const;
  inline map range_reverse() const;
  inline isl_size range_tuple_dim() const;
  inline map remove_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline map remove_divs() const;
  inline map remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline map remove_redundancies() const;
  inline map remove_unknown_divs() const;
  inline map reset_tuple_id(isl::dim type) const;
  inline map reset_user() const;
  inline map reverse() const;
  inline basic_map sample() const;
  inline map set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline map set_tuple_id(isl::dim type, id id) const;
  inline map set_tuple_name(isl::dim type, const std::string &s) const;
  inline basic_map simple_hull() const;
  inline map subtract(map map2) const;
  inline map subtract_domain(set dom) const;
  inline map subtract_range(set dom) const;
  inline map sum(map map2) const;
  inline map uncurry() const;
  inline map unite(map map2) const;
  static inline map universe(space space);
  inline basic_map unshifted_simple_hull() const;
  inline basic_map unshifted_simple_hull_from_map_list(map_list list) const;
  inline map upper_bound(multi_pw_aff upper) const;
  inline map upper_bound_si(isl::dim type, unsigned int pos, int value) const;
  inline map upper_bound_val(isl::dim type, unsigned int pos, val value) const;
  inline set wrap() const;
  inline map zip() const;
};

// declarations for isl::map_list
inline map_list manage(__isl_take isl_map_list *ptr);
inline map_list manage_copy(__isl_keep isl_map_list *ptr);

class map_list {
  friend inline map_list manage(__isl_take isl_map_list *ptr);
  friend inline map_list manage_copy(__isl_keep isl_map_list *ptr);

  isl_map_list *ptr = nullptr;

  inline explicit map_list(__isl_take isl_map_list *ptr);

public:
  inline /* implicit */ map_list();
  inline /* implicit */ map_list(const map_list &obj);
  inline map_list &operator=(map_list obj);
  inline ~map_list();
  inline __isl_give isl_map_list *copy() const &;
  inline __isl_give isl_map_list *copy() && = delete;
  inline __isl_keep isl_map_list *get() const;
  inline __isl_give isl_map_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline map_list add(map el) const;
  static inline map_list alloc(ctx ctx, int n);
  inline map_list clear() const;
  inline map_list concat(map_list list2) const;
  inline map_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(map)> &fn) const;
  static inline map_list from_map(map el);
  inline map get_at(int index) const;
  inline map get_map(int index) const;
  inline map_list insert(unsigned int pos, map el) const;
  inline isl_size n_map() const;
  inline map_list reverse() const;
  inline map_list set_map(int index, map el) const;
  inline isl_size size() const;
  inline map_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::mat
inline mat manage(__isl_take isl_mat *ptr);
inline mat manage_copy(__isl_keep isl_mat *ptr);

class mat {
  friend inline mat manage(__isl_take isl_mat *ptr);
  friend inline mat manage_copy(__isl_keep isl_mat *ptr);

  isl_mat *ptr = nullptr;

  inline explicit mat(__isl_take isl_mat *ptr);

public:
  inline /* implicit */ mat();
  inline /* implicit */ mat(const mat &obj);
  inline mat &operator=(mat obj);
  inline ~mat();
  inline __isl_give isl_mat *copy() const &;
  inline __isl_give isl_mat *copy() && = delete;
  inline __isl_keep isl_mat *get() const;
  inline __isl_give isl_mat *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline mat add_rows(unsigned int n) const;
  inline mat add_zero_cols(unsigned int n) const;
  inline mat add_zero_rows(unsigned int n) const;
  inline mat aff_direct_sum(mat right) const;
  static inline mat alloc(ctx ctx, unsigned int n_row, unsigned int n_col);
  inline isl_size cols() const;
  inline mat concat(mat bot) const;
  inline mat diagonal(mat mat2) const;
  inline mat drop_cols(unsigned int col, unsigned int n) const;
  inline mat drop_rows(unsigned int row, unsigned int n) const;
  static inline mat from_row_vec(vec vec);
  inline val get_element_val(int row, int col) const;
  inline boolean has_linearly_independent_rows(const mat &mat2) const;
  inline int initial_non_zero_cols() const;
  inline mat insert_cols(unsigned int col, unsigned int n) const;
  inline mat insert_rows(unsigned int row, unsigned int n) const;
  inline mat insert_zero_cols(unsigned int first, unsigned int n) const;
  inline mat insert_zero_rows(unsigned int row, unsigned int n) const;
  inline mat inverse_product(mat right) const;
  inline boolean is_equal(const mat &mat2) const;
  inline mat lin_to_aff() const;
  inline mat move_cols(unsigned int dst_col, unsigned int src_col, unsigned int n) const;
  inline mat normalize() const;
  inline mat normalize_row(int row) const;
  inline mat product(mat right) const;
  inline isl_size rank() const;
  inline mat right_inverse() const;
  inline mat right_kernel() const;
  inline mat row_basis() const;
  inline mat row_basis_extension(mat mat2) const;
  inline isl_size rows() const;
  inline mat set_element_si(int row, int col, int v) const;
  inline mat set_element_val(int row, int col, val v) const;
  inline mat swap_cols(unsigned int i, unsigned int j) const;
  inline mat swap_rows(unsigned int i, unsigned int j) const;
  inline mat transpose() const;
  inline mat unimodular_complete(int row) const;
  inline mat vec_concat(vec bot) const;
  inline vec vec_inverse_product(vec vec) const;
  inline vec vec_product(vec vec) const;
};

// declarations for isl::multi_aff
inline multi_aff manage(__isl_take isl_multi_aff *ptr);
inline multi_aff manage_copy(__isl_keep isl_multi_aff *ptr);

class multi_aff {
  friend inline multi_aff manage(__isl_take isl_multi_aff *ptr);
  friend inline multi_aff manage_copy(__isl_keep isl_multi_aff *ptr);

  isl_multi_aff *ptr = nullptr;

  inline explicit multi_aff(__isl_take isl_multi_aff *ptr);

public:
  inline /* implicit */ multi_aff();
  inline /* implicit */ multi_aff(const multi_aff &obj);
  inline /* implicit */ multi_aff(aff aff);
  inline explicit multi_aff(space space, aff_list list);
  inline explicit multi_aff(ctx ctx, const std::string &str);
  inline multi_aff &operator=(multi_aff obj);
  inline ~multi_aff();
  inline __isl_give isl_multi_aff *copy() const &;
  inline __isl_give isl_multi_aff *copy() && = delete;
  inline __isl_keep isl_multi_aff *get() const;
  inline __isl_give isl_multi_aff *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline multi_aff add(multi_aff multi2) const;
  inline multi_aff add_constant(multi_val mv) const;
  inline multi_aff add_constant(val v) const;
  inline multi_aff add_dims(isl::dim type, unsigned int n) const;
  inline multi_aff align_params(space model) const;
  inline basic_set bind(multi_id tuple) const;
  inline multi_aff bind_domain(multi_id tuple) const;
  inline multi_aff bind_domain_wrapped_domain(multi_id tuple) const;
  inline isl_size dim(isl::dim type) const;
  static inline multi_aff domain_map(space space);
  inline multi_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline multi_aff factor_range() const;
  inline int find_dim_by_id(isl::dim type, const id &id) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline multi_aff flat_range_product(multi_aff multi2) const;
  inline multi_aff flatten_domain() const;
  inline multi_aff flatten_range() const;
  inline multi_aff floor() const;
  inline multi_aff from_range() const;
  inline aff get_aff(int pos) const;
  inline aff get_at(int pos) const;
  inline multi_val get_constant_multi_val() const;
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline space get_domain_space() const;
  inline aff_list get_list() const;
  inline space get_space() const;
  inline id get_tuple_id(isl::dim type) const;
  inline std::string get_tuple_name(isl::dim type) const;
  inline multi_aff gist(set context) const;
  inline multi_aff gist_params(set context) const;
  inline boolean has_tuple_id(isl::dim type) const;
  static inline multi_aff identity(space space);
  inline multi_aff identity() const;
  static inline multi_aff identity_on_domain(space space);
  inline multi_aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline multi_aff insert_domain(space domain) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_locals() const;
  inline boolean involves_nan() const;
  inline set lex_ge_set(multi_aff ma2) const;
  inline set lex_gt_set(multi_aff ma2) const;
  inline set lex_le_set(multi_aff ma2) const;
  inline set lex_lt_set(multi_aff ma2) const;
  inline multi_aff mod_multi_val(multi_val mv) const;
  inline multi_aff move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  static inline multi_aff multi_val_on_space(space space, multi_val mv);
  inline multi_aff neg() const;
  inline int plain_cmp(const multi_aff &multi2) const;
  inline boolean plain_is_equal(const multi_aff &multi2) const;
  inline multi_aff product(multi_aff multi2) const;
  inline multi_aff project_domain_on_params() const;
  static inline multi_aff project_out_map(space space, isl::dim type, unsigned int first, unsigned int n);
  inline multi_aff pullback(multi_aff ma2) const;
  inline multi_aff range_factor_domain() const;
  inline multi_aff range_factor_range() const;
  inline boolean range_is_wrapping() const;
  static inline multi_aff range_map(space space);
  inline multi_aff range_product(multi_aff multi2) const;
  inline multi_aff range_splice(unsigned int pos, multi_aff multi2) const;
  inline multi_aff reset_tuple_id(isl::dim type) const;
  inline multi_aff reset_user() const;
  inline multi_aff scale(multi_val mv) const;
  inline multi_aff scale(val v) const;
  inline multi_aff scale_down(multi_val mv) const;
  inline multi_aff scale_down(val v) const;
  inline multi_aff set_aff(int pos, aff el) const;
  inline multi_aff set_at(int pos, aff el) const;
  inline multi_aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline multi_aff set_tuple_id(isl::dim type, id id) const;
  inline multi_aff set_tuple_name(isl::dim type, const std::string &s) const;
  inline isl_size size() const;
  inline multi_aff splice(unsigned int in_pos, unsigned int out_pos, multi_aff multi2) const;
  inline multi_aff sub(multi_aff multi2) const;
  inline multi_aff unbind_params_insert_domain(multi_id domain) const;
  static inline multi_aff zero(space space);
};

// declarations for isl::multi_id
inline multi_id manage(__isl_take isl_multi_id *ptr);
inline multi_id manage_copy(__isl_keep isl_multi_id *ptr);

class multi_id {
  friend inline multi_id manage(__isl_take isl_multi_id *ptr);
  friend inline multi_id manage_copy(__isl_keep isl_multi_id *ptr);

  isl_multi_id *ptr = nullptr;

  inline explicit multi_id(__isl_take isl_multi_id *ptr);

public:
  inline /* implicit */ multi_id();
  inline /* implicit */ multi_id(const multi_id &obj);
  inline explicit multi_id(space space, id_list list);
  inline explicit multi_id(ctx ctx, const std::string &str);
  inline multi_id &operator=(multi_id obj);
  inline ~multi_id();
  inline __isl_give isl_multi_id *copy() const &;
  inline __isl_give isl_multi_id *copy() && = delete;
  inline __isl_keep isl_multi_id *get() const;
  inline __isl_give isl_multi_id *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline multi_id align_params(space model) const;
  inline multi_id factor_range() const;
  inline multi_id flat_range_product(multi_id multi2) const;
  inline multi_id flatten_range() const;
  inline multi_id from_range() const;
  inline id get_at(int pos) const;
  inline space get_domain_space() const;
  inline id get_id(int pos) const;
  inline id_list get_list() const;
  inline space get_space() const;
  inline boolean plain_is_equal(const multi_id &multi2) const;
  inline multi_id range_factor_domain() const;
  inline multi_id range_factor_range() const;
  inline boolean range_is_wrapping() const;
  inline multi_id range_product(multi_id multi2) const;
  inline multi_id range_splice(unsigned int pos, multi_id multi2) const;
  inline multi_id reset_user() const;
  inline multi_id set_at(int pos, id el) const;
  inline multi_id set_id(int pos, id el) const;
  inline isl_size size() const;
};

// declarations for isl::multi_pw_aff
inline multi_pw_aff manage(__isl_take isl_multi_pw_aff *ptr);
inline multi_pw_aff manage_copy(__isl_keep isl_multi_pw_aff *ptr);

class multi_pw_aff {
  friend inline multi_pw_aff manage(__isl_take isl_multi_pw_aff *ptr);
  friend inline multi_pw_aff manage_copy(__isl_keep isl_multi_pw_aff *ptr);

  isl_multi_pw_aff *ptr = nullptr;

  inline explicit multi_pw_aff(__isl_take isl_multi_pw_aff *ptr);

public:
  inline /* implicit */ multi_pw_aff();
  inline /* implicit */ multi_pw_aff(const multi_pw_aff &obj);
  inline /* implicit */ multi_pw_aff(aff aff);
  inline /* implicit */ multi_pw_aff(multi_aff ma);
  inline /* implicit */ multi_pw_aff(pw_aff pa);
  inline explicit multi_pw_aff(space space, pw_aff_list list);
  inline /* implicit */ multi_pw_aff(pw_multi_aff pma);
  inline explicit multi_pw_aff(ctx ctx, const std::string &str);
  inline multi_pw_aff &operator=(multi_pw_aff obj);
  inline ~multi_pw_aff();
  inline __isl_give isl_multi_pw_aff *copy() const &;
  inline __isl_give isl_multi_pw_aff *copy() && = delete;
  inline __isl_keep isl_multi_pw_aff *get() const;
  inline __isl_give isl_multi_pw_aff *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline multi_pw_aff add(multi_pw_aff multi2) const;
  inline multi_pw_aff add_constant(multi_val mv) const;
  inline multi_pw_aff add_constant(val v) const;
  inline multi_pw_aff add_dims(isl::dim type, unsigned int n) const;
  inline multi_pw_aff align_params(space model) const;
  inline set bind(multi_id tuple) const;
  inline multi_pw_aff bind_domain(multi_id tuple) const;
  inline multi_pw_aff bind_domain_wrapped_domain(multi_id tuple) const;
  inline multi_pw_aff coalesce() const;
  inline isl_size dim(isl::dim type) const;
  inline set domain() const;
  inline multi_pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline map eq_map(multi_pw_aff mpa2) const;
  inline multi_pw_aff factor_range() const;
  inline int find_dim_by_id(isl::dim type, const id &id) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline multi_pw_aff flat_range_product(multi_pw_aff multi2) const;
  inline multi_pw_aff flatten_range() const;
  inline multi_pw_aff from_range() const;
  inline pw_aff get_at(int pos) const;
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline space get_domain_space() const;
  inline uint32_t get_hash() const;
  inline pw_aff_list get_list() const;
  inline pw_aff get_pw_aff(int pos) const;
  inline space get_space() const;
  inline id get_tuple_id(isl::dim type) const;
  inline std::string get_tuple_name(isl::dim type) const;
  inline multi_pw_aff gist(set set) const;
  inline multi_pw_aff gist_params(set set) const;
  inline boolean has_tuple_id(isl::dim type) const;
  static inline multi_pw_aff identity(space space);
  inline multi_pw_aff identity() const;
  static inline multi_pw_aff identity_on_domain(space space);
  inline multi_pw_aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline multi_pw_aff insert_domain(space domain) const;
  inline multi_pw_aff intersect_domain(set domain) const;
  inline multi_pw_aff intersect_params(set set) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_nan() const;
  inline boolean involves_param(const id &id) const;
  inline boolean involves_param(const id_list &list) const;
  inline boolean is_cst() const;
  inline boolean is_equal(const multi_pw_aff &mpa2) const;
  inline map lex_ge_map(multi_pw_aff mpa2) const;
  inline map lex_gt_map(multi_pw_aff mpa2) const;
  inline map lex_le_map(multi_pw_aff mpa2) const;
  inline map lex_lt_map(multi_pw_aff mpa2) const;
  inline multi_pw_aff max(multi_pw_aff multi2) const;
  inline multi_val max_multi_val() const;
  inline multi_pw_aff min(multi_pw_aff multi2) const;
  inline multi_val min_multi_val() const;
  inline multi_pw_aff mod_multi_val(multi_val mv) const;
  inline multi_pw_aff move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  inline multi_pw_aff neg() const;
  inline boolean plain_is_equal(const multi_pw_aff &multi2) const;
  inline multi_pw_aff product(multi_pw_aff multi2) const;
  inline multi_pw_aff project_domain_on_params() const;
  inline multi_pw_aff pullback(multi_aff ma) const;
  inline multi_pw_aff pullback(multi_pw_aff mpa2) const;
  inline multi_pw_aff pullback(pw_multi_aff pma) const;
  inline multi_pw_aff range_factor_domain() const;
  inline multi_pw_aff range_factor_range() const;
  inline boolean range_is_wrapping() const;
  inline multi_pw_aff range_product(multi_pw_aff multi2) const;
  inline multi_pw_aff range_splice(unsigned int pos, multi_pw_aff multi2) const;
  inline multi_pw_aff reset_tuple_id(isl::dim type) const;
  inline multi_pw_aff reset_user() const;
  inline multi_pw_aff scale(multi_val mv) const;
  inline multi_pw_aff scale(val v) const;
  inline multi_pw_aff scale_down(multi_val mv) const;
  inline multi_pw_aff scale_down(val v) const;
  inline multi_pw_aff set_at(int pos, pw_aff el) const;
  inline multi_pw_aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline multi_pw_aff set_pw_aff(int pos, pw_aff el) const;
  inline multi_pw_aff set_tuple_id(isl::dim type, id id) const;
  inline multi_pw_aff set_tuple_name(isl::dim type, const std::string &s) const;
  inline isl_size size() const;
  inline multi_pw_aff splice(unsigned int in_pos, unsigned int out_pos, multi_pw_aff multi2) const;
  inline multi_pw_aff sub(multi_pw_aff multi2) const;
  inline multi_pw_aff unbind_params_insert_domain(multi_id domain) const;
  inline multi_pw_aff union_add(multi_pw_aff mpa2) const;
  static inline multi_pw_aff zero(space space);
};

// declarations for isl::multi_union_pw_aff
inline multi_union_pw_aff manage(__isl_take isl_multi_union_pw_aff *ptr);
inline multi_union_pw_aff manage_copy(__isl_keep isl_multi_union_pw_aff *ptr);

class multi_union_pw_aff {
  friend inline multi_union_pw_aff manage(__isl_take isl_multi_union_pw_aff *ptr);
  friend inline multi_union_pw_aff manage_copy(__isl_keep isl_multi_union_pw_aff *ptr);

  isl_multi_union_pw_aff *ptr = nullptr;

  inline explicit multi_union_pw_aff(__isl_take isl_multi_union_pw_aff *ptr);

public:
  inline /* implicit */ multi_union_pw_aff();
  inline /* implicit */ multi_union_pw_aff(const multi_union_pw_aff &obj);
  inline /* implicit */ multi_union_pw_aff(multi_pw_aff mpa);
  inline /* implicit */ multi_union_pw_aff(union_pw_aff upa);
  inline explicit multi_union_pw_aff(space space, union_pw_aff_list list);
  inline explicit multi_union_pw_aff(union_pw_multi_aff upma);
  inline explicit multi_union_pw_aff(ctx ctx, const std::string &str);
  inline multi_union_pw_aff &operator=(multi_union_pw_aff obj);
  inline ~multi_union_pw_aff();
  inline __isl_give isl_multi_union_pw_aff *copy() const &;
  inline __isl_give isl_multi_union_pw_aff *copy() && = delete;
  inline __isl_keep isl_multi_union_pw_aff *get() const;
  inline __isl_give isl_multi_union_pw_aff *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline multi_union_pw_aff add(multi_union_pw_aff multi2) const;
  inline multi_union_pw_aff align_params(space model) const;
  inline union_pw_aff apply_aff(aff aff) const;
  inline union_pw_aff apply_pw_aff(pw_aff pa) const;
  inline multi_union_pw_aff apply_pw_multi_aff(pw_multi_aff pma) const;
  inline union_set bind(multi_id tuple) const;
  inline multi_union_pw_aff coalesce() const;
  inline isl_size dim(isl::dim type) const;
  inline union_set domain() const;
  inline multi_union_pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline multi_pw_aff extract_multi_pw_aff(space space) const;
  inline multi_union_pw_aff factor_range() const;
  inline int find_dim_by_id(isl::dim type, const id &id) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline multi_union_pw_aff flat_range_product(multi_union_pw_aff multi2) const;
  inline multi_union_pw_aff flatten_range() const;
  inline multi_union_pw_aff floor() const;
  static inline multi_union_pw_aff from_multi_aff(multi_aff ma);
  inline multi_union_pw_aff from_range() const;
  static inline multi_union_pw_aff from_union_map(union_map umap);
  inline union_pw_aff get_at(int pos) const;
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline space get_domain_space() const;
  inline union_pw_aff_list get_list() const;
  inline space get_space() const;
  inline id get_tuple_id(isl::dim type) const;
  inline std::string get_tuple_name(isl::dim type) const;
  inline union_pw_aff get_union_pw_aff(int pos) const;
  inline multi_union_pw_aff gist(union_set context) const;
  inline multi_union_pw_aff gist_params(set context) const;
  inline boolean has_tuple_id(isl::dim type) const;
  inline multi_union_pw_aff intersect_domain(union_set uset) const;
  inline multi_union_pw_aff intersect_params(set params) const;
  inline multi_union_pw_aff intersect_range(set set) const;
  inline boolean involves_nan() const;
  inline multi_val max_multi_val() const;
  inline multi_val min_multi_val() const;
  inline multi_union_pw_aff mod_multi_val(multi_val mv) const;
  static inline multi_union_pw_aff multi_aff_on_domain(union_set domain, multi_aff ma);
  static inline multi_union_pw_aff multi_val_on_domain(union_set domain, multi_val mv);
  inline multi_union_pw_aff neg() const;
  inline boolean plain_is_equal(const multi_union_pw_aff &multi2) const;
  inline multi_union_pw_aff pullback(union_pw_multi_aff upma) const;
  static inline multi_union_pw_aff pw_multi_aff_on_domain(union_set domain, pw_multi_aff pma);
  inline multi_union_pw_aff range_factor_domain() const;
  inline multi_union_pw_aff range_factor_range() const;
  inline boolean range_is_wrapping() const;
  inline multi_union_pw_aff range_product(multi_union_pw_aff multi2) const;
  inline multi_union_pw_aff range_splice(unsigned int pos, multi_union_pw_aff multi2) const;
  inline multi_union_pw_aff reset_tuple_id(isl::dim type) const;
  inline multi_union_pw_aff reset_user() const;
  inline multi_union_pw_aff scale(multi_val mv) const;
  inline multi_union_pw_aff scale(val v) const;
  inline multi_union_pw_aff scale_down(multi_val mv) const;
  inline multi_union_pw_aff scale_down(val v) const;
  inline multi_union_pw_aff set_at(int pos, union_pw_aff el) const;
  inline multi_union_pw_aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline multi_union_pw_aff set_tuple_id(isl::dim type, id id) const;
  inline multi_union_pw_aff set_tuple_name(isl::dim type, const std::string &s) const;
  inline multi_union_pw_aff set_union_pw_aff(int pos, union_pw_aff el) const;
  inline isl_size size() const;
  inline multi_union_pw_aff sub(multi_union_pw_aff multi2) const;
  inline multi_union_pw_aff union_add(multi_union_pw_aff mupa2) const;
  static inline multi_union_pw_aff zero(space space);
  inline union_set zero_union_set() const;
};

// declarations for isl::multi_val
inline multi_val manage(__isl_take isl_multi_val *ptr);
inline multi_val manage_copy(__isl_keep isl_multi_val *ptr);

class multi_val {
  friend inline multi_val manage(__isl_take isl_multi_val *ptr);
  friend inline multi_val manage_copy(__isl_keep isl_multi_val *ptr);

  isl_multi_val *ptr = nullptr;

  inline explicit multi_val(__isl_take isl_multi_val *ptr);

public:
  inline /* implicit */ multi_val();
  inline /* implicit */ multi_val(const multi_val &obj);
  inline explicit multi_val(space space, val_list list);
  inline explicit multi_val(ctx ctx, const std::string &str);
  inline multi_val &operator=(multi_val obj);
  inline ~multi_val();
  inline __isl_give isl_multi_val *copy() const &;
  inline __isl_give isl_multi_val *copy() && = delete;
  inline __isl_keep isl_multi_val *get() const;
  inline __isl_give isl_multi_val *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline multi_val add(multi_val multi2) const;
  inline multi_val add(val v) const;
  inline multi_val add_dims(isl::dim type, unsigned int n) const;
  inline multi_val align_params(space model) const;
  inline isl_size dim(isl::dim type) const;
  inline multi_val drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline multi_val factor_range() const;
  inline int find_dim_by_id(isl::dim type, const id &id) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline multi_val flat_range_product(multi_val multi2) const;
  inline multi_val flatten_range() const;
  inline multi_val from_range() const;
  inline val get_at(int pos) const;
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline space get_domain_space() const;
  inline val_list get_list() const;
  inline space get_space() const;
  inline id get_tuple_id(isl::dim type) const;
  inline std::string get_tuple_name(isl::dim type) const;
  inline val get_val(int pos) const;
  inline boolean has_tuple_id(isl::dim type) const;
  inline multi_val insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_nan() const;
  inline boolean is_zero() const;
  inline multi_val max(multi_val multi2) const;
  inline multi_val min(multi_val multi2) const;
  inline multi_val mod_multi_val(multi_val mv) const;
  inline multi_val mod_val(val v) const;
  inline multi_val neg() const;
  inline boolean plain_is_equal(const multi_val &multi2) const;
  inline multi_val product(multi_val multi2) const;
  inline multi_val project_domain_on_params() const;
  inline multi_val range_factor_domain() const;
  inline multi_val range_factor_range() const;
  inline boolean range_is_wrapping() const;
  inline multi_val range_product(multi_val multi2) const;
  inline multi_val range_splice(unsigned int pos, multi_val multi2) const;
  inline multi_val reset_tuple_id(isl::dim type) const;
  inline multi_val reset_user() const;
  inline multi_val scale(multi_val mv) const;
  inline multi_val scale(val v) const;
  inline multi_val scale_down(multi_val mv) const;
  inline multi_val scale_down(val v) const;
  inline multi_val set_at(int pos, val el) const;
  inline multi_val set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline multi_val set_tuple_id(isl::dim type, id id) const;
  inline multi_val set_tuple_name(isl::dim type, const std::string &s) const;
  inline multi_val set_val(int pos, val el) const;
  inline isl_size size() const;
  inline multi_val splice(unsigned int in_pos, unsigned int out_pos, multi_val multi2) const;
  inline multi_val sub(multi_val multi2) const;
  static inline multi_val zero(space space);
};

// declarations for isl::point
inline point manage(__isl_take isl_point *ptr);
inline point manage_copy(__isl_keep isl_point *ptr);

class point {
  friend inline point manage(__isl_take isl_point *ptr);
  friend inline point manage_copy(__isl_keep isl_point *ptr);

  isl_point *ptr = nullptr;

  inline explicit point(__isl_take isl_point *ptr);

public:
  inline /* implicit */ point();
  inline /* implicit */ point(const point &obj);
  inline explicit point(space dim);
  inline point &operator=(point obj);
  inline ~point();
  inline __isl_give isl_point *copy() const &;
  inline __isl_give isl_point *copy() && = delete;
  inline __isl_keep isl_point *get() const;
  inline __isl_give isl_point *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline point add_ui(isl::dim type, int pos, unsigned int val) const;
  inline val get_coordinate_val(isl::dim type, int pos) const;
  inline multi_val get_multi_val() const;
  inline space get_space() const;
  inline point set_coordinate_val(isl::dim type, int pos, val v) const;
  inline point sub_ui(isl::dim type, int pos, unsigned int val) const;
};

// declarations for isl::pw_aff
inline pw_aff manage(__isl_take isl_pw_aff *ptr);
inline pw_aff manage_copy(__isl_keep isl_pw_aff *ptr);

class pw_aff {
  friend inline pw_aff manage(__isl_take isl_pw_aff *ptr);
  friend inline pw_aff manage_copy(__isl_keep isl_pw_aff *ptr);

  isl_pw_aff *ptr = nullptr;

  inline explicit pw_aff(__isl_take isl_pw_aff *ptr);

public:
  inline /* implicit */ pw_aff();
  inline /* implicit */ pw_aff(const pw_aff &obj);
  inline /* implicit */ pw_aff(aff aff);
  inline explicit pw_aff(ctx ctx, const std::string &str);
  inline explicit pw_aff(set domain, val v);
  inline explicit pw_aff(local_space ls);
  inline pw_aff &operator=(pw_aff obj);
  inline ~pw_aff();
  inline __isl_give isl_pw_aff *copy() const &;
  inline __isl_give isl_pw_aff *copy() && = delete;
  inline __isl_keep isl_pw_aff *get() const;
  inline __isl_give isl_pw_aff *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline pw_aff add(pw_aff pwaff2) const;
  inline pw_aff add_constant(val v) const;
  inline pw_aff add_dims(isl::dim type, unsigned int n) const;
  inline pw_aff align_params(space model) const;
  static inline pw_aff alloc(set set, aff aff);
  inline aff as_aff() const;
  inline set bind(id id) const;
  inline pw_aff bind_domain(multi_id tuple) const;
  inline pw_aff bind_domain_wrapped_domain(multi_id tuple) const;
  inline pw_aff ceil() const;
  inline pw_aff coalesce() const;
  inline pw_aff cond(pw_aff pwaff_true, pw_aff pwaff_false) const;
  inline isl_size dim(isl::dim type) const;
  inline pw_aff div(pw_aff pa2) const;
  inline set domain() const;
  inline pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline pw_aff drop_unused_params() const;
  static inline pw_aff empty(space space);
  inline map eq_map(pw_aff pa2) const;
  inline set eq_set(pw_aff pwaff2) const;
  inline val eval(point pnt) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline pw_aff floor() const;
  inline stat foreach_piece(const std::function<stat(set, aff)> &fn) const;
  inline pw_aff from_range() const;
  inline map ge_map(pw_aff pa2) const;
  inline set ge_set(pw_aff pwaff2) const;
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
  inline space get_domain_space() const;
  inline uint32_t get_hash() const;
  inline space get_space() const;
  inline id get_tuple_id(isl::dim type) const;
  inline pw_aff gist(set context) const;
  inline pw_aff gist_params(set context) const;
  inline map gt_map(pw_aff pa2) const;
  inline set gt_set(pw_aff pwaff2) const;
  inline boolean has_dim_id(isl::dim type, unsigned int pos) const;
  inline boolean has_tuple_id(isl::dim type) const;
  inline pw_aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline pw_aff insert_domain(space domain) const;
  inline pw_aff intersect_domain(set set) const;
  inline pw_aff intersect_domain_wrapped_domain(set set) const;
  inline pw_aff intersect_domain_wrapped_range(set set) const;
  inline pw_aff intersect_params(set set) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_nan() const;
  inline boolean involves_param_id(const id &id) const;
  inline boolean is_cst() const;
  inline boolean is_empty() const;
  inline boolean is_equal(const pw_aff &pa2) const;
  inline boolean isa_aff() const;
  inline map le_map(pw_aff pa2) const;
  inline set le_set(pw_aff pwaff2) const;
  inline map lt_map(pw_aff pa2) const;
  inline set lt_set(pw_aff pwaff2) const;
  inline pw_aff max(pw_aff pwaff2) const;
  inline pw_aff min(pw_aff pwaff2) const;
  inline pw_aff mod(val mod) const;
  inline pw_aff move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  inline pw_aff mul(pw_aff pwaff2) const;
  inline isl_size n_piece() const;
  static inline pw_aff nan_on_domain(local_space ls);
  static inline pw_aff nan_on_domain_space(space space);
  inline set ne_set(pw_aff pwaff2) const;
  inline pw_aff neg() const;
  inline set non_zero_set() const;
  inline set nonneg_set() const;
  static inline pw_aff param_on_domain(set domain, id id);
  inline set params() const;
  inline int plain_cmp(const pw_aff &pa2) const;
  inline boolean plain_is_equal(const pw_aff &pwaff2) const;
  inline set pos_set() const;
  inline pw_aff project_domain_on_params() const;
  inline pw_aff pullback(multi_aff ma) const;
  inline pw_aff pullback(multi_pw_aff mpa) const;
  inline pw_aff pullback(pw_multi_aff pma) const;
  inline pw_aff reset_tuple_id(isl::dim type) const;
  inline pw_aff reset_user() const;
  inline pw_aff scale(val v) const;
  inline pw_aff scale_down(val f) const;
  inline pw_aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline pw_aff set_tuple_id(isl::dim type, id id) const;
  inline pw_aff sub(pw_aff pwaff2) const;
  inline pw_aff subtract_domain(set set) const;
  inline pw_aff tdiv_q(pw_aff pa2) const;
  inline pw_aff tdiv_r(pw_aff pa2) const;
  inline pw_aff union_add(pw_aff pwaff2) const;
  inline pw_aff union_max(pw_aff pwaff2) const;
  inline pw_aff union_min(pw_aff pwaff2) const;
  static inline pw_aff var_on_domain(local_space ls, isl::dim type, unsigned int pos);
  inline set zero_set() const;
};

// declarations for isl::pw_aff_list
inline pw_aff_list manage(__isl_take isl_pw_aff_list *ptr);
inline pw_aff_list manage_copy(__isl_keep isl_pw_aff_list *ptr);

class pw_aff_list {
  friend inline pw_aff_list manage(__isl_take isl_pw_aff_list *ptr);
  friend inline pw_aff_list manage_copy(__isl_keep isl_pw_aff_list *ptr);

  isl_pw_aff_list *ptr = nullptr;

  inline explicit pw_aff_list(__isl_take isl_pw_aff_list *ptr);

public:
  inline /* implicit */ pw_aff_list();
  inline /* implicit */ pw_aff_list(const pw_aff_list &obj);
  inline pw_aff_list &operator=(pw_aff_list obj);
  inline ~pw_aff_list();
  inline __isl_give isl_pw_aff_list *copy() const &;
  inline __isl_give isl_pw_aff_list *copy() && = delete;
  inline __isl_keep isl_pw_aff_list *get() const;
  inline __isl_give isl_pw_aff_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline pw_aff_list add(pw_aff el) const;
  static inline pw_aff_list alloc(ctx ctx, int n);
  inline pw_aff_list clear() const;
  inline pw_aff_list concat(pw_aff_list list2) const;
  inline pw_aff_list drop(unsigned int first, unsigned int n) const;
  inline set eq_set(pw_aff_list list2) const;
  inline stat foreach(const std::function<stat(pw_aff)> &fn) const;
  static inline pw_aff_list from_pw_aff(pw_aff el);
  inline set ge_set(pw_aff_list list2) const;
  inline pw_aff get_at(int index) const;
  inline pw_aff get_pw_aff(int index) const;
  inline set gt_set(pw_aff_list list2) const;
  inline pw_aff_list insert(unsigned int pos, pw_aff el) const;
  inline set le_set(pw_aff_list list2) const;
  inline set lt_set(pw_aff_list list2) const;
  inline pw_aff max() const;
  inline pw_aff min() const;
  inline isl_size n_pw_aff() const;
  inline set ne_set(pw_aff_list list2) const;
  inline pw_aff_list reverse() const;
  inline pw_aff_list set_pw_aff(int index, pw_aff el) const;
  inline isl_size size() const;
  inline pw_aff_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::pw_multi_aff
inline pw_multi_aff manage(__isl_take isl_pw_multi_aff *ptr);
inline pw_multi_aff manage_copy(__isl_keep isl_pw_multi_aff *ptr);

class pw_multi_aff {
  friend inline pw_multi_aff manage(__isl_take isl_pw_multi_aff *ptr);
  friend inline pw_multi_aff manage_copy(__isl_keep isl_pw_multi_aff *ptr);

  isl_pw_multi_aff *ptr = nullptr;

  inline explicit pw_multi_aff(__isl_take isl_pw_multi_aff *ptr);

public:
  inline /* implicit */ pw_multi_aff();
  inline /* implicit */ pw_multi_aff(const pw_multi_aff &obj);
  inline /* implicit */ pw_multi_aff(multi_aff ma);
  inline /* implicit */ pw_multi_aff(pw_aff pa);
  inline explicit pw_multi_aff(ctx ctx, const std::string &str);
  inline pw_multi_aff &operator=(pw_multi_aff obj);
  inline ~pw_multi_aff();
  inline __isl_give isl_pw_multi_aff *copy() const &;
  inline __isl_give isl_pw_multi_aff *copy() && = delete;
  inline __isl_keep isl_pw_multi_aff *get() const;
  inline __isl_give isl_pw_multi_aff *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline pw_multi_aff add(pw_multi_aff pma2) const;
  inline pw_multi_aff add_constant(multi_val mv) const;
  inline pw_multi_aff add_constant(val v) const;
  inline pw_multi_aff align_params(space model) const;
  static inline pw_multi_aff alloc(set set, multi_aff maff);
  inline multi_aff as_multi_aff() const;
  inline pw_multi_aff bind_domain(multi_id tuple) const;
  inline pw_multi_aff bind_domain_wrapped_domain(multi_id tuple) const;
  inline pw_multi_aff coalesce() const;
  inline isl_size dim(isl::dim type) const;
  inline set domain() const;
  static inline pw_multi_aff domain_map(space space);
  inline pw_multi_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline pw_multi_aff drop_unused_params() const;
  static inline pw_multi_aff empty(space space);
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline pw_multi_aff fix_si(isl::dim type, unsigned int pos, int value) const;
  inline pw_multi_aff flat_range_product(pw_multi_aff pma2) const;
  inline stat foreach_piece(const std::function<stat(set, multi_aff)> &fn) const;
  static inline pw_multi_aff from_domain(set set);
  static inline pw_multi_aff from_map(map map);
  static inline pw_multi_aff from_multi_pw_aff(multi_pw_aff mpa);
  static inline pw_multi_aff from_set(set set);
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
  inline space get_domain_space() const;
  inline pw_aff get_pw_aff(int pos) const;
  inline space get_space() const;
  inline id get_tuple_id(isl::dim type) const;
  inline std::string get_tuple_name(isl::dim type) const;
  inline pw_multi_aff gist(set set) const;
  inline pw_multi_aff gist_params(set set) const;
  inline boolean has_tuple_id(isl::dim type) const;
  inline boolean has_tuple_name(isl::dim type) const;
  static inline pw_multi_aff identity(space space);
  static inline pw_multi_aff identity_on_domain(space space);
  inline pw_multi_aff insert_domain(space domain) const;
  inline pw_multi_aff intersect_domain(set set) const;
  inline pw_multi_aff intersect_domain_wrapped_domain(set set) const;
  inline pw_multi_aff intersect_domain_wrapped_range(set set) const;
  inline pw_multi_aff intersect_params(set set) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_locals() const;
  inline boolean involves_nan() const;
  inline boolean involves_param_id(const id &id) const;
  inline boolean is_equal(const pw_multi_aff &pma2) const;
  inline boolean isa_multi_aff() const;
  inline multi_val max_multi_val() const;
  inline multi_val min_multi_val() const;
  static inline pw_multi_aff multi_val_on_domain(set domain, multi_val mv);
  inline isl_size n_piece() const;
  inline pw_multi_aff neg() const;
  inline boolean plain_is_equal(const pw_multi_aff &pma2) const;
  inline pw_multi_aff preimage_domain_wrapped_domain(pw_multi_aff pma2) const;
  inline pw_multi_aff product(pw_multi_aff pma2) const;
  inline pw_multi_aff project_domain_on_params() const;
  static inline pw_multi_aff project_out_map(space space, isl::dim type, unsigned int first, unsigned int n);
  inline pw_multi_aff pullback(multi_aff ma) const;
  inline pw_multi_aff pullback(pw_multi_aff pma2) const;
  inline pw_multi_aff range_factor_domain() const;
  inline pw_multi_aff range_factor_range() const;
  static inline pw_multi_aff range_map(space space);
  inline pw_multi_aff range_product(pw_multi_aff pma2) const;
  inline pw_multi_aff reset_tuple_id(isl::dim type) const;
  inline pw_multi_aff reset_user() const;
  inline pw_multi_aff scale(val v) const;
  inline pw_multi_aff scale_down(val v) const;
  inline pw_multi_aff scale_multi_val(multi_val mv) const;
  inline pw_multi_aff set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline pw_multi_aff set_pw_aff(unsigned int pos, pw_aff pa) const;
  inline pw_multi_aff set_tuple_id(isl::dim type, id id) const;
  inline pw_multi_aff sub(pw_multi_aff pma2) const;
  inline pw_multi_aff subtract_domain(set set) const;
  inline pw_multi_aff union_add(pw_multi_aff pma2) const;
  inline pw_multi_aff union_lexmax(pw_multi_aff pma2) const;
  inline pw_multi_aff union_lexmin(pw_multi_aff pma2) const;
  static inline pw_multi_aff zero(space space);
};

// declarations for isl::pw_multi_aff_list
inline pw_multi_aff_list manage(__isl_take isl_pw_multi_aff_list *ptr);
inline pw_multi_aff_list manage_copy(__isl_keep isl_pw_multi_aff_list *ptr);

class pw_multi_aff_list {
  friend inline pw_multi_aff_list manage(__isl_take isl_pw_multi_aff_list *ptr);
  friend inline pw_multi_aff_list manage_copy(__isl_keep isl_pw_multi_aff_list *ptr);

  isl_pw_multi_aff_list *ptr = nullptr;

  inline explicit pw_multi_aff_list(__isl_take isl_pw_multi_aff_list *ptr);

public:
  inline /* implicit */ pw_multi_aff_list();
  inline /* implicit */ pw_multi_aff_list(const pw_multi_aff_list &obj);
  inline pw_multi_aff_list &operator=(pw_multi_aff_list obj);
  inline ~pw_multi_aff_list();
  inline __isl_give isl_pw_multi_aff_list *copy() const &;
  inline __isl_give isl_pw_multi_aff_list *copy() && = delete;
  inline __isl_keep isl_pw_multi_aff_list *get() const;
  inline __isl_give isl_pw_multi_aff_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline pw_multi_aff_list add(pw_multi_aff el) const;
  static inline pw_multi_aff_list alloc(ctx ctx, int n);
  inline pw_multi_aff_list clear() const;
  inline pw_multi_aff_list concat(pw_multi_aff_list list2) const;
  inline pw_multi_aff_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(pw_multi_aff)> &fn) const;
  static inline pw_multi_aff_list from_pw_multi_aff(pw_multi_aff el);
  inline pw_multi_aff get_at(int index) const;
  inline pw_multi_aff get_pw_multi_aff(int index) const;
  inline pw_multi_aff_list insert(unsigned int pos, pw_multi_aff el) const;
  inline isl_size n_pw_multi_aff() const;
  inline pw_multi_aff_list reverse() const;
  inline pw_multi_aff_list set_pw_multi_aff(int index, pw_multi_aff el) const;
  inline isl_size size() const;
  inline pw_multi_aff_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::pw_qpolynomial
inline pw_qpolynomial manage(__isl_take isl_pw_qpolynomial *ptr);
inline pw_qpolynomial manage_copy(__isl_keep isl_pw_qpolynomial *ptr);

class pw_qpolynomial {
  friend inline pw_qpolynomial manage(__isl_take isl_pw_qpolynomial *ptr);
  friend inline pw_qpolynomial manage_copy(__isl_keep isl_pw_qpolynomial *ptr);

  isl_pw_qpolynomial *ptr = nullptr;

  inline explicit pw_qpolynomial(__isl_take isl_pw_qpolynomial *ptr);

public:
  inline /* implicit */ pw_qpolynomial();
  inline /* implicit */ pw_qpolynomial(const pw_qpolynomial &obj);
  inline explicit pw_qpolynomial(ctx ctx, const std::string &str);
  inline pw_qpolynomial &operator=(pw_qpolynomial obj);
  inline ~pw_qpolynomial();
  inline __isl_give isl_pw_qpolynomial *copy() const &;
  inline __isl_give isl_pw_qpolynomial *copy() && = delete;
  inline __isl_keep isl_pw_qpolynomial *get() const;
  inline __isl_give isl_pw_qpolynomial *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline pw_qpolynomial add(pw_qpolynomial pwqp2) const;
  inline pw_qpolynomial add_dims(isl::dim type, unsigned int n) const;
  static inline pw_qpolynomial alloc(set set, qpolynomial qp);
  inline qpolynomial as_qpolynomial() const;
  inline pw_qpolynomial coalesce() const;
  inline isl_size dim(isl::dim type) const;
  inline set domain() const;
  inline pw_qpolynomial drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline pw_qpolynomial drop_unused_params() const;
  inline val eval(point pnt) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline pw_qpolynomial fix_val(isl::dim type, unsigned int n, val v) const;
  inline stat foreach_piece(const std::function<stat(set, qpolynomial)> &fn) const;
  static inline pw_qpolynomial from_pw_aff(pw_aff pwaff);
  static inline pw_qpolynomial from_qpolynomial(qpolynomial qp);
  inline pw_qpolynomial from_range() const;
  inline space get_domain_space() const;
  inline space get_space() const;
  inline pw_qpolynomial gist(set context) const;
  inline pw_qpolynomial gist_params(set context) const;
  inline boolean has_equal_space(const pw_qpolynomial &pwqp2) const;
  inline pw_qpolynomial insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline pw_qpolynomial intersect_domain(set set) const;
  inline pw_qpolynomial intersect_domain_wrapped_domain(set set) const;
  inline pw_qpolynomial intersect_domain_wrapped_range(set set) const;
  inline pw_qpolynomial intersect_params(set set) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_nan() const;
  inline boolean involves_param_id(const id &id) const;
  inline boolean is_zero() const;
  inline boolean isa_qpolynomial() const;
  inline val max() const;
  inline val min() const;
  inline pw_qpolynomial move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  inline pw_qpolynomial mul(pw_qpolynomial pwqp2) const;
  inline isl_size n_piece() const;
  inline pw_qpolynomial neg() const;
  inline boolean plain_is_equal(const pw_qpolynomial &pwqp2) const;
  inline pw_qpolynomial pow(unsigned int exponent) const;
  inline pw_qpolynomial project_domain_on_params() const;
  inline pw_qpolynomial reset_domain_space(space space) const;
  inline pw_qpolynomial reset_user() const;
  inline pw_qpolynomial scale_down_val(val v) const;
  inline pw_qpolynomial scale_val(val v) const;
  inline pw_qpolynomial split_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline pw_qpolynomial split_periods(int max_periods) const;
  inline pw_qpolynomial sub(pw_qpolynomial pwqp2) const;
  inline pw_qpolynomial subtract_domain(set set) const;
  inline pw_qpolynomial to_polynomial(int sign) const;
  static inline pw_qpolynomial zero(space space);
};

// declarations for isl::pw_qpolynomial_fold_list
inline pw_qpolynomial_fold_list manage(__isl_take isl_pw_qpolynomial_fold_list *ptr);
inline pw_qpolynomial_fold_list manage_copy(__isl_keep isl_pw_qpolynomial_fold_list *ptr);

class pw_qpolynomial_fold_list {
  friend inline pw_qpolynomial_fold_list manage(__isl_take isl_pw_qpolynomial_fold_list *ptr);
  friend inline pw_qpolynomial_fold_list manage_copy(__isl_keep isl_pw_qpolynomial_fold_list *ptr);

  isl_pw_qpolynomial_fold_list *ptr = nullptr;

  inline explicit pw_qpolynomial_fold_list(__isl_take isl_pw_qpolynomial_fold_list *ptr);

public:
  inline /* implicit */ pw_qpolynomial_fold_list();
  inline /* implicit */ pw_qpolynomial_fold_list(const pw_qpolynomial_fold_list &obj);
  inline pw_qpolynomial_fold_list &operator=(pw_qpolynomial_fold_list obj);
  inline ~pw_qpolynomial_fold_list();
  inline __isl_give isl_pw_qpolynomial_fold_list *copy() const &;
  inline __isl_give isl_pw_qpolynomial_fold_list *copy() && = delete;
  inline __isl_keep isl_pw_qpolynomial_fold_list *get() const;
  inline __isl_give isl_pw_qpolynomial_fold_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

};

// declarations for isl::pw_qpolynomial_list
inline pw_qpolynomial_list manage(__isl_take isl_pw_qpolynomial_list *ptr);
inline pw_qpolynomial_list manage_copy(__isl_keep isl_pw_qpolynomial_list *ptr);

class pw_qpolynomial_list {
  friend inline pw_qpolynomial_list manage(__isl_take isl_pw_qpolynomial_list *ptr);
  friend inline pw_qpolynomial_list manage_copy(__isl_keep isl_pw_qpolynomial_list *ptr);

  isl_pw_qpolynomial_list *ptr = nullptr;

  inline explicit pw_qpolynomial_list(__isl_take isl_pw_qpolynomial_list *ptr);

public:
  inline /* implicit */ pw_qpolynomial_list();
  inline /* implicit */ pw_qpolynomial_list(const pw_qpolynomial_list &obj);
  inline pw_qpolynomial_list &operator=(pw_qpolynomial_list obj);
  inline ~pw_qpolynomial_list();
  inline __isl_give isl_pw_qpolynomial_list *copy() const &;
  inline __isl_give isl_pw_qpolynomial_list *copy() && = delete;
  inline __isl_keep isl_pw_qpolynomial_list *get() const;
  inline __isl_give isl_pw_qpolynomial_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline pw_qpolynomial_list add(pw_qpolynomial el) const;
  static inline pw_qpolynomial_list alloc(ctx ctx, int n);
  inline pw_qpolynomial_list clear() const;
  inline pw_qpolynomial_list concat(pw_qpolynomial_list list2) const;
  inline pw_qpolynomial_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(pw_qpolynomial)> &fn) const;
  static inline pw_qpolynomial_list from_pw_qpolynomial(pw_qpolynomial el);
  inline pw_qpolynomial get_at(int index) const;
  inline pw_qpolynomial get_pw_qpolynomial(int index) const;
  inline pw_qpolynomial_list insert(unsigned int pos, pw_qpolynomial el) const;
  inline isl_size n_pw_qpolynomial() const;
  inline pw_qpolynomial_list reverse() const;
  inline pw_qpolynomial_list set_pw_qpolynomial(int index, pw_qpolynomial el) const;
  inline isl_size size() const;
  inline pw_qpolynomial_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::qpolynomial
inline qpolynomial manage(__isl_take isl_qpolynomial *ptr);
inline qpolynomial manage_copy(__isl_keep isl_qpolynomial *ptr);

class qpolynomial {
  friend inline qpolynomial manage(__isl_take isl_qpolynomial *ptr);
  friend inline qpolynomial manage_copy(__isl_keep isl_qpolynomial *ptr);

  isl_qpolynomial *ptr = nullptr;

  inline explicit qpolynomial(__isl_take isl_qpolynomial *ptr);

public:
  inline /* implicit */ qpolynomial();
  inline /* implicit */ qpolynomial(const qpolynomial &obj);
  inline qpolynomial &operator=(qpolynomial obj);
  inline ~qpolynomial();
  inline __isl_give isl_qpolynomial *copy() const &;
  inline __isl_give isl_qpolynomial *copy() && = delete;
  inline __isl_keep isl_qpolynomial *get() const;
  inline __isl_give isl_qpolynomial *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline qpolynomial add(qpolynomial qp2) const;
  inline qpolynomial add_dims(isl::dim type, unsigned int n) const;
  inline qpolynomial align_params(space model) const;
  inline stat as_polynomial_on_domain(const basic_set &bset, const std::function<stat(basic_set, qpolynomial)> &fn) const;
  inline isl_size dim(isl::dim type) const;
  inline qpolynomial drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline val eval(point pnt) const;
  inline stat foreach_term(const std::function<stat(term)> &fn) const;
  static inline qpolynomial from_aff(aff aff);
  static inline qpolynomial from_constraint(constraint c, isl::dim type, unsigned int pos);
  static inline qpolynomial from_term(term term);
  inline val get_constant_val() const;
  inline space get_domain_space() const;
  inline space get_space() const;
  inline qpolynomial gist(set context) const;
  inline qpolynomial gist_params(set context) const;
  inline qpolynomial homogenize() const;
  static inline qpolynomial infty_on_domain(space domain);
  inline qpolynomial insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean is_infty() const;
  inline boolean is_nan() const;
  inline boolean is_neginfty() const;
  inline boolean is_zero() const;
  inline qpolynomial move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  inline qpolynomial mul(qpolynomial qp2) const;
  static inline qpolynomial nan_on_domain(space domain);
  inline qpolynomial neg() const;
  static inline qpolynomial neginfty_on_domain(space domain);
  static inline qpolynomial one_on_domain(space domain);
  inline boolean plain_is_equal(const qpolynomial &qp2) const;
  inline qpolynomial pow(unsigned int power) const;
  inline qpolynomial project_domain_on_params() const;
  inline qpolynomial scale_down_val(val v) const;
  inline qpolynomial scale_val(val v) const;
  inline int sgn() const;
  inline qpolynomial sub(qpolynomial qp2) const;
  static inline qpolynomial val_on_domain(space space, val val);
  static inline qpolynomial var_on_domain(space domain, isl::dim type, unsigned int pos);
  static inline qpolynomial zero_on_domain(space domain);
};

// declarations for isl::qpolynomial_list
inline qpolynomial_list manage(__isl_take isl_qpolynomial_list *ptr);
inline qpolynomial_list manage_copy(__isl_keep isl_qpolynomial_list *ptr);

class qpolynomial_list {
  friend inline qpolynomial_list manage(__isl_take isl_qpolynomial_list *ptr);
  friend inline qpolynomial_list manage_copy(__isl_keep isl_qpolynomial_list *ptr);

  isl_qpolynomial_list *ptr = nullptr;

  inline explicit qpolynomial_list(__isl_take isl_qpolynomial_list *ptr);

public:
  inline /* implicit */ qpolynomial_list();
  inline /* implicit */ qpolynomial_list(const qpolynomial_list &obj);
  inline qpolynomial_list &operator=(qpolynomial_list obj);
  inline ~qpolynomial_list();
  inline __isl_give isl_qpolynomial_list *copy() const &;
  inline __isl_give isl_qpolynomial_list *copy() && = delete;
  inline __isl_keep isl_qpolynomial_list *get() const;
  inline __isl_give isl_qpolynomial_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline qpolynomial_list add(qpolynomial el) const;
  static inline qpolynomial_list alloc(ctx ctx, int n);
  inline qpolynomial_list clear() const;
  inline qpolynomial_list concat(qpolynomial_list list2) const;
  inline qpolynomial_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(qpolynomial)> &fn) const;
  static inline qpolynomial_list from_qpolynomial(qpolynomial el);
  inline qpolynomial get_at(int index) const;
  inline qpolynomial get_qpolynomial(int index) const;
  inline qpolynomial_list insert(unsigned int pos, qpolynomial el) const;
  inline isl_size n_qpolynomial() const;
  inline qpolynomial_list reverse() const;
  inline qpolynomial_list set_qpolynomial(int index, qpolynomial el) const;
  inline isl_size size() const;
  inline qpolynomial_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::schedule
inline schedule manage(__isl_take isl_schedule *ptr);
inline schedule manage_copy(__isl_keep isl_schedule *ptr);

class schedule {
  friend inline schedule manage(__isl_take isl_schedule *ptr);
  friend inline schedule manage_copy(__isl_keep isl_schedule *ptr);

  isl_schedule *ptr = nullptr;

  inline explicit schedule(__isl_take isl_schedule *ptr);

public:
  inline /* implicit */ schedule();
  inline /* implicit */ schedule(const schedule &obj);
  inline explicit schedule(ctx ctx, const std::string &str);
  inline schedule &operator=(schedule obj);
  inline ~schedule();
  inline __isl_give isl_schedule *copy() const &;
  inline __isl_give isl_schedule *copy() && = delete;
  inline __isl_keep isl_schedule *get() const;
  inline __isl_give isl_schedule *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline schedule align_params(space space) const;
  static inline schedule empty(space space);
  static inline schedule from_domain(union_set domain);
  inline union_set get_domain() const;
  inline union_map get_map() const;
  inline schedule_node get_root() const;
  inline schedule gist_domain_params(set context) const;
  inline schedule insert_context(set context) const;
  inline schedule insert_guard(set guard) const;
  inline schedule insert_partial_schedule(multi_union_pw_aff partial) const;
  inline schedule intersect_domain(union_set domain) const;
  inline boolean plain_is_equal(const schedule &schedule2) const;
  inline schedule pullback(union_pw_multi_aff upma) const;
  inline schedule reset_user() const;
  inline schedule sequence(schedule schedule2) const;
};

// declarations for isl::schedule_constraints
inline schedule_constraints manage(__isl_take isl_schedule_constraints *ptr);
inline schedule_constraints manage_copy(__isl_keep isl_schedule_constraints *ptr);

class schedule_constraints {
  friend inline schedule_constraints manage(__isl_take isl_schedule_constraints *ptr);
  friend inline schedule_constraints manage_copy(__isl_keep isl_schedule_constraints *ptr);

  isl_schedule_constraints *ptr = nullptr;

  inline explicit schedule_constraints(__isl_take isl_schedule_constraints *ptr);

public:
  inline /* implicit */ schedule_constraints();
  inline /* implicit */ schedule_constraints(const schedule_constraints &obj);
  inline explicit schedule_constraints(ctx ctx, const std::string &str);
  inline schedule_constraints &operator=(schedule_constraints obj);
  inline ~schedule_constraints();
  inline __isl_give isl_schedule_constraints *copy() const &;
  inline __isl_give isl_schedule_constraints *copy() && = delete;
  inline __isl_keep isl_schedule_constraints *get() const;
  inline __isl_give isl_schedule_constraints *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline schedule_constraints apply(union_map umap) const;
  inline schedule compute_schedule() const;
  inline union_map get_coincidence() const;
  inline union_map get_conditional_validity() const;
  inline union_map get_conditional_validity_condition() const;
  inline set get_context() const;
  inline union_set get_domain() const;
  inline union_map get_proximity() const;
  inline union_map get_validity() const;
  static inline schedule_constraints on_domain(union_set domain);
  inline schedule_constraints set_coincidence(union_map coincidence) const;
  inline schedule_constraints set_conditional_validity(union_map condition, union_map validity) const;
  inline schedule_constraints set_context(set context) const;
  inline schedule_constraints set_proximity(union_map proximity) const;
  inline schedule_constraints set_validity(union_map validity) const;
};

// declarations for isl::schedule_node
inline schedule_node manage(__isl_take isl_schedule_node *ptr);
inline schedule_node manage_copy(__isl_keep isl_schedule_node *ptr);

class schedule_node {
  friend inline schedule_node manage(__isl_take isl_schedule_node *ptr);
  friend inline schedule_node manage_copy(__isl_keep isl_schedule_node *ptr);

  isl_schedule_node *ptr = nullptr;

  inline explicit schedule_node(__isl_take isl_schedule_node *ptr);

public:
  inline /* implicit */ schedule_node();
  inline /* implicit */ schedule_node(const schedule_node &obj);
  inline schedule_node &operator=(schedule_node obj);
  inline ~schedule_node();
  inline __isl_give isl_schedule_node *copy() const &;
  inline __isl_give isl_schedule_node *copy() && = delete;
  inline __isl_keep isl_schedule_node *get() const;
  inline __isl_give isl_schedule_node *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline schedule_node align_params(space space) const;
  inline schedule_node ancestor(int generation) const;
  inline boolean band_member_get_coincident(int pos) const;
  inline schedule_node band_member_set_coincident(int pos, int coincident) const;
  inline schedule_node band_set_ast_build_options(union_set options) const;
  inline schedule_node child(int pos) const;
  inline set context_get_context() const;
  inline schedule_node cut() const;
  inline union_set domain_get_domain() const;
  inline union_pw_multi_aff expansion_get_contraction() const;
  inline union_map expansion_get_expansion() const;
  inline union_map extension_get_extension() const;
  inline union_set filter_get_filter() const;
  inline schedule_node first_child() const;
  inline stat foreach_ancestor_top_down(const std::function<stat(schedule_node)> &fn) const;
  static inline schedule_node from_domain(union_set domain);
  static inline schedule_node from_extension(union_map extension);
  inline isl_size get_ancestor_child_position(const schedule_node &ancestor) const;
  inline schedule_node get_child(int pos) const;
  inline isl_size get_child_position() const;
  inline union_set get_domain() const;
  inline multi_union_pw_aff get_prefix_schedule_multi_union_pw_aff() const;
  inline union_map get_prefix_schedule_relation() const;
  inline union_map get_prefix_schedule_union_map() const;
  inline union_pw_multi_aff get_prefix_schedule_union_pw_multi_aff() const;
  inline schedule get_schedule() const;
  inline isl_size get_schedule_depth() const;
  inline schedule_node get_shared_ancestor(const schedule_node &node2) const;
  inline union_pw_multi_aff get_subtree_contraction() const;
  inline union_map get_subtree_expansion() const;
  inline union_map get_subtree_schedule_union_map() const;
  inline isl_size get_tree_depth() const;
  inline union_set get_universe_domain() const;
  inline schedule_node graft_after(schedule_node graft) const;
  inline schedule_node graft_before(schedule_node graft) const;
  inline schedule_node group(id group_id) const;
  inline set guard_get_guard() const;
  inline boolean has_children() const;
  inline boolean has_next_sibling() const;
  inline boolean has_parent() const;
  inline boolean has_previous_sibling() const;
  inline schedule_node insert_context(set context) const;
  inline schedule_node insert_filter(union_set filter) const;
  inline schedule_node insert_guard(set context) const;
  inline schedule_node insert_mark(id mark) const;
  inline schedule_node insert_partial_schedule(multi_union_pw_aff schedule) const;
  inline schedule_node insert_sequence(union_set_list filters) const;
  inline schedule_node insert_set(union_set_list filters) const;
  inline boolean is_equal(const schedule_node &node2) const;
  inline boolean is_subtree_anchored() const;
  inline id mark_get_id() const;
  inline isl_size n_children() const;
  inline schedule_node next_sibling() const;
  inline schedule_node order_after(union_set filter) const;
  inline schedule_node order_before(union_set filter) const;
  inline schedule_node parent() const;
  inline schedule_node previous_sibling() const;
  inline schedule_node reset_user() const;
  inline schedule_node root() const;
  inline schedule_node sequence_splice_child(int pos) const;
};

// declarations for isl::set
inline set manage(__isl_take isl_set *ptr);
inline set manage_copy(__isl_keep isl_set *ptr);

class set {
  friend inline set manage(__isl_take isl_set *ptr);
  friend inline set manage_copy(__isl_keep isl_set *ptr);

  isl_set *ptr = nullptr;

  inline explicit set(__isl_take isl_set *ptr);

public:
  inline /* implicit */ set();
  inline /* implicit */ set(const set &obj);
  inline /* implicit */ set(basic_set bset);
  inline /* implicit */ set(point pnt);
  inline explicit set(union_set uset);
  inline explicit set(ctx ctx, const std::string &str);
  inline set &operator=(set obj);
  inline ~set();
  inline __isl_give isl_set *copy() const &;
  inline __isl_give isl_set *copy() && = delete;
  inline __isl_keep isl_set *get() const;
  inline __isl_give isl_set *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline set add_constraint(constraint constraint) const;
  inline set add_dims(isl::dim type, unsigned int n) const;
  inline basic_set affine_hull() const;
  inline set align_params(space model) const;
  inline set apply(map map) const;
  inline set bind(multi_id tuple) const;
  inline basic_set bounded_simple_hull() const;
  static inline set box_from_points(point pnt1, point pnt2);
  inline set coalesce() const;
  inline basic_set coefficients() const;
  inline set complement() const;
  inline basic_set convex_hull() const;
  inline val count_val() const;
  inline set detect_equalities() const;
  inline isl_size dim(isl::dim type) const;
  inline boolean dim_has_any_lower_bound(isl::dim type, unsigned int pos) const;
  inline boolean dim_has_any_upper_bound(isl::dim type, unsigned int pos) const;
  inline boolean dim_has_lower_bound(isl::dim type, unsigned int pos) const;
  inline boolean dim_has_upper_bound(isl::dim type, unsigned int pos) const;
  inline boolean dim_is_bounded(isl::dim type, unsigned int pos) const;
  inline pw_aff dim_max(int pos) const;
  inline val dim_max_val(int pos) const;
  inline pw_aff dim_min(int pos) const;
  inline val dim_min_val(int pos) const;
  inline set drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline set drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline set drop_unused_params() const;
  inline set eliminate(isl::dim type, unsigned int first, unsigned int n) const;
  static inline set empty(space space);
  inline set equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
  inline int find_dim_by_id(isl::dim type, const id &id) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline set fix_si(isl::dim type, unsigned int pos, int value) const;
  inline set fix_val(isl::dim type, unsigned int pos, val v) const;
  inline set flat_product(set set2) const;
  inline set flatten() const;
  inline map flatten_map() const;
  inline int follows_at(const set &set2, int pos) const;
  inline stat foreach_basic_set(const std::function<stat(basic_set)> &fn) const;
  inline stat foreach_point(const std::function<stat(point)> &fn) const;
  static inline set from_multi_aff(multi_aff ma);
  static inline set from_multi_pw_aff(multi_pw_aff mpa);
  inline set from_params() const;
  static inline set from_pw_aff(pw_aff pwaff);
  static inline set from_pw_multi_aff(pw_multi_aff pma);
  inline basic_set_list get_basic_set_list() const;
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
  inline multi_val get_plain_multi_val_if_fixed() const;
  inline fixed_box get_simple_fixed_box_hull() const;
  inline space get_space() const;
  inline val get_stride(int pos) const;
  inline id get_tuple_id() const;
  inline std::string get_tuple_name() const;
  inline set gist(set context) const;
  inline set gist_basic_set(basic_set context) const;
  inline set gist_params(set context) const;
  inline boolean has_dim_id(isl::dim type, unsigned int pos) const;
  inline boolean has_dim_name(isl::dim type, unsigned int pos) const;
  inline boolean has_equal_space(const set &set2) const;
  inline boolean has_tuple_id() const;
  inline boolean has_tuple_name() const;
  inline map identity() const;
  inline pw_aff indicator_function() const;
  inline set insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
  inline map insert_domain(space domain) const;
  inline set intersect(set set2) const;
  inline set intersect_factor_domain(set domain) const;
  inline set intersect_factor_range(set range) const;
  inline set intersect_params(set params) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean involves_locals() const;
  inline boolean is_bounded() const;
  inline boolean is_box() const;
  inline boolean is_disjoint(const set &set2) const;
  inline boolean is_empty() const;
  inline boolean is_equal(const set &set2) const;
  inline boolean is_params() const;
  inline boolean is_singleton() const;
  inline boolean is_strict_subset(const set &set2) const;
  inline boolean is_subset(const set &set2) const;
  inline boolean is_wrapping() const;
  inline map lex_ge_set(set set2) const;
  inline map lex_gt_set(set set2) const;
  inline map lex_le_set(set set2) const;
  inline map lex_lt_set(set set2) const;
  inline set lexmax() const;
  inline pw_multi_aff lexmax_pw_multi_aff() const;
  inline set lexmin() const;
  inline pw_multi_aff lexmin_pw_multi_aff() const;
  inline set lower_bound(multi_pw_aff lower) const;
  inline set lower_bound(multi_val lower) const;
  inline set lower_bound_si(isl::dim type, unsigned int pos, int value) const;
  inline set lower_bound_val(isl::dim type, unsigned int pos, val value) const;
  inline multi_pw_aff max_multi_pw_aff() const;
  inline val max_val(const aff &obj) const;
  inline multi_pw_aff min_multi_pw_aff() const;
  inline val min_val(const aff &obj) const;
  inline set move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  inline isl_size n_basic_set() const;
  inline isl_size n_dim() const;
  static inline set nat_universe(space space);
  inline set neg() const;
  inline set params() const;
  inline int plain_cmp(const set &set2) const;
  inline val plain_get_val_if_fixed(isl::dim type, unsigned int pos) const;
  inline boolean plain_is_disjoint(const set &set2) const;
  inline boolean plain_is_empty() const;
  inline boolean plain_is_equal(const set &set2) const;
  inline boolean plain_is_universe() const;
  inline basic_set plain_unshifted_simple_hull() const;
  inline basic_set polyhedral_hull() const;
  inline set preimage(multi_aff ma) const;
  inline set preimage(multi_pw_aff mpa) const;
  inline set preimage(pw_multi_aff pma) const;
  inline set product(set set2) const;
  inline map project_onto_map(isl::dim type, unsigned int first, unsigned int n) const;
  inline set project_out(isl::dim type, unsigned int first, unsigned int n) const;
  inline set project_out_all_params() const;
  inline set project_out_param(id id) const;
  inline set project_out_param(id_list list) const;
  inline set remove_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline set remove_divs() const;
  inline set remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline set remove_redundancies() const;
  inline set remove_unknown_divs() const;
  inline set reset_space(space space) const;
  inline set reset_tuple_id() const;
  inline set reset_user() const;
  inline basic_set sample() const;
  inline point sample_point() const;
  inline set set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline set set_tuple_id(id id) const;
  inline set set_tuple_name(const std::string &s) const;
  inline basic_set simple_hull() const;
  inline int size() const;
  inline basic_set solutions() const;
  inline set split_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline set subtract(set set2) const;
  inline set sum(set set2) const;
  inline map translation() const;
  inline isl_size tuple_dim() const;
  inline set unbind_params(multi_id tuple) const;
  inline map unbind_params_insert_domain(multi_id domain) const;
  inline set unite(set set2) const;
  static inline set universe(space space);
  inline basic_set unshifted_simple_hull() const;
  inline basic_set unshifted_simple_hull_from_set_list(set_list list) const;
  inline map unwrap() const;
  inline set upper_bound(multi_pw_aff upper) const;
  inline set upper_bound(multi_val upper) const;
  inline set upper_bound_si(isl::dim type, unsigned int pos, int value) const;
  inline set upper_bound_val(isl::dim type, unsigned int pos, val value) const;
  inline map wrapped_domain_map() const;
};

// declarations for isl::set_list
inline set_list manage(__isl_take isl_set_list *ptr);
inline set_list manage_copy(__isl_keep isl_set_list *ptr);

class set_list {
  friend inline set_list manage(__isl_take isl_set_list *ptr);
  friend inline set_list manage_copy(__isl_keep isl_set_list *ptr);

  isl_set_list *ptr = nullptr;

  inline explicit set_list(__isl_take isl_set_list *ptr);

public:
  inline /* implicit */ set_list();
  inline /* implicit */ set_list(const set_list &obj);
  inline set_list &operator=(set_list obj);
  inline ~set_list();
  inline __isl_give isl_set_list *copy() const &;
  inline __isl_give isl_set_list *copy() && = delete;
  inline __isl_keep isl_set_list *get() const;
  inline __isl_give isl_set_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline set_list add(set el) const;
  static inline set_list alloc(ctx ctx, int n);
  inline set_list clear() const;
  inline set_list concat(set_list list2) const;
  inline set_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(set)> &fn) const;
  static inline set_list from_set(set el);
  inline set get_at(int index) const;
  inline set get_set(int index) const;
  inline set_list insert(unsigned int pos, set el) const;
  inline isl_size n_set() const;
  inline set_list reverse() const;
  inline set_list set_set(int index, set el) const;
  inline isl_size size() const;
  inline set_list swap(unsigned int pos1, unsigned int pos2) const;
  inline set unite() const;
};

// declarations for isl::space
inline space manage(__isl_take isl_space *ptr);
inline space manage_copy(__isl_keep isl_space *ptr);

class space {
  friend inline space manage(__isl_take isl_space *ptr);
  friend inline space manage_copy(__isl_keep isl_space *ptr);

  isl_space *ptr = nullptr;

  inline explicit space(__isl_take isl_space *ptr);

public:
  inline /* implicit */ space();
  inline /* implicit */ space(const space &obj);
  inline explicit space(ctx ctx, unsigned int nparam, unsigned int n_in, unsigned int n_out);
  inline explicit space(ctx ctx, unsigned int nparam, unsigned int dim);
  inline space &operator=(space obj);
  inline ~space();
  inline __isl_give isl_space *copy() const &;
  inline __isl_give isl_space *copy() && = delete;
  inline __isl_keep isl_space *get() const;
  inline __isl_give isl_space *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline space add_dims(isl::dim type, unsigned int n) const;
  inline space add_named_tuple(id tuple_id, unsigned int dim) const;
  inline space add_param_id(id id) const;
  inline space add_unnamed_tuple(unsigned int dim) const;
  inline space align_params(space space2) const;
  inline boolean can_curry() const;
  inline boolean can_range_curry() const;
  inline boolean can_uncurry() const;
  inline boolean can_zip() const;
  inline space curry() const;
  inline isl_size dim(isl::dim type) const;
  inline space domain() const;
  inline space domain_factor_domain() const;
  inline space domain_factor_range() const;
  inline boolean domain_is_wrapping() const;
  inline space domain_map() const;
  inline space domain_product(space right) const;
  inline space drop_all_params() const;
  inline space drop_dims(isl::dim type, unsigned int first, unsigned int num) const;
  inline space factor_domain() const;
  inline space factor_range() const;
  inline int find_dim_by_id(isl::dim type, const id &id) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline space flatten_domain() const;
  inline space flatten_range() const;
  inline space from_domain() const;
  inline space from_range() const;
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline std::string get_dim_name(isl::dim type, unsigned int pos) const;
  inline id get_tuple_id(isl::dim type) const;
  inline std::string get_tuple_name(isl::dim type) const;
  inline boolean has_dim_id(isl::dim type, unsigned int pos) const;
  inline boolean has_dim_name(isl::dim type, unsigned int pos) const;
  inline boolean has_equal_params(const space &space2) const;
  inline boolean has_equal_tuples(const space &space2) const;
  inline boolean has_tuple_id(isl::dim type) const;
  inline boolean has_tuple_name(isl::dim type) const;
  inline space insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
  inline boolean is_domain(const space &space2) const;
  inline boolean is_equal(const space &space2) const;
  inline boolean is_map() const;
  inline boolean is_params() const;
  inline boolean is_product() const;
  inline boolean is_range(const space &space2) const;
  inline boolean is_set() const;
  inline boolean is_wrapping() const;
  inline space join(space right) const;
  inline space map_from_domain_and_range(space range) const;
  inline space map_from_set() const;
  inline space move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
  inline space params() const;
  static inline space params_alloc(ctx ctx, unsigned int nparam);
  inline space product(space right) const;
  inline space range() const;
  inline space range_curry() const;
  inline space range_factor_domain() const;
  inline space range_factor_range() const;
  inline boolean range_is_wrapping() const;
  inline space range_map() const;
  inline space range_product(space right) const;
  inline space range_reverse() const;
  inline space reset_tuple_id(isl::dim type) const;
  inline space reset_user() const;
  inline space reverse() const;
  inline space set_dim_id(isl::dim type, unsigned int pos, id id) const;
  inline space set_from_params() const;
  inline space set_tuple_id(isl::dim type, id id) const;
  inline space set_tuple_name(isl::dim type, const std::string &s) const;
  inline boolean tuple_is_equal(isl::dim type1, const space &space2, isl::dim type2) const;
  inline space uncurry() const;
  static inline space unit(ctx ctx);
  inline space unwrap() const;
  inline space wrap() const;
  inline space zip() const;
};

// declarations for isl::term
inline term manage(__isl_take isl_term *ptr);
inline term manage_copy(__isl_keep isl_term *ptr);

class term {
  friend inline term manage(__isl_take isl_term *ptr);
  friend inline term manage_copy(__isl_keep isl_term *ptr);

  isl_term *ptr = nullptr;

  inline explicit term(__isl_take isl_term *ptr);

public:
  inline /* implicit */ term();
  inline /* implicit */ term(const term &obj);
  inline term &operator=(term obj);
  inline ~term();
  inline __isl_give isl_term *copy() const &;
  inline __isl_give isl_term *copy() && = delete;
  inline __isl_keep isl_term *get() const;
  inline __isl_give isl_term *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;

  inline isl_size dim(isl::dim type) const;
  inline val get_coefficient_val() const;
  inline aff get_div(unsigned int pos) const;
  inline isl_size get_exp(isl::dim type, unsigned int pos) const;
};

// declarations for isl::union_access_info
inline union_access_info manage(__isl_take isl_union_access_info *ptr);
inline union_access_info manage_copy(__isl_keep isl_union_access_info *ptr);

class union_access_info {
  friend inline union_access_info manage(__isl_take isl_union_access_info *ptr);
  friend inline union_access_info manage_copy(__isl_keep isl_union_access_info *ptr);

  isl_union_access_info *ptr = nullptr;

  inline explicit union_access_info(__isl_take isl_union_access_info *ptr);

public:
  inline /* implicit */ union_access_info();
  inline /* implicit */ union_access_info(const union_access_info &obj);
  inline explicit union_access_info(union_map sink);
  inline union_access_info &operator=(union_access_info obj);
  inline ~union_access_info();
  inline __isl_give isl_union_access_info *copy() const &;
  inline __isl_give isl_union_access_info *copy() && = delete;
  inline __isl_keep isl_union_access_info *get() const;
  inline __isl_give isl_union_access_info *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;

  inline union_flow compute_flow() const;
  inline union_access_info set_kill(union_map kill) const;
  inline union_access_info set_may_source(union_map may_source) const;
  inline union_access_info set_must_source(union_map must_source) const;
  inline union_access_info set_schedule(schedule schedule) const;
  inline union_access_info set_schedule_map(union_map schedule_map) const;
};

// declarations for isl::union_flow
inline union_flow manage(__isl_take isl_union_flow *ptr);
inline union_flow manage_copy(__isl_keep isl_union_flow *ptr);

class union_flow {
  friend inline union_flow manage(__isl_take isl_union_flow *ptr);
  friend inline union_flow manage_copy(__isl_keep isl_union_flow *ptr);

  isl_union_flow *ptr = nullptr;

  inline explicit union_flow(__isl_take isl_union_flow *ptr);

public:
  inline /* implicit */ union_flow();
  inline /* implicit */ union_flow(const union_flow &obj);
  inline union_flow &operator=(union_flow obj);
  inline ~union_flow();
  inline __isl_give isl_union_flow *copy() const &;
  inline __isl_give isl_union_flow *copy() && = delete;
  inline __isl_keep isl_union_flow *get() const;
  inline __isl_give isl_union_flow *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;

  inline union_map get_full_may_dependence() const;
  inline union_map get_full_must_dependence() const;
  inline union_map get_may_dependence() const;
  inline union_map get_may_no_source() const;
  inline union_map get_must_dependence() const;
  inline union_map get_must_no_source() const;
};

// declarations for isl::union_map
inline union_map manage(__isl_take isl_union_map *ptr);
inline union_map manage_copy(__isl_keep isl_union_map *ptr);

class union_map {
  friend inline union_map manage(__isl_take isl_union_map *ptr);
  friend inline union_map manage_copy(__isl_keep isl_union_map *ptr);

  isl_union_map *ptr = nullptr;

  inline explicit union_map(__isl_take isl_union_map *ptr);

public:
  inline /* implicit */ union_map();
  inline /* implicit */ union_map(const union_map &obj);
  inline /* implicit */ union_map(basic_map bmap);
  inline /* implicit */ union_map(map map);
  inline explicit union_map(union_pw_multi_aff upma);
  inline explicit union_map(ctx ctx, const std::string &str);
  inline union_map &operator=(union_map obj);
  inline ~union_map();
  inline __isl_give isl_union_map *copy() const &;
  inline __isl_give isl_union_map *copy() && = delete;
  inline __isl_keep isl_union_map *get() const;
  inline __isl_give isl_union_map *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline union_map add_map(map map) const;
  inline union_map affine_hull() const;
  inline union_map align_params(space model) const;
  inline union_map apply_domain(union_map umap2) const;
  inline union_map apply_range(union_map umap2) const;
  inline union_set bind_range(multi_id tuple) const;
  inline union_map coalesce() const;
  inline boolean contains(const space &space) const;
  inline union_map curry() const;
  inline union_set deltas() const;
  inline union_map deltas_map() const;
  inline union_map detect_equalities() const;
  inline isl_size dim(isl::dim type) const;
  inline union_set domain() const;
  inline union_map domain_factor_domain() const;
  inline union_map domain_factor_range() const;
  inline union_map domain_map() const;
  inline union_pw_multi_aff domain_map_union_pw_multi_aff() const;
  inline union_map domain_product(union_map umap2) const;
  static inline union_map empty(space space);
  static inline union_map empty(ctx ctx);
  static inline union_map empty_space(space space);
  inline union_map eq_at(multi_union_pw_aff mupa) const;
  inline map extract_map(space space) const;
  inline union_map factor_domain() const;
  inline union_map factor_range() const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline union_map fixed_power(val exp) const;
  inline union_map flat_domain_product(union_map umap2) const;
  inline union_map flat_range_product(union_map umap2) const;
  inline stat foreach_map(const std::function<stat(map)> &fn) const;
  static inline union_map from(multi_union_pw_aff mupa);
  static inline union_map from_domain(union_set uset);
  static inline union_map from_domain_and_range(union_set domain, union_set range);
  static inline union_map from_range(union_set uset);
  static inline union_map from_union_pw_aff(union_pw_aff upa);
  inline id get_dim_id(isl::dim type, unsigned int pos) const;
  inline uint32_t get_hash() const;
  inline map_list get_map_list() const;
  inline space get_space() const;
  inline union_map gist(union_map context) const;
  inline union_map gist_domain(union_set uset) const;
  inline union_map gist_params(set set) const;
  inline union_map gist_range(union_set uset) const;
  inline union_map intersect(union_map umap2) const;
  inline union_map intersect_domain(space space) const;
  inline union_map intersect_domain(union_set uset) const;
  inline union_map intersect_domain_factor_domain(union_map factor) const;
  inline union_map intersect_domain_factor_range(union_map factor) const;
  inline union_map intersect_params(set set) const;
  inline union_map intersect_range(space space) const;
  inline union_map intersect_range(union_set uset) const;
  inline union_map intersect_range_factor_domain(union_map factor) const;
  inline union_map intersect_range_factor_range(union_map factor) const;
  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline boolean is_bijective() const;
  inline boolean is_disjoint(const union_map &umap2) const;
  inline boolean is_empty() const;
  inline boolean is_equal(const union_map &umap2) const;
  inline boolean is_identity() const;
  inline boolean is_injective() const;
  inline boolean is_single_valued() const;
  inline boolean is_strict_subset(const union_map &umap2) const;
  inline boolean is_subset(const union_map &umap2) const;
  inline boolean isa_map() const;
  inline union_map lex_ge_at_multi_union_pw_aff(multi_union_pw_aff mupa) const;
  inline union_map lex_ge_union_map(union_map umap2) const;
  inline union_map lex_gt_at_multi_union_pw_aff(multi_union_pw_aff mupa) const;
  inline union_map lex_gt_union_map(union_map umap2) const;
  inline union_map lex_le_at_multi_union_pw_aff(multi_union_pw_aff mupa) const;
  inline union_map lex_le_union_map(union_map umap2) const;
  inline union_map lex_lt_at_multi_union_pw_aff(multi_union_pw_aff mupa) const;
  inline union_map lex_lt_union_map(union_map umap2) const;
  inline union_map lexmax() const;
  inline union_map lexmin() const;
  inline isl_size n_map() const;
  inline set params() const;
  inline boolean plain_is_empty() const;
  inline boolean plain_is_injective() const;
  inline union_map polyhedral_hull() const;
  inline union_map preimage_domain(multi_aff ma) const;
  inline union_map preimage_domain(multi_pw_aff mpa) const;
  inline union_map preimage_domain(pw_multi_aff pma) const;
  inline union_map preimage_domain(union_pw_multi_aff upma) const;
  inline union_map preimage_range(multi_aff ma) const;
  inline union_map preimage_range(pw_multi_aff pma) const;
  inline union_map preimage_range(union_pw_multi_aff upma) const;
  inline union_map product(union_map umap2) const;
  inline union_map project_out(isl::dim type, unsigned int first, unsigned int n) const;
  inline union_map project_out_all_params() const;
  inline union_set range() const;
  inline union_map range_curry() const;
  inline union_map range_factor_domain() const;
  inline union_map range_factor_range() const;
  inline union_map range_map() const;
  inline union_map range_product(union_map umap2) const;
  inline union_map range_reverse() const;
  inline union_map remove_divs() const;
  inline union_map remove_redundancies() const;
  inline union_map reset_user() const;
  inline union_map reverse() const;
  inline basic_map sample() const;
  inline union_map simple_hull() const;
  inline union_map subtract(union_map umap2) const;
  inline union_map subtract_domain(union_set dom) const;
  inline union_map subtract_range(union_set dom) const;
  inline union_map uncurry() const;
  inline union_map unite(union_map umap2) const;
  inline union_map universe() const;
  inline union_set wrap() const;
  inline union_map zip() const;
};

// declarations for isl::union_map_list
inline union_map_list manage(__isl_take isl_union_map_list *ptr);
inline union_map_list manage_copy(__isl_keep isl_union_map_list *ptr);

class union_map_list {
  friend inline union_map_list manage(__isl_take isl_union_map_list *ptr);
  friend inline union_map_list manage_copy(__isl_keep isl_union_map_list *ptr);

  isl_union_map_list *ptr = nullptr;

  inline explicit union_map_list(__isl_take isl_union_map_list *ptr);

public:
  inline /* implicit */ union_map_list();
  inline /* implicit */ union_map_list(const union_map_list &obj);
  inline union_map_list &operator=(union_map_list obj);
  inline ~union_map_list();
  inline __isl_give isl_union_map_list *copy() const &;
  inline __isl_give isl_union_map_list *copy() && = delete;
  inline __isl_keep isl_union_map_list *get() const;
  inline __isl_give isl_union_map_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline union_map_list add(union_map el) const;
  static inline union_map_list alloc(ctx ctx, int n);
  inline union_map_list clear() const;
  inline union_map_list concat(union_map_list list2) const;
  inline union_map_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(union_map)> &fn) const;
  static inline union_map_list from_union_map(union_map el);
  inline union_map get_at(int index) const;
  inline union_map get_union_map(int index) const;
  inline union_map_list insert(unsigned int pos, union_map el) const;
  inline isl_size n_union_map() const;
  inline union_map_list reverse() const;
  inline union_map_list set_union_map(int index, union_map el) const;
  inline isl_size size() const;
  inline union_map_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::union_pw_aff
inline union_pw_aff manage(__isl_take isl_union_pw_aff *ptr);
inline union_pw_aff manage_copy(__isl_keep isl_union_pw_aff *ptr);

class union_pw_aff {
  friend inline union_pw_aff manage(__isl_take isl_union_pw_aff *ptr);
  friend inline union_pw_aff manage_copy(__isl_keep isl_union_pw_aff *ptr);

  isl_union_pw_aff *ptr = nullptr;

  inline explicit union_pw_aff(__isl_take isl_union_pw_aff *ptr);

public:
  inline /* implicit */ union_pw_aff();
  inline /* implicit */ union_pw_aff(const union_pw_aff &obj);
  inline /* implicit */ union_pw_aff(aff aff);
  inline /* implicit */ union_pw_aff(pw_aff pa);
  inline explicit union_pw_aff(ctx ctx, const std::string &str);
  inline explicit union_pw_aff(union_set domain, val v);
  inline union_pw_aff &operator=(union_pw_aff obj);
  inline ~union_pw_aff();
  inline __isl_give isl_union_pw_aff *copy() const &;
  inline __isl_give isl_union_pw_aff *copy() && = delete;
  inline __isl_keep isl_union_pw_aff *get() const;
  inline __isl_give isl_union_pw_aff *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline union_pw_aff add(union_pw_aff upa2) const;
  inline union_pw_aff add_pw_aff(pw_aff pa) const;
  static inline union_pw_aff aff_on_domain(union_set domain, aff aff);
  inline union_pw_aff align_params(space model) const;
  inline union_set bind(id id) const;
  inline union_pw_aff coalesce() const;
  inline isl_size dim(isl::dim type) const;
  inline union_set domain() const;
  inline union_pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  static inline union_pw_aff empty(space space);
  static inline union_pw_aff empty_ctx(ctx ctx);
  static inline union_pw_aff empty_space(space space);
  inline pw_aff extract_pw_aff(space space) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline union_pw_aff floor() const;
  inline stat foreach_pw_aff(const std::function<stat(pw_aff)> &fn) const;
  inline pw_aff_list get_pw_aff_list() const;
  inline space get_space() const;
  inline union_pw_aff gist(union_set context) const;
  inline union_pw_aff gist_params(set context) const;
  inline union_pw_aff intersect_domain(space space) const;
  inline union_pw_aff intersect_domain(union_set uset) const;
  inline union_pw_aff intersect_domain_wrapped_domain(union_set uset) const;
  inline union_pw_aff intersect_domain_wrapped_range(union_set uset) const;
  inline union_pw_aff intersect_params(set set) const;
  inline boolean involves_nan() const;
  inline val max_val() const;
  inline val min_val() const;
  inline union_pw_aff mod_val(val f) const;
  inline isl_size n_pw_aff() const;
  inline union_pw_aff neg() const;
  static inline union_pw_aff param_on_domain_id(union_set domain, id id);
  inline boolean plain_is_equal(const union_pw_aff &upa2) const;
  inline union_pw_aff pullback(union_pw_multi_aff upma) const;
  static inline union_pw_aff pw_aff_on_domain(union_set domain, pw_aff pa);
  inline union_pw_aff reset_user() const;
  inline union_pw_aff scale_down_val(val v) const;
  inline union_pw_aff scale_val(val v) const;
  inline union_pw_aff sub(union_pw_aff upa2) const;
  inline union_pw_aff subtract_domain(space space) const;
  inline union_pw_aff subtract_domain(union_set uset) const;
  inline union_pw_aff union_add(union_pw_aff upa2) const;
  inline union_set zero_union_set() const;
};

// declarations for isl::union_pw_aff_list
inline union_pw_aff_list manage(__isl_take isl_union_pw_aff_list *ptr);
inline union_pw_aff_list manage_copy(__isl_keep isl_union_pw_aff_list *ptr);

class union_pw_aff_list {
  friend inline union_pw_aff_list manage(__isl_take isl_union_pw_aff_list *ptr);
  friend inline union_pw_aff_list manage_copy(__isl_keep isl_union_pw_aff_list *ptr);

  isl_union_pw_aff_list *ptr = nullptr;

  inline explicit union_pw_aff_list(__isl_take isl_union_pw_aff_list *ptr);

public:
  inline /* implicit */ union_pw_aff_list();
  inline /* implicit */ union_pw_aff_list(const union_pw_aff_list &obj);
  inline union_pw_aff_list &operator=(union_pw_aff_list obj);
  inline ~union_pw_aff_list();
  inline __isl_give isl_union_pw_aff_list *copy() const &;
  inline __isl_give isl_union_pw_aff_list *copy() && = delete;
  inline __isl_keep isl_union_pw_aff_list *get() const;
  inline __isl_give isl_union_pw_aff_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline union_pw_aff_list add(union_pw_aff el) const;
  static inline union_pw_aff_list alloc(ctx ctx, int n);
  inline union_pw_aff_list clear() const;
  inline union_pw_aff_list concat(union_pw_aff_list list2) const;
  inline union_pw_aff_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(union_pw_aff)> &fn) const;
  static inline union_pw_aff_list from_union_pw_aff(union_pw_aff el);
  inline union_pw_aff get_at(int index) const;
  inline union_pw_aff get_union_pw_aff(int index) const;
  inline union_pw_aff_list insert(unsigned int pos, union_pw_aff el) const;
  inline isl_size n_union_pw_aff() const;
  inline union_pw_aff_list reverse() const;
  inline union_pw_aff_list set_union_pw_aff(int index, union_pw_aff el) const;
  inline isl_size size() const;
  inline union_pw_aff_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::union_pw_multi_aff
inline union_pw_multi_aff manage(__isl_take isl_union_pw_multi_aff *ptr);
inline union_pw_multi_aff manage_copy(__isl_keep isl_union_pw_multi_aff *ptr);

class union_pw_multi_aff {
  friend inline union_pw_multi_aff manage(__isl_take isl_union_pw_multi_aff *ptr);
  friend inline union_pw_multi_aff manage_copy(__isl_keep isl_union_pw_multi_aff *ptr);

  isl_union_pw_multi_aff *ptr = nullptr;

  inline explicit union_pw_multi_aff(__isl_take isl_union_pw_multi_aff *ptr);

public:
  inline /* implicit */ union_pw_multi_aff();
  inline /* implicit */ union_pw_multi_aff(const union_pw_multi_aff &obj);
  inline /* implicit */ union_pw_multi_aff(aff aff);
  inline explicit union_pw_multi_aff(union_set uset);
  inline /* implicit */ union_pw_multi_aff(multi_aff ma);
  inline explicit union_pw_multi_aff(multi_union_pw_aff mupa);
  inline /* implicit */ union_pw_multi_aff(pw_multi_aff pma);
  inline explicit union_pw_multi_aff(union_map umap);
  inline /* implicit */ union_pw_multi_aff(union_pw_aff upa);
  inline explicit union_pw_multi_aff(ctx ctx, const std::string &str);
  inline union_pw_multi_aff &operator=(union_pw_multi_aff obj);
  inline ~union_pw_multi_aff();
  inline __isl_give isl_union_pw_multi_aff *copy() const &;
  inline __isl_give isl_union_pw_multi_aff *copy() && = delete;
  inline __isl_keep isl_union_pw_multi_aff *get() const;
  inline __isl_give isl_union_pw_multi_aff *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline union_pw_multi_aff add(union_pw_multi_aff upma2) const;
  inline union_pw_multi_aff add_pw_multi_aff(pw_multi_aff pma) const;
  inline union_pw_multi_aff align_params(space model) const;
  inline union_pw_multi_aff apply(union_pw_multi_aff upma2) const;
  inline pw_multi_aff as_pw_multi_aff() const;
  inline union_pw_multi_aff coalesce() const;
  inline isl_size dim(isl::dim type) const;
  inline union_set domain() const;
  inline union_pw_multi_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  static inline union_pw_multi_aff empty(space space);
  static inline union_pw_multi_aff empty(ctx ctx);
  static inline union_pw_multi_aff empty_space(space space);
  inline pw_multi_aff extract_pw_multi_aff(space space) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline union_pw_multi_aff flat_range_product(union_pw_multi_aff upma2) const;
  inline stat foreach_pw_multi_aff(const std::function<stat(pw_multi_aff)> &fn) const;
  static inline union_pw_multi_aff from_union_set(union_set uset);
  inline pw_multi_aff_list get_pw_multi_aff_list() const;
  inline space get_space() const;
  inline union_pw_aff get_union_pw_aff(int pos) const;
  inline union_pw_multi_aff gist(union_set context) const;
  inline union_pw_multi_aff gist_params(set context) const;
  inline union_pw_multi_aff intersect_domain(space space) const;
  inline union_pw_multi_aff intersect_domain(union_set uset) const;
  inline union_pw_multi_aff intersect_domain_wrapped_domain(union_set uset) const;
  inline union_pw_multi_aff intersect_domain_wrapped_range(union_set uset) const;
  inline union_pw_multi_aff intersect_params(set set) const;
  inline boolean involves_locals() const;
  inline boolean involves_nan() const;
  inline boolean isa_pw_multi_aff() const;
  static inline union_pw_multi_aff multi_val_on_domain(union_set domain, multi_val mv);
  inline isl_size n_pw_multi_aff() const;
  inline union_pw_multi_aff neg() const;
  inline boolean plain_is_empty() const;
  inline boolean plain_is_equal(const union_pw_multi_aff &upma2) const;
  inline union_pw_multi_aff preimage_domain_wrapped_domain(union_pw_multi_aff upma2) const;
  inline union_pw_multi_aff pullback(union_pw_multi_aff upma2) const;
  inline union_pw_multi_aff range_factor_domain() const;
  inline union_pw_multi_aff range_factor_range() const;
  inline union_pw_multi_aff range_product(union_pw_multi_aff upma2) const;
  inline union_pw_multi_aff reset_user() const;
  inline union_pw_multi_aff scale_down_val(val val) const;
  inline union_pw_multi_aff scale_multi_val(multi_val mv) const;
  inline union_pw_multi_aff scale_val(val val) const;
  inline union_pw_multi_aff sub(union_pw_multi_aff upma2) const;
  inline union_pw_multi_aff subtract_domain(space space) const;
  inline union_pw_multi_aff subtract_domain(union_set uset) const;
  inline union_pw_multi_aff union_add(union_pw_multi_aff upma2) const;
};

// declarations for isl::union_pw_multi_aff_list
inline union_pw_multi_aff_list manage(__isl_take isl_union_pw_multi_aff_list *ptr);
inline union_pw_multi_aff_list manage_copy(__isl_keep isl_union_pw_multi_aff_list *ptr);

class union_pw_multi_aff_list {
  friend inline union_pw_multi_aff_list manage(__isl_take isl_union_pw_multi_aff_list *ptr);
  friend inline union_pw_multi_aff_list manage_copy(__isl_keep isl_union_pw_multi_aff_list *ptr);

  isl_union_pw_multi_aff_list *ptr = nullptr;

  inline explicit union_pw_multi_aff_list(__isl_take isl_union_pw_multi_aff_list *ptr);

public:
  inline /* implicit */ union_pw_multi_aff_list();
  inline /* implicit */ union_pw_multi_aff_list(const union_pw_multi_aff_list &obj);
  inline union_pw_multi_aff_list &operator=(union_pw_multi_aff_list obj);
  inline ~union_pw_multi_aff_list();
  inline __isl_give isl_union_pw_multi_aff_list *copy() const &;
  inline __isl_give isl_union_pw_multi_aff_list *copy() && = delete;
  inline __isl_keep isl_union_pw_multi_aff_list *get() const;
  inline __isl_give isl_union_pw_multi_aff_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline union_pw_multi_aff_list add(union_pw_multi_aff el) const;
  static inline union_pw_multi_aff_list alloc(ctx ctx, int n);
  inline union_pw_multi_aff_list clear() const;
  inline union_pw_multi_aff_list concat(union_pw_multi_aff_list list2) const;
  inline union_pw_multi_aff_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(union_pw_multi_aff)> &fn) const;
  static inline union_pw_multi_aff_list from_union_pw_multi_aff(union_pw_multi_aff el);
  inline union_pw_multi_aff get_at(int index) const;
  inline union_pw_multi_aff get_union_pw_multi_aff(int index) const;
  inline union_pw_multi_aff_list insert(unsigned int pos, union_pw_multi_aff el) const;
  inline isl_size n_union_pw_multi_aff() const;
  inline union_pw_multi_aff_list reverse() const;
  inline union_pw_multi_aff_list set_union_pw_multi_aff(int index, union_pw_multi_aff el) const;
  inline isl_size size() const;
  inline union_pw_multi_aff_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::union_pw_qpolynomial
inline union_pw_qpolynomial manage(__isl_take isl_union_pw_qpolynomial *ptr);
inline union_pw_qpolynomial manage_copy(__isl_keep isl_union_pw_qpolynomial *ptr);

class union_pw_qpolynomial {
  friend inline union_pw_qpolynomial manage(__isl_take isl_union_pw_qpolynomial *ptr);
  friend inline union_pw_qpolynomial manage_copy(__isl_keep isl_union_pw_qpolynomial *ptr);

  isl_union_pw_qpolynomial *ptr = nullptr;

  inline explicit union_pw_qpolynomial(__isl_take isl_union_pw_qpolynomial *ptr);

public:
  inline /* implicit */ union_pw_qpolynomial();
  inline /* implicit */ union_pw_qpolynomial(const union_pw_qpolynomial &obj);
  inline explicit union_pw_qpolynomial(ctx ctx, const std::string &str);
  inline union_pw_qpolynomial &operator=(union_pw_qpolynomial obj);
  inline ~union_pw_qpolynomial();
  inline __isl_give isl_union_pw_qpolynomial *copy() const &;
  inline __isl_give isl_union_pw_qpolynomial *copy() && = delete;
  inline __isl_keep isl_union_pw_qpolynomial *get() const;
  inline __isl_give isl_union_pw_qpolynomial *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;

  inline union_pw_qpolynomial add(union_pw_qpolynomial upwqp2) const;
  inline union_pw_qpolynomial add_pw_qpolynomial(pw_qpolynomial pwqp) const;
  inline union_pw_qpolynomial align_params(space model) const;
  inline union_pw_qpolynomial coalesce() const;
  inline isl_size dim(isl::dim type) const;
  inline union_set domain() const;
  inline union_pw_qpolynomial drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
  inline val eval(point pnt) const;
  inline pw_qpolynomial extract_pw_qpolynomial(space space) const;
  inline int find_dim_by_name(isl::dim type, const std::string &name) const;
  inline stat foreach_pw_qpolynomial(const std::function<stat(pw_qpolynomial)> &fn) const;
  static inline union_pw_qpolynomial from_pw_qpolynomial(pw_qpolynomial pwqp);
  inline pw_qpolynomial_list get_pw_qpolynomial_list() const;
  inline space get_space() const;
  inline union_pw_qpolynomial gist(union_set context) const;
  inline union_pw_qpolynomial gist_params(set context) const;
  inline union_pw_qpolynomial intersect_domain(union_set uset) const;
  inline union_pw_qpolynomial intersect_domain_space(space space) const;
  inline union_pw_qpolynomial intersect_domain_union_set(union_set uset) const;
  inline union_pw_qpolynomial intersect_domain_wrapped_domain(union_set uset) const;
  inline union_pw_qpolynomial intersect_domain_wrapped_range(union_set uset) const;
  inline union_pw_qpolynomial intersect_params(set set) const;
  inline boolean involves_nan() const;
  inline union_pw_qpolynomial mul(union_pw_qpolynomial upwqp2) const;
  inline isl_size n_pw_qpolynomial() const;
  inline union_pw_qpolynomial neg() const;
  inline boolean plain_is_equal(const union_pw_qpolynomial &upwqp2) const;
  inline union_pw_qpolynomial reset_user() const;
  inline union_pw_qpolynomial scale_down_val(val v) const;
  inline union_pw_qpolynomial scale_val(val v) const;
  inline union_pw_qpolynomial sub(union_pw_qpolynomial upwqp2) const;
  inline union_pw_qpolynomial subtract_domain(union_set uset) const;
  inline union_pw_qpolynomial subtract_domain_space(space space) const;
  inline union_pw_qpolynomial subtract_domain_union_set(union_set uset) const;
  inline union_pw_qpolynomial to_polynomial(int sign) const;
  static inline union_pw_qpolynomial zero(space space);
  static inline union_pw_qpolynomial zero_ctx(ctx ctx);
  static inline union_pw_qpolynomial zero_space(space space);
};

// declarations for isl::union_set
inline union_set manage(__isl_take isl_union_set *ptr);
inline union_set manage_copy(__isl_keep isl_union_set *ptr);

class union_set {
  friend inline union_set manage(__isl_take isl_union_set *ptr);
  friend inline union_set manage_copy(__isl_keep isl_union_set *ptr);

  isl_union_set *ptr = nullptr;

  inline explicit union_set(__isl_take isl_union_set *ptr);

public:
  inline /* implicit */ union_set();
  inline /* implicit */ union_set(const union_set &obj);
  inline /* implicit */ union_set(basic_set bset);
  inline /* implicit */ union_set(point pnt);
  inline /* implicit */ union_set(set set);
  inline explicit union_set(ctx ctx, const std::string &str);
  inline union_set &operator=(union_set obj);
  inline ~union_set();
  inline __isl_give isl_union_set *copy() const &;
  inline __isl_give isl_union_set *copy() && = delete;
  inline __isl_keep isl_union_set *get() const;
  inline __isl_give isl_union_set *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline union_set add_set(set set) const;
  inline union_set affine_hull() const;
  inline union_set align_params(space model) const;
  inline union_set apply(union_map umap) const;
  inline union_set coalesce() const;
  inline union_set coefficients() const;
  inline schedule compute_schedule(union_map validity, union_map proximity) const;
  inline boolean contains(const space &space) const;
  inline union_set detect_equalities() const;
  inline isl_size dim(isl::dim type) const;
  static inline union_set empty(space space);
  static inline union_set empty(ctx ctx);
  static inline union_set empty_space(space space);
  inline set extract_set(space space) const;
  inline stat foreach_point(const std::function<stat(point)> &fn) const;
  inline stat foreach_set(const std::function<stat(set)> &fn) const;
  inline basic_set_list get_basic_set_list() const;
  inline uint32_t get_hash() const;
  inline set_list get_set_list() const;
  inline space get_space() const;
  inline union_set gist(union_set context) const;
  inline union_set gist_params(set set) const;
  inline union_map identity() const;
  inline union_pw_multi_aff identity_union_pw_multi_aff() const;
  inline union_set intersect(union_set uset2) const;
  inline union_set intersect_params(set set) const;
  inline boolean is_disjoint(const union_set &uset2) const;
  inline boolean is_empty() const;
  inline boolean is_equal(const union_set &uset2) const;
  inline boolean is_params() const;
  inline boolean is_strict_subset(const union_set &uset2) const;
  inline boolean is_subset(const union_set &uset2) const;
  inline boolean isa_set() const;
  inline union_map lex_ge_union_set(union_set uset2) const;
  inline union_map lex_gt_union_set(union_set uset2) const;
  inline union_map lex_le_union_set(union_set uset2) const;
  inline union_map lex_lt_union_set(union_set uset2) const;
  inline union_set lexmax() const;
  inline union_set lexmin() const;
  inline multi_val min_multi_union_pw_aff(const multi_union_pw_aff &obj) const;
  inline isl_size n_set() const;
  inline set params() const;
  inline union_set polyhedral_hull() const;
  inline union_set preimage(multi_aff ma) const;
  inline union_set preimage(pw_multi_aff pma) const;
  inline union_set preimage(union_pw_multi_aff upma) const;
  inline union_set product(union_set uset2) const;
  inline union_set project_out(isl::dim type, unsigned int first, unsigned int n) const;
  inline union_set project_out_all_params() const;
  inline union_set remove_divs() const;
  inline union_set remove_redundancies() const;
  inline union_set reset_user() const;
  inline basic_set sample() const;
  inline point sample_point() const;
  inline union_set simple_hull() const;
  inline union_set solutions() const;
  inline union_set subtract(union_set uset2) const;
  inline union_set unite(union_set uset2) const;
  inline union_set universe() const;
  inline union_map unwrap() const;
  inline union_map wrapped_domain_map() const;
};

// declarations for isl::union_set_list
inline union_set_list manage(__isl_take isl_union_set_list *ptr);
inline union_set_list manage_copy(__isl_keep isl_union_set_list *ptr);

class union_set_list {
  friend inline union_set_list manage(__isl_take isl_union_set_list *ptr);
  friend inline union_set_list manage_copy(__isl_keep isl_union_set_list *ptr);

  isl_union_set_list *ptr = nullptr;

  inline explicit union_set_list(__isl_take isl_union_set_list *ptr);

public:
  inline /* implicit */ union_set_list();
  inline /* implicit */ union_set_list(const union_set_list &obj);
  inline union_set_list &operator=(union_set_list obj);
  inline ~union_set_list();
  inline __isl_give isl_union_set_list *copy() const &;
  inline __isl_give isl_union_set_list *copy() && = delete;
  inline __isl_keep isl_union_set_list *get() const;
  inline __isl_give isl_union_set_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline union_set_list add(union_set el) const;
  static inline union_set_list alloc(ctx ctx, int n);
  inline union_set_list clear() const;
  inline union_set_list concat(union_set_list list2) const;
  inline union_set_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(union_set)> &fn) const;
  static inline union_set_list from_union_set(union_set el);
  inline union_set get_at(int index) const;
  inline union_set get_union_set(int index) const;
  inline union_set_list insert(unsigned int pos, union_set el) const;
  inline isl_size n_union_set() const;
  inline union_set_list reverse() const;
  inline union_set_list set_union_set(int index, union_set el) const;
  inline isl_size size() const;
  inline union_set_list swap(unsigned int pos1, unsigned int pos2) const;
  inline union_set unite() const;
};

// declarations for isl::val
inline val manage(__isl_take isl_val *ptr);
inline val manage_copy(__isl_keep isl_val *ptr);

class val {
  friend inline val manage(__isl_take isl_val *ptr);
  friend inline val manage_copy(__isl_keep isl_val *ptr);

  isl_val *ptr = nullptr;

  inline explicit val(__isl_take isl_val *ptr);

public:
  inline /* implicit */ val();
  inline /* implicit */ val(const val &obj);
  inline explicit val(ctx ctx, long i);
  inline explicit val(ctx ctx, const std::string &str);
  inline val &operator=(val obj);
  inline ~val();
  inline __isl_give isl_val *copy() const &;
  inline __isl_give isl_val *copy() && = delete;
  inline __isl_keep isl_val *get() const;
  inline __isl_give isl_val *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline val abs() const;
  inline boolean abs_eq(const val &v2) const;
  inline val add(val v2) const;
  inline val add_ui(unsigned long v2) const;
  inline val ceil() const;
  inline int cmp_si(long i) const;
  inline val div(val v2) const;
  inline val div_ui(unsigned long v2) const;
  inline boolean eq(const val &v2) const;
  inline boolean eq_si(long i) const;
  inline val floor() const;
  inline val gcd(val v2) const;
  inline boolean ge(const val &v2) const;
  inline uint32_t get_hash() const;
  inline long get_num_si() const;
  inline boolean gt(const val &v2) const;
  inline boolean gt_si(long i) const;
  static inline val infty(ctx ctx);
  static inline val int_from_ui(ctx ctx, unsigned long u);
  inline val inv() const;
  inline boolean is_divisible_by(const val &v2) const;
  inline boolean is_infty() const;
  inline boolean is_int() const;
  inline boolean is_nan() const;
  inline boolean is_neg() const;
  inline boolean is_neginfty() const;
  inline boolean is_negone() const;
  inline boolean is_nonneg() const;
  inline boolean is_nonpos() const;
  inline boolean is_one() const;
  inline boolean is_pos() const;
  inline boolean is_rat() const;
  inline boolean is_zero() const;
  inline boolean le(const val &v2) const;
  inline boolean lt(const val &v2) const;
  inline val max(val v2) const;
  inline val min(val v2) const;
  inline val mod(val v2) const;
  inline val mul(val v2) const;
  inline val mul_ui(unsigned long v2) const;
  inline isl_size n_abs_num_chunks(size_t size) const;
  static inline val nan(ctx ctx);
  inline boolean ne(const val &v2) const;
  inline val neg() const;
  static inline val neginfty(ctx ctx);
  static inline val negone(ctx ctx);
  static inline val one(ctx ctx);
  inline val pow2() const;
  inline val set_si(long i) const;
  inline int sgn() const;
  inline val sub(val v2) const;
  inline val sub_ui(unsigned long v2) const;
  inline val trunc() const;
  static inline val zero(ctx ctx);
};

// declarations for isl::val_list
inline val_list manage(__isl_take isl_val_list *ptr);
inline val_list manage_copy(__isl_keep isl_val_list *ptr);

class val_list {
  friend inline val_list manage(__isl_take isl_val_list *ptr);
  friend inline val_list manage_copy(__isl_keep isl_val_list *ptr);

  isl_val_list *ptr = nullptr;

  inline explicit val_list(__isl_take isl_val_list *ptr);

public:
  inline /* implicit */ val_list();
  inline /* implicit */ val_list(const val_list &obj);
  inline val_list &operator=(val_list obj);
  inline ~val_list();
  inline __isl_give isl_val_list *copy() const &;
  inline __isl_give isl_val_list *copy() && = delete;
  inline __isl_keep isl_val_list *get() const;
  inline __isl_give isl_val_list *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline val_list add(val el) const;
  static inline val_list alloc(ctx ctx, int n);
  inline val_list clear() const;
  inline val_list concat(val_list list2) const;
  inline val_list drop(unsigned int first, unsigned int n) const;
  inline stat foreach(const std::function<stat(val)> &fn) const;
  static inline val_list from_val(val el);
  inline val get_at(int index) const;
  inline val get_val(int index) const;
  inline val_list insert(unsigned int pos, val el) const;
  inline isl_size n_val() const;
  inline val_list reverse() const;
  inline val_list set_val(int index, val el) const;
  inline isl_size size() const;
  inline val_list swap(unsigned int pos1, unsigned int pos2) const;
};

// declarations for isl::vec
inline vec manage(__isl_take isl_vec *ptr);
inline vec manage_copy(__isl_keep isl_vec *ptr);

class vec {
  friend inline vec manage(__isl_take isl_vec *ptr);
  friend inline vec manage_copy(__isl_keep isl_vec *ptr);

  isl_vec *ptr = nullptr;

  inline explicit vec(__isl_take isl_vec *ptr);

public:
  inline /* implicit */ vec();
  inline /* implicit */ vec(const vec &obj);
  inline vec &operator=(vec obj);
  inline ~vec();
  inline __isl_give isl_vec *copy() const &;
  inline __isl_give isl_vec *copy() && = delete;
  inline __isl_keep isl_vec *get() const;
  inline __isl_give isl_vec *release();
  inline bool is_null() const;
  inline ctx get_ctx() const;
  inline void dump() const;

  inline vec add(vec vec2) const;
  inline vec add_els(unsigned int n) const;
  static inline vec alloc(ctx ctx, unsigned int size);
  inline vec ceil() const;
  inline vec clr() const;
  inline int cmp_element(const vec &vec2, int pos) const;
  inline vec concat(vec vec2) const;
  inline vec drop_els(unsigned int pos, unsigned int n) const;
  inline vec extend(unsigned int size) const;
  inline val get_element_val(int pos) const;
  inline vec insert_els(unsigned int pos, unsigned int n) const;
  inline vec insert_zero_els(unsigned int pos, unsigned int n) const;
  inline boolean is_equal(const vec &vec2) const;
  inline vec mat_product(mat mat) const;
  inline vec move_els(unsigned int dst_col, unsigned int src_col, unsigned int n) const;
  inline vec neg() const;
  inline vec set_element_si(int pos, int v) const;
  inline vec set_element_val(int pos, val v) const;
  inline vec set_si(int v) const;
  inline vec set_val(val v) const;
  inline isl_size size() const;
  inline vec sort() const;
  static inline vec zero(ctx ctx, unsigned int size);
  inline vec zero_extend(unsigned int size) const;
};

// implementations for isl::aff
aff manage(__isl_take isl_aff *ptr) {
  return aff(ptr);
}
aff manage_copy(__isl_keep isl_aff *ptr) {
  ptr = isl_aff_copy(ptr);
  return aff(ptr);
}

aff::aff()
    : ptr(nullptr) {}

aff::aff(const aff &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


aff::aff(__isl_take isl_aff *ptr)
    : ptr(ptr) {}

aff::aff(ctx ctx, const std::string &str)
{
  auto res = isl_aff_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}
aff::aff(local_space ls, val val)
{
  auto res = isl_aff_val_on_domain(ls.release(), val.release());
  ptr = res;
}
aff::aff(local_space ls)
{
  auto res = isl_aff_zero_on_domain(ls.release());
  ptr = res;
}

aff &aff::operator=(aff obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

aff::~aff() {
  if (ptr)
    isl_aff_free(ptr);
}

__isl_give isl_aff *aff::copy() const & {
  return isl_aff_copy(ptr);
}

__isl_keep isl_aff *aff::get() const {
  return ptr;
}

__isl_give isl_aff *aff::release() {
  isl_aff *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool aff::is_null() const {
  return ptr == nullptr;
}


ctx aff::get_ctx() const {
  return ctx(isl_aff_get_ctx(ptr));
}

void aff::dump() const {
  isl_aff_dump(get());
}


aff aff::add(aff aff2) const
{
  auto res = isl_aff_add(copy(), aff2.release());
  return manage(res);
}

aff aff::add_coefficient_si(isl::dim type, int pos, int v) const
{
  auto res = isl_aff_add_coefficient_si(copy(), static_cast<enum isl_dim_type>(type), pos, v);
  return manage(res);
}

aff aff::add_coefficient_val(isl::dim type, int pos, val v) const
{
  auto res = isl_aff_add_coefficient_val(copy(), static_cast<enum isl_dim_type>(type), pos, v.release());
  return manage(res);
}

aff aff::add_constant(val v) const
{
  auto res = isl_aff_add_constant_val(copy(), v.release());
  return manage(res);
}

aff aff::add_constant_num_si(int v) const
{
  auto res = isl_aff_add_constant_num_si(copy(), v);
  return manage(res);
}

aff aff::add_constant_si(int v) const
{
  auto res = isl_aff_add_constant_si(copy(), v);
  return manage(res);
}

aff aff::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_aff_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

aff aff::align_params(space model) const
{
  auto res = isl_aff_align_params(copy(), model.release());
  return manage(res);
}

basic_set aff::bind(id id) const
{
  auto res = isl_aff_bind_id(copy(), id.release());
  return manage(res);
}

aff aff::ceil() const
{
  auto res = isl_aff_ceil(copy());
  return manage(res);
}

int aff::coefficient_sgn(isl::dim type, int pos) const
{
  auto res = isl_aff_coefficient_sgn(get(), static_cast<enum isl_dim_type>(type), pos);
  return res;
}

isl_size aff::dim(isl::dim type) const
{
  auto res = isl_aff_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

aff aff::div(aff aff2) const
{
  auto res = isl_aff_div(copy(), aff2.release());
  return manage(res);
}

aff aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_aff_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_set aff::eq_basic_set(aff aff2) const
{
  auto res = isl_aff_eq_basic_set(copy(), aff2.release());
  return manage(res);
}

set aff::eq_set(aff aff2) const
{
  auto res = isl_aff_eq_set(copy(), aff2.release());
  return manage(res);
}

val aff::eval(point pnt) const
{
  auto res = isl_aff_eval(copy(), pnt.release());
  return manage(res);
}

int aff::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_aff_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

aff aff::floor() const
{
  auto res = isl_aff_floor(copy());
  return manage(res);
}

aff aff::from_range() const
{
  auto res = isl_aff_from_range(copy());
  return manage(res);
}

basic_set aff::ge_basic_set(aff aff2) const
{
  auto res = isl_aff_ge_basic_set(copy(), aff2.release());
  return manage(res);
}

set aff::ge_set(aff aff2) const
{
  auto res = isl_aff_ge_set(copy(), aff2.release());
  return manage(res);
}

val aff::get_coefficient_val(isl::dim type, int pos) const
{
  auto res = isl_aff_get_coefficient_val(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

val aff::get_constant_val() const
{
  auto res = isl_aff_get_constant_val(get());
  return manage(res);
}

val aff::get_denominator_val() const
{
  auto res = isl_aff_get_denominator_val(get());
  return manage(res);
}

std::string aff::get_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_aff_get_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  std::string tmp(res);
  return tmp;
}

aff aff::get_div(int pos) const
{
  auto res = isl_aff_get_div(get(), pos);
  return manage(res);
}

local_space aff::get_domain_local_space() const
{
  auto res = isl_aff_get_domain_local_space(get());
  return manage(res);
}

space aff::get_domain_space() const
{
  auto res = isl_aff_get_domain_space(get());
  return manage(res);
}

uint32_t aff::get_hash() const
{
  auto res = isl_aff_get_hash(get());
  return res;
}

local_space aff::get_local_space() const
{
  auto res = isl_aff_get_local_space(get());
  return manage(res);
}

space aff::get_space() const
{
  auto res = isl_aff_get_space(get());
  return manage(res);
}

aff aff::gist(set context) const
{
  auto res = isl_aff_gist(copy(), context.release());
  return manage(res);
}

aff aff::gist_params(set context) const
{
  auto res = isl_aff_gist_params(copy(), context.release());
  return manage(res);
}

basic_set aff::gt_basic_set(aff aff2) const
{
  auto res = isl_aff_gt_basic_set(copy(), aff2.release());
  return manage(res);
}

set aff::gt_set(aff aff2) const
{
  auto res = isl_aff_gt_set(copy(), aff2.release());
  return manage(res);
}

aff aff::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_aff_insert_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_aff_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean aff::involves_locals() const
{
  auto res = isl_aff_involves_locals(get());
  return manage(res);
}

boolean aff::is_cst() const
{
  auto res = isl_aff_is_cst(get());
  return manage(res);
}

boolean aff::is_nan() const
{
  auto res = isl_aff_is_nan(get());
  return manage(res);
}

basic_set aff::le_basic_set(aff aff2) const
{
  auto res = isl_aff_le_basic_set(copy(), aff2.release());
  return manage(res);
}

set aff::le_set(aff aff2) const
{
  auto res = isl_aff_le_set(copy(), aff2.release());
  return manage(res);
}

basic_set aff::lt_basic_set(aff aff2) const
{
  auto res = isl_aff_lt_basic_set(copy(), aff2.release());
  return manage(res);
}

set aff::lt_set(aff aff2) const
{
  auto res = isl_aff_lt_set(copy(), aff2.release());
  return manage(res);
}

aff aff::mod(val mod) const
{
  auto res = isl_aff_mod_val(copy(), mod.release());
  return manage(res);
}

aff aff::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_aff_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

aff aff::mul(aff aff2) const
{
  auto res = isl_aff_mul(copy(), aff2.release());
  return manage(res);
}

aff aff::nan_on_domain(local_space ls)
{
  auto res = isl_aff_nan_on_domain(ls.release());
  return manage(res);
}

aff aff::nan_on_domain_space(space space)
{
  auto res = isl_aff_nan_on_domain_space(space.release());
  return manage(res);
}

set aff::ne_set(aff aff2) const
{
  auto res = isl_aff_ne_set(copy(), aff2.release());
  return manage(res);
}

aff aff::neg() const
{
  auto res = isl_aff_neg(copy());
  return manage(res);
}

basic_set aff::neg_basic_set() const
{
  auto res = isl_aff_neg_basic_set(copy());
  return manage(res);
}

aff aff::param_on_domain_space_id(space space, id id)
{
  auto res = isl_aff_param_on_domain_space_id(space.release(), id.release());
  return manage(res);
}

boolean aff::plain_is_equal(const aff &aff2) const
{
  auto res = isl_aff_plain_is_equal(get(), aff2.get());
  return manage(res);
}

boolean aff::plain_is_zero() const
{
  auto res = isl_aff_plain_is_zero(get());
  return manage(res);
}

aff aff::project_domain_on_params() const
{
  auto res = isl_aff_project_domain_on_params(copy());
  return manage(res);
}

aff aff::pullback(multi_aff ma) const
{
  auto res = isl_aff_pullback_multi_aff(copy(), ma.release());
  return manage(res);
}

aff aff::pullback_aff(aff aff2) const
{
  auto res = isl_aff_pullback_aff(copy(), aff2.release());
  return manage(res);
}

aff aff::scale(val v) const
{
  auto res = isl_aff_scale_val(copy(), v.release());
  return manage(res);
}

aff aff::scale_down(val v) const
{
  auto res = isl_aff_scale_down_val(copy(), v.release());
  return manage(res);
}

aff aff::scale_down_ui(unsigned int f) const
{
  auto res = isl_aff_scale_down_ui(copy(), f);
  return manage(res);
}

aff aff::set_coefficient_si(isl::dim type, int pos, int v) const
{
  auto res = isl_aff_set_coefficient_si(copy(), static_cast<enum isl_dim_type>(type), pos, v);
  return manage(res);
}

aff aff::set_coefficient_val(isl::dim type, int pos, val v) const
{
  auto res = isl_aff_set_coefficient_val(copy(), static_cast<enum isl_dim_type>(type), pos, v.release());
  return manage(res);
}

aff aff::set_constant_si(int v) const
{
  auto res = isl_aff_set_constant_si(copy(), v);
  return manage(res);
}

aff aff::set_constant_val(val v) const
{
  auto res = isl_aff_set_constant_val(copy(), v.release());
  return manage(res);
}

aff aff::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_aff_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

aff aff::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_aff_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

aff aff::sub(aff aff2) const
{
  auto res = isl_aff_sub(copy(), aff2.release());
  return manage(res);
}

aff aff::unbind_params_insert_domain(multi_id domain) const
{
  auto res = isl_aff_unbind_params_insert_domain(copy(), domain.release());
  return manage(res);
}

aff aff::val_on_domain_space(space space, val val)
{
  auto res = isl_aff_val_on_domain_space(space.release(), val.release());
  return manage(res);
}

aff aff::var_on_domain(local_space ls, isl::dim type, unsigned int pos)
{
  auto res = isl_aff_var_on_domain(ls.release(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

basic_set aff::zero_basic_set() const
{
  auto res = isl_aff_zero_basic_set(copy());
  return manage(res);
}

aff aff::zero_on_domain(space space)
{
  auto res = isl_aff_zero_on_domain_space(space.release());
  return manage(res);
}

// implementations for isl::aff_list
aff_list manage(__isl_take isl_aff_list *ptr) {
  return aff_list(ptr);
}
aff_list manage_copy(__isl_keep isl_aff_list *ptr) {
  ptr = isl_aff_list_copy(ptr);
  return aff_list(ptr);
}

aff_list::aff_list()
    : ptr(nullptr) {}

aff_list::aff_list(const aff_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


aff_list::aff_list(__isl_take isl_aff_list *ptr)
    : ptr(ptr) {}


aff_list &aff_list::operator=(aff_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

aff_list::~aff_list() {
  if (ptr)
    isl_aff_list_free(ptr);
}

__isl_give isl_aff_list *aff_list::copy() const & {
  return isl_aff_list_copy(ptr);
}

__isl_keep isl_aff_list *aff_list::get() const {
  return ptr;
}

__isl_give isl_aff_list *aff_list::release() {
  isl_aff_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool aff_list::is_null() const {
  return ptr == nullptr;
}


ctx aff_list::get_ctx() const {
  return ctx(isl_aff_list_get_ctx(ptr));
}

void aff_list::dump() const {
  isl_aff_list_dump(get());
}


aff_list aff_list::add(aff el) const
{
  auto res = isl_aff_list_add(copy(), el.release());
  return manage(res);
}

aff_list aff_list::alloc(ctx ctx, int n)
{
  auto res = isl_aff_list_alloc(ctx.release(), n);
  return manage(res);
}

aff_list aff_list::clear() const
{
  auto res = isl_aff_list_clear(copy());
  return manage(res);
}

aff_list aff_list::concat(aff_list list2) const
{
  auto res = isl_aff_list_concat(copy(), list2.release());
  return manage(res);
}

aff_list aff_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_aff_list_drop(copy(), first, n);
  return manage(res);
}

stat aff_list::foreach(const std::function<stat(aff)> &fn) const
{
  struct fn_data {
    const std::function<stat(aff)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_aff *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_aff_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

aff_list aff_list::from_aff(aff el)
{
  auto res = isl_aff_list_from_aff(el.release());
  return manage(res);
}

aff aff_list::get_aff(int index) const
{
  auto res = isl_aff_list_get_aff(get(), index);
  return manage(res);
}

aff aff_list::get_at(int index) const
{
  auto res = isl_aff_list_get_at(get(), index);
  return manage(res);
}

aff_list aff_list::insert(unsigned int pos, aff el) const
{
  auto res = isl_aff_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size aff_list::n_aff() const
{
  auto res = isl_aff_list_n_aff(get());
  return res;
}

aff_list aff_list::reverse() const
{
  auto res = isl_aff_list_reverse(copy());
  return manage(res);
}

aff_list aff_list::set_aff(int index, aff el) const
{
  auto res = isl_aff_list_set_aff(copy(), index, el.release());
  return manage(res);
}

isl_size aff_list::size() const
{
  auto res = isl_aff_list_size(get());
  return res;
}

aff_list aff_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_aff_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::ast_build
ast_build manage(__isl_take isl_ast_build *ptr) {
  return ast_build(ptr);
}
ast_build manage_copy(__isl_keep isl_ast_build *ptr) {
  ptr = isl_ast_build_copy(ptr);
  return ast_build(ptr);
}

ast_build::ast_build()
    : ptr(nullptr) {}

ast_build::ast_build(const ast_build &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


ast_build::ast_build(__isl_take isl_ast_build *ptr)
    : ptr(ptr) {}

ast_build::ast_build(ctx ctx)
{
  auto res = isl_ast_build_alloc(ctx.release());
  ptr = res;
}

ast_build &ast_build::operator=(ast_build obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

ast_build::~ast_build() {
  if (ptr)
    isl_ast_build_free(ptr);
}

__isl_give isl_ast_build *ast_build::copy() const & {
  return isl_ast_build_copy(ptr);
}

__isl_keep isl_ast_build *ast_build::get() const {
  return ptr;
}

__isl_give isl_ast_build *ast_build::release() {
  isl_ast_build *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool ast_build::is_null() const {
  return ptr == nullptr;
}


ctx ast_build::get_ctx() const {
  return ctx(isl_ast_build_get_ctx(ptr));
}


ast_expr ast_build::access_from(multi_pw_aff mpa) const
{
  auto res = isl_ast_build_access_from_multi_pw_aff(get(), mpa.release());
  return manage(res);
}

ast_expr ast_build::access_from(pw_multi_aff pma) const
{
  auto res = isl_ast_build_access_from_pw_multi_aff(get(), pma.release());
  return manage(res);
}

ast_node ast_build::ast_from_schedule(union_map schedule) const
{
  auto res = isl_ast_build_ast_from_schedule(get(), schedule.release());
  return manage(res);
}

ast_expr ast_build::call_from(multi_pw_aff mpa) const
{
  auto res = isl_ast_build_call_from_multi_pw_aff(get(), mpa.release());
  return manage(res);
}

ast_expr ast_build::call_from(pw_multi_aff pma) const
{
  auto res = isl_ast_build_call_from_pw_multi_aff(get(), pma.release());
  return manage(res);
}

ast_expr ast_build::expr_from(pw_aff pa) const
{
  auto res = isl_ast_build_expr_from_pw_aff(get(), pa.release());
  return manage(res);
}

ast_expr ast_build::expr_from(set set) const
{
  auto res = isl_ast_build_expr_from_set(get(), set.release());
  return manage(res);
}

ast_build ast_build::from_context(set set)
{
  auto res = isl_ast_build_from_context(set.release());
  return manage(res);
}

union_map ast_build::get_schedule() const
{
  auto res = isl_ast_build_get_schedule(get());
  return manage(res);
}

space ast_build::get_schedule_space() const
{
  auto res = isl_ast_build_get_schedule_space(get());
  return manage(res);
}

ast_node ast_build::node_from(schedule schedule) const
{
  auto res = isl_ast_build_node_from_schedule(get(), schedule.release());
  return manage(res);
}

ast_node ast_build::node_from_schedule_map(union_map schedule) const
{
  auto res = isl_ast_build_node_from_schedule_map(get(), schedule.release());
  return manage(res);
}

ast_build ast_build::restrict(set set) const
{
  auto res = isl_ast_build_restrict(copy(), set.release());
  return manage(res);
}

// implementations for isl::ast_expr
ast_expr manage(__isl_take isl_ast_expr *ptr) {
  return ast_expr(ptr);
}
ast_expr manage_copy(__isl_keep isl_ast_expr *ptr) {
  ptr = isl_ast_expr_copy(ptr);
  return ast_expr(ptr);
}

ast_expr::ast_expr()
    : ptr(nullptr) {}

ast_expr::ast_expr(const ast_expr &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


ast_expr::ast_expr(__isl_take isl_ast_expr *ptr)
    : ptr(ptr) {}


ast_expr &ast_expr::operator=(ast_expr obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

ast_expr::~ast_expr() {
  if (ptr)
    isl_ast_expr_free(ptr);
}

__isl_give isl_ast_expr *ast_expr::copy() const & {
  return isl_ast_expr_copy(ptr);
}

__isl_keep isl_ast_expr *ast_expr::get() const {
  return ptr;
}

__isl_give isl_ast_expr *ast_expr::release() {
  isl_ast_expr *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool ast_expr::is_null() const {
  return ptr == nullptr;
}


ctx ast_expr::get_ctx() const {
  return ctx(isl_ast_expr_get_ctx(ptr));
}

void ast_expr::dump() const {
  isl_ast_expr_dump(get());
}


ast_expr ast_expr::access(ast_expr_list indices) const
{
  auto res = isl_ast_expr_access(copy(), indices.release());
  return manage(res);
}

ast_expr ast_expr::add(ast_expr expr2) const
{
  auto res = isl_ast_expr_add(copy(), expr2.release());
  return manage(res);
}

ast_expr ast_expr::address_of() const
{
  auto res = isl_ast_expr_address_of(copy());
  return manage(res);
}

ast_expr ast_expr::call(ast_expr_list arguments) const
{
  auto res = isl_ast_expr_call(copy(), arguments.release());
  return manage(res);
}

ast_expr ast_expr::div(ast_expr expr2) const
{
  auto res = isl_ast_expr_div(copy(), expr2.release());
  return manage(res);
}

ast_expr ast_expr::eq(ast_expr expr2) const
{
  auto res = isl_ast_expr_eq(copy(), expr2.release());
  return manage(res);
}

ast_expr ast_expr::from_id(id id)
{
  auto res = isl_ast_expr_from_id(id.release());
  return manage(res);
}

ast_expr ast_expr::from_val(val v)
{
  auto res = isl_ast_expr_from_val(v.release());
  return manage(res);
}

ast_expr ast_expr::ge(ast_expr expr2) const
{
  auto res = isl_ast_expr_ge(copy(), expr2.release());
  return manage(res);
}

id ast_expr::get_id() const
{
  auto res = isl_ast_expr_get_id(get());
  return manage(res);
}

ast_expr ast_expr::get_op_arg(int pos) const
{
  auto res = isl_ast_expr_get_op_arg(get(), pos);
  return manage(res);
}

isl_size ast_expr::get_op_n_arg() const
{
  auto res = isl_ast_expr_get_op_n_arg(get());
  return res;
}

val ast_expr::get_val() const
{
  auto res = isl_ast_expr_get_val(get());
  return manage(res);
}

ast_expr ast_expr::gt(ast_expr expr2) const
{
  auto res = isl_ast_expr_gt(copy(), expr2.release());
  return manage(res);
}

id ast_expr::id_get_id() const
{
  auto res = isl_ast_expr_id_get_id(get());
  return manage(res);
}

val ast_expr::int_get_val() const
{
  auto res = isl_ast_expr_int_get_val(get());
  return manage(res);
}

boolean ast_expr::is_equal(const ast_expr &expr2) const
{
  auto res = isl_ast_expr_is_equal(get(), expr2.get());
  return manage(res);
}

ast_expr ast_expr::le(ast_expr expr2) const
{
  auto res = isl_ast_expr_le(copy(), expr2.release());
  return manage(res);
}

ast_expr ast_expr::lt(ast_expr expr2) const
{
  auto res = isl_ast_expr_lt(copy(), expr2.release());
  return manage(res);
}

ast_expr ast_expr::mul(ast_expr expr2) const
{
  auto res = isl_ast_expr_mul(copy(), expr2.release());
  return manage(res);
}

ast_expr ast_expr::neg() const
{
  auto res = isl_ast_expr_neg(copy());
  return manage(res);
}

ast_expr ast_expr::op_get_arg(int pos) const
{
  auto res = isl_ast_expr_op_get_arg(get(), pos);
  return manage(res);
}

isl_size ast_expr::op_get_n_arg() const
{
  auto res = isl_ast_expr_op_get_n_arg(get());
  return res;
}

ast_expr ast_expr::pdiv_q(ast_expr expr2) const
{
  auto res = isl_ast_expr_pdiv_q(copy(), expr2.release());
  return manage(res);
}

ast_expr ast_expr::pdiv_r(ast_expr expr2) const
{
  auto res = isl_ast_expr_pdiv_r(copy(), expr2.release());
  return manage(res);
}

ast_expr ast_expr::set_op_arg(int pos, ast_expr arg) const
{
  auto res = isl_ast_expr_set_op_arg(copy(), pos, arg.release());
  return manage(res);
}

ast_expr ast_expr::sub(ast_expr expr2) const
{
  auto res = isl_ast_expr_sub(copy(), expr2.release());
  return manage(res);
}

ast_expr ast_expr::substitute_ids(id_to_ast_expr id2expr) const
{
  auto res = isl_ast_expr_substitute_ids(copy(), id2expr.release());
  return manage(res);
}

std::string ast_expr::to_C_str() const
{
  auto res = isl_ast_expr_to_C_str(get());
  std::string tmp(res);
  free(res);
  return tmp;
}

// implementations for isl::ast_expr_list
ast_expr_list manage(__isl_take isl_ast_expr_list *ptr) {
  return ast_expr_list(ptr);
}
ast_expr_list manage_copy(__isl_keep isl_ast_expr_list *ptr) {
  ptr = isl_ast_expr_list_copy(ptr);
  return ast_expr_list(ptr);
}

ast_expr_list::ast_expr_list()
    : ptr(nullptr) {}

ast_expr_list::ast_expr_list(const ast_expr_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


ast_expr_list::ast_expr_list(__isl_take isl_ast_expr_list *ptr)
    : ptr(ptr) {}


ast_expr_list &ast_expr_list::operator=(ast_expr_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

ast_expr_list::~ast_expr_list() {
  if (ptr)
    isl_ast_expr_list_free(ptr);
}

__isl_give isl_ast_expr_list *ast_expr_list::copy() const & {
  return isl_ast_expr_list_copy(ptr);
}

__isl_keep isl_ast_expr_list *ast_expr_list::get() const {
  return ptr;
}

__isl_give isl_ast_expr_list *ast_expr_list::release() {
  isl_ast_expr_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool ast_expr_list::is_null() const {
  return ptr == nullptr;
}


ctx ast_expr_list::get_ctx() const {
  return ctx(isl_ast_expr_list_get_ctx(ptr));
}

void ast_expr_list::dump() const {
  isl_ast_expr_list_dump(get());
}


ast_expr_list ast_expr_list::add(ast_expr el) const
{
  auto res = isl_ast_expr_list_add(copy(), el.release());
  return manage(res);
}

ast_expr_list ast_expr_list::alloc(ctx ctx, int n)
{
  auto res = isl_ast_expr_list_alloc(ctx.release(), n);
  return manage(res);
}

ast_expr_list ast_expr_list::clear() const
{
  auto res = isl_ast_expr_list_clear(copy());
  return manage(res);
}

ast_expr_list ast_expr_list::concat(ast_expr_list list2) const
{
  auto res = isl_ast_expr_list_concat(copy(), list2.release());
  return manage(res);
}

ast_expr_list ast_expr_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_ast_expr_list_drop(copy(), first, n);
  return manage(res);
}

stat ast_expr_list::foreach(const std::function<stat(ast_expr)> &fn) const
{
  struct fn_data {
    const std::function<stat(ast_expr)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_ast_expr *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_ast_expr_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

ast_expr_list ast_expr_list::from_ast_expr(ast_expr el)
{
  auto res = isl_ast_expr_list_from_ast_expr(el.release());
  return manage(res);
}

ast_expr ast_expr_list::get_ast_expr(int index) const
{
  auto res = isl_ast_expr_list_get_ast_expr(get(), index);
  return manage(res);
}

ast_expr ast_expr_list::get_at(int index) const
{
  auto res = isl_ast_expr_list_get_at(get(), index);
  return manage(res);
}

ast_expr_list ast_expr_list::insert(unsigned int pos, ast_expr el) const
{
  auto res = isl_ast_expr_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size ast_expr_list::n_ast_expr() const
{
  auto res = isl_ast_expr_list_n_ast_expr(get());
  return res;
}

ast_expr_list ast_expr_list::reverse() const
{
  auto res = isl_ast_expr_list_reverse(copy());
  return manage(res);
}

ast_expr_list ast_expr_list::set_ast_expr(int index, ast_expr el) const
{
  auto res = isl_ast_expr_list_set_ast_expr(copy(), index, el.release());
  return manage(res);
}

isl_size ast_expr_list::size() const
{
  auto res = isl_ast_expr_list_size(get());
  return res;
}

ast_expr_list ast_expr_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_ast_expr_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::ast_node
ast_node manage(__isl_take isl_ast_node *ptr) {
  return ast_node(ptr);
}
ast_node manage_copy(__isl_keep isl_ast_node *ptr) {
  ptr = isl_ast_node_copy(ptr);
  return ast_node(ptr);
}

ast_node::ast_node()
    : ptr(nullptr) {}

ast_node::ast_node(const ast_node &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


ast_node::ast_node(__isl_take isl_ast_node *ptr)
    : ptr(ptr) {}


ast_node &ast_node::operator=(ast_node obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

ast_node::~ast_node() {
  if (ptr)
    isl_ast_node_free(ptr);
}

__isl_give isl_ast_node *ast_node::copy() const & {
  return isl_ast_node_copy(ptr);
}

__isl_keep isl_ast_node *ast_node::get() const {
  return ptr;
}

__isl_give isl_ast_node *ast_node::release() {
  isl_ast_node *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool ast_node::is_null() const {
  return ptr == nullptr;
}


ctx ast_node::get_ctx() const {
  return ctx(isl_ast_node_get_ctx(ptr));
}

void ast_node::dump() const {
  isl_ast_node_dump(get());
}


ast_node ast_node::alloc_user(ast_expr expr)
{
  auto res = isl_ast_node_alloc_user(expr.release());
  return manage(res);
}

ast_node_list ast_node::block_get_children() const
{
  auto res = isl_ast_node_block_get_children(get());
  return manage(res);
}

ast_node ast_node::for_get_body() const
{
  auto res = isl_ast_node_for_get_body(get());
  return manage(res);
}

ast_expr ast_node::for_get_cond() const
{
  auto res = isl_ast_node_for_get_cond(get());
  return manage(res);
}

ast_expr ast_node::for_get_inc() const
{
  auto res = isl_ast_node_for_get_inc(get());
  return manage(res);
}

ast_expr ast_node::for_get_init() const
{
  auto res = isl_ast_node_for_get_init(get());
  return manage(res);
}

ast_expr ast_node::for_get_iterator() const
{
  auto res = isl_ast_node_for_get_iterator(get());
  return manage(res);
}

boolean ast_node::for_is_degenerate() const
{
  auto res = isl_ast_node_for_is_degenerate(get());
  return manage(res);
}

id ast_node::get_annotation() const
{
  auto res = isl_ast_node_get_annotation(get());
  return manage(res);
}

ast_expr ast_node::if_get_cond() const
{
  auto res = isl_ast_node_if_get_cond(get());
  return manage(res);
}

ast_node ast_node::if_get_else() const
{
  auto res = isl_ast_node_if_get_else(get());
  return manage(res);
}

ast_node ast_node::if_get_else_node() const
{
  auto res = isl_ast_node_if_get_else_node(get());
  return manage(res);
}

ast_node ast_node::if_get_then() const
{
  auto res = isl_ast_node_if_get_then(get());
  return manage(res);
}

ast_node ast_node::if_get_then_node() const
{
  auto res = isl_ast_node_if_get_then_node(get());
  return manage(res);
}

boolean ast_node::if_has_else() const
{
  auto res = isl_ast_node_if_has_else(get());
  return manage(res);
}

boolean ast_node::if_has_else_node() const
{
  auto res = isl_ast_node_if_has_else_node(get());
  return manage(res);
}

id ast_node::mark_get_id() const
{
  auto res = isl_ast_node_mark_get_id(get());
  return manage(res);
}

ast_node ast_node::mark_get_node() const
{
  auto res = isl_ast_node_mark_get_node(get());
  return manage(res);
}

ast_node ast_node::set_annotation(id annotation) const
{
  auto res = isl_ast_node_set_annotation(copy(), annotation.release());
  return manage(res);
}

std::string ast_node::to_C_str() const
{
  auto res = isl_ast_node_to_C_str(get());
  std::string tmp(res);
  free(res);
  return tmp;
}

ast_expr ast_node::user_get_expr() const
{
  auto res = isl_ast_node_user_get_expr(get());
  return manage(res);
}

// implementations for isl::ast_node_list
ast_node_list manage(__isl_take isl_ast_node_list *ptr) {
  return ast_node_list(ptr);
}
ast_node_list manage_copy(__isl_keep isl_ast_node_list *ptr) {
  ptr = isl_ast_node_list_copy(ptr);
  return ast_node_list(ptr);
}

ast_node_list::ast_node_list()
    : ptr(nullptr) {}

ast_node_list::ast_node_list(const ast_node_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


ast_node_list::ast_node_list(__isl_take isl_ast_node_list *ptr)
    : ptr(ptr) {}


ast_node_list &ast_node_list::operator=(ast_node_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

ast_node_list::~ast_node_list() {
  if (ptr)
    isl_ast_node_list_free(ptr);
}

__isl_give isl_ast_node_list *ast_node_list::copy() const & {
  return isl_ast_node_list_copy(ptr);
}

__isl_keep isl_ast_node_list *ast_node_list::get() const {
  return ptr;
}

__isl_give isl_ast_node_list *ast_node_list::release() {
  isl_ast_node_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool ast_node_list::is_null() const {
  return ptr == nullptr;
}


ctx ast_node_list::get_ctx() const {
  return ctx(isl_ast_node_list_get_ctx(ptr));
}

void ast_node_list::dump() const {
  isl_ast_node_list_dump(get());
}


ast_node_list ast_node_list::add(ast_node el) const
{
  auto res = isl_ast_node_list_add(copy(), el.release());
  return manage(res);
}

ast_node_list ast_node_list::alloc(ctx ctx, int n)
{
  auto res = isl_ast_node_list_alloc(ctx.release(), n);
  return manage(res);
}

ast_node_list ast_node_list::clear() const
{
  auto res = isl_ast_node_list_clear(copy());
  return manage(res);
}

ast_node_list ast_node_list::concat(ast_node_list list2) const
{
  auto res = isl_ast_node_list_concat(copy(), list2.release());
  return manage(res);
}

ast_node_list ast_node_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_ast_node_list_drop(copy(), first, n);
  return manage(res);
}

stat ast_node_list::foreach(const std::function<stat(ast_node)> &fn) const
{
  struct fn_data {
    const std::function<stat(ast_node)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_ast_node *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_ast_node_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

ast_node_list ast_node_list::from_ast_node(ast_node el)
{
  auto res = isl_ast_node_list_from_ast_node(el.release());
  return manage(res);
}

ast_node ast_node_list::get_ast_node(int index) const
{
  auto res = isl_ast_node_list_get_ast_node(get(), index);
  return manage(res);
}

ast_node ast_node_list::get_at(int index) const
{
  auto res = isl_ast_node_list_get_at(get(), index);
  return manage(res);
}

ast_node_list ast_node_list::insert(unsigned int pos, ast_node el) const
{
  auto res = isl_ast_node_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size ast_node_list::n_ast_node() const
{
  auto res = isl_ast_node_list_n_ast_node(get());
  return res;
}

ast_node_list ast_node_list::reverse() const
{
  auto res = isl_ast_node_list_reverse(copy());
  return manage(res);
}

ast_node_list ast_node_list::set_ast_node(int index, ast_node el) const
{
  auto res = isl_ast_node_list_set_ast_node(copy(), index, el.release());
  return manage(res);
}

isl_size ast_node_list::size() const
{
  auto res = isl_ast_node_list_size(get());
  return res;
}

ast_node_list ast_node_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_ast_node_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::basic_map
basic_map manage(__isl_take isl_basic_map *ptr) {
  return basic_map(ptr);
}
basic_map manage_copy(__isl_keep isl_basic_map *ptr) {
  ptr = isl_basic_map_copy(ptr);
  return basic_map(ptr);
}

basic_map::basic_map()
    : ptr(nullptr) {}

basic_map::basic_map(const basic_map &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


basic_map::basic_map(__isl_take isl_basic_map *ptr)
    : ptr(ptr) {}

basic_map::basic_map(ctx ctx, const std::string &str)
{
  auto res = isl_basic_map_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

basic_map &basic_map::operator=(basic_map obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

basic_map::~basic_map() {
  if (ptr)
    isl_basic_map_free(ptr);
}

__isl_give isl_basic_map *basic_map::copy() const & {
  return isl_basic_map_copy(ptr);
}

__isl_keep isl_basic_map *basic_map::get() const {
  return ptr;
}

__isl_give isl_basic_map *basic_map::release() {
  isl_basic_map *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool basic_map::is_null() const {
  return ptr == nullptr;
}


ctx basic_map::get_ctx() const {
  return ctx(isl_basic_map_get_ctx(ptr));
}

void basic_map::dump() const {
  isl_basic_map_dump(get());
}


basic_map basic_map::add_constraint(constraint constraint) const
{
  auto res = isl_basic_map_add_constraint(copy(), constraint.release());
  return manage(res);
}

basic_map basic_map::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_basic_map_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

basic_map basic_map::affine_hull() const
{
  auto res = isl_basic_map_affine_hull(copy());
  return manage(res);
}

basic_map basic_map::align_params(space model) const
{
  auto res = isl_basic_map_align_params(copy(), model.release());
  return manage(res);
}

basic_map basic_map::apply_domain(basic_map bmap2) const
{
  auto res = isl_basic_map_apply_domain(copy(), bmap2.release());
  return manage(res);
}

basic_map basic_map::apply_range(basic_map bmap2) const
{
  auto res = isl_basic_map_apply_range(copy(), bmap2.release());
  return manage(res);
}

boolean basic_map::can_curry() const
{
  auto res = isl_basic_map_can_curry(get());
  return manage(res);
}

boolean basic_map::can_uncurry() const
{
  auto res = isl_basic_map_can_uncurry(get());
  return manage(res);
}

boolean basic_map::can_zip() const
{
  auto res = isl_basic_map_can_zip(get());
  return manage(res);
}

basic_map basic_map::curry() const
{
  auto res = isl_basic_map_curry(copy());
  return manage(res);
}

basic_set basic_map::deltas() const
{
  auto res = isl_basic_map_deltas(copy());
  return manage(res);
}

basic_map basic_map::deltas_map() const
{
  auto res = isl_basic_map_deltas_map(copy());
  return manage(res);
}

basic_map basic_map::detect_equalities() const
{
  auto res = isl_basic_map_detect_equalities(copy());
  return manage(res);
}

isl_size basic_map::dim(isl::dim type) const
{
  auto res = isl_basic_map_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

basic_set basic_map::domain() const
{
  auto res = isl_basic_map_domain(copy());
  return manage(res);
}

basic_map basic_map::domain_map() const
{
  auto res = isl_basic_map_domain_map(copy());
  return manage(res);
}

basic_map basic_map::domain_product(basic_map bmap2) const
{
  auto res = isl_basic_map_domain_product(copy(), bmap2.release());
  return manage(res);
}

basic_map basic_map::drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_map_drop_constraints_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_map basic_map::drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_map_drop_constraints_not_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_map basic_map::drop_unused_params() const
{
  auto res = isl_basic_map_drop_unused_params(copy());
  return manage(res);
}

basic_map basic_map::eliminate(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_map_eliminate(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_map basic_map::empty(space space)
{
  auto res = isl_basic_map_empty(space.release());
  return manage(res);
}

basic_map basic_map::equal(space space, unsigned int n_equal)
{
  auto res = isl_basic_map_equal(space.release(), n_equal);
  return manage(res);
}

mat basic_map::equalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4, isl::dim c5) const
{
  auto res = isl_basic_map_equalities_matrix(get(), static_cast<enum isl_dim_type>(c1), static_cast<enum isl_dim_type>(c2), static_cast<enum isl_dim_type>(c3), static_cast<enum isl_dim_type>(c4), static_cast<enum isl_dim_type>(c5));
  return manage(res);
}

basic_map basic_map::equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const
{
  auto res = isl_basic_map_equate(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
  return manage(res);
}

int basic_map::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_basic_map_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

basic_map basic_map::fix_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_basic_map_fix_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

basic_map basic_map::fix_val(isl::dim type, unsigned int pos, val v) const
{
  auto res = isl_basic_map_fix_val(copy(), static_cast<enum isl_dim_type>(type), pos, v.release());
  return manage(res);
}

basic_map basic_map::flat_product(basic_map bmap2) const
{
  auto res = isl_basic_map_flat_product(copy(), bmap2.release());
  return manage(res);
}

basic_map basic_map::flat_range_product(basic_map bmap2) const
{
  auto res = isl_basic_map_flat_range_product(copy(), bmap2.release());
  return manage(res);
}

basic_map basic_map::flatten() const
{
  auto res = isl_basic_map_flatten(copy());
  return manage(res);
}

basic_map basic_map::flatten_domain() const
{
  auto res = isl_basic_map_flatten_domain(copy());
  return manage(res);
}

basic_map basic_map::flatten_range() const
{
  auto res = isl_basic_map_flatten_range(copy());
  return manage(res);
}

stat basic_map::foreach_constraint(const std::function<stat(constraint)> &fn) const
{
  struct fn_data {
    const std::function<stat(constraint)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_constraint *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_basic_map_foreach_constraint(get(), fn_lambda, &fn_data);
  return manage(res);
}

basic_map basic_map::from_aff(aff aff)
{
  auto res = isl_basic_map_from_aff(aff.release());
  return manage(res);
}

basic_map basic_map::from_aff_list(space domain_space, aff_list list)
{
  auto res = isl_basic_map_from_aff_list(domain_space.release(), list.release());
  return manage(res);
}

basic_map basic_map::from_constraint(constraint constraint)
{
  auto res = isl_basic_map_from_constraint(constraint.release());
  return manage(res);
}

basic_map basic_map::from_domain(basic_set bset)
{
  auto res = isl_basic_map_from_domain(bset.release());
  return manage(res);
}

basic_map basic_map::from_domain_and_range(basic_set domain, basic_set range)
{
  auto res = isl_basic_map_from_domain_and_range(domain.release(), range.release());
  return manage(res);
}

basic_map basic_map::from_multi_aff(multi_aff maff)
{
  auto res = isl_basic_map_from_multi_aff(maff.release());
  return manage(res);
}

basic_map basic_map::from_qpolynomial(qpolynomial qp)
{
  auto res = isl_basic_map_from_qpolynomial(qp.release());
  return manage(res);
}

basic_map basic_map::from_range(basic_set bset)
{
  auto res = isl_basic_map_from_range(bset.release());
  return manage(res);
}

constraint_list basic_map::get_constraint_list() const
{
  auto res = isl_basic_map_get_constraint_list(get());
  return manage(res);
}

std::string basic_map::get_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_basic_map_get_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  std::string tmp(res);
  return tmp;
}

aff basic_map::get_div(int pos) const
{
  auto res = isl_basic_map_get_div(get(), pos);
  return manage(res);
}

local_space basic_map::get_local_space() const
{
  auto res = isl_basic_map_get_local_space(get());
  return manage(res);
}

space basic_map::get_space() const
{
  auto res = isl_basic_map_get_space(get());
  return manage(res);
}

std::string basic_map::get_tuple_name(isl::dim type) const
{
  auto res = isl_basic_map_get_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  std::string tmp(res);
  return tmp;
}

basic_map basic_map::gist(basic_map context) const
{
  auto res = isl_basic_map_gist(copy(), context.release());
  return manage(res);
}

basic_map basic_map::gist_domain(basic_set context) const
{
  auto res = isl_basic_map_gist_domain(copy(), context.release());
  return manage(res);
}

boolean basic_map::has_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_basic_map_has_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

basic_map basic_map::identity(space space)
{
  auto res = isl_basic_map_identity(space.release());
  return manage(res);
}

boolean basic_map::image_is_bounded() const
{
  auto res = isl_basic_map_image_is_bounded(get());
  return manage(res);
}

mat basic_map::inequalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4, isl::dim c5) const
{
  auto res = isl_basic_map_inequalities_matrix(get(), static_cast<enum isl_dim_type>(c1), static_cast<enum isl_dim_type>(c2), static_cast<enum isl_dim_type>(c3), static_cast<enum isl_dim_type>(c4), static_cast<enum isl_dim_type>(c5));
  return manage(res);
}

basic_map basic_map::insert_dims(isl::dim type, unsigned int pos, unsigned int n) const
{
  auto res = isl_basic_map_insert_dims(copy(), static_cast<enum isl_dim_type>(type), pos, n);
  return manage(res);
}

basic_map basic_map::intersect(basic_map bmap2) const
{
  auto res = isl_basic_map_intersect(copy(), bmap2.release());
  return manage(res);
}

basic_map basic_map::intersect_domain(basic_set bset) const
{
  auto res = isl_basic_map_intersect_domain(copy(), bset.release());
  return manage(res);
}

basic_map basic_map::intersect_range(basic_set bset) const
{
  auto res = isl_basic_map_intersect_range(copy(), bset.release());
  return manage(res);
}

boolean basic_map::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_map_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean basic_map::is_disjoint(const basic_map &bmap2) const
{
  auto res = isl_basic_map_is_disjoint(get(), bmap2.get());
  return manage(res);
}

boolean basic_map::is_empty() const
{
  auto res = isl_basic_map_is_empty(get());
  return manage(res);
}

boolean basic_map::is_equal(const basic_map &bmap2) const
{
  auto res = isl_basic_map_is_equal(get(), bmap2.get());
  return manage(res);
}

boolean basic_map::is_rational() const
{
  auto res = isl_basic_map_is_rational(get());
  return manage(res);
}

boolean basic_map::is_single_valued() const
{
  auto res = isl_basic_map_is_single_valued(get());
  return manage(res);
}

boolean basic_map::is_strict_subset(const basic_map &bmap2) const
{
  auto res = isl_basic_map_is_strict_subset(get(), bmap2.get());
  return manage(res);
}

boolean basic_map::is_subset(const basic_map &bmap2) const
{
  auto res = isl_basic_map_is_subset(get(), bmap2.get());
  return manage(res);
}

boolean basic_map::is_universe() const
{
  auto res = isl_basic_map_is_universe(get());
  return manage(res);
}

basic_map basic_map::less_at(space space, unsigned int pos)
{
  auto res = isl_basic_map_less_at(space.release(), pos);
  return manage(res);
}

map basic_map::lexmax() const
{
  auto res = isl_basic_map_lexmax(copy());
  return manage(res);
}

map basic_map::lexmin() const
{
  auto res = isl_basic_map_lexmin(copy());
  return manage(res);
}

pw_multi_aff basic_map::lexmin_pw_multi_aff() const
{
  auto res = isl_basic_map_lexmin_pw_multi_aff(copy());
  return manage(res);
}

basic_map basic_map::lower_bound_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_basic_map_lower_bound_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

basic_map basic_map::more_at(space space, unsigned int pos)
{
  auto res = isl_basic_map_more_at(space.release(), pos);
  return manage(res);
}

basic_map basic_map::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_basic_map_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

isl_size basic_map::n_constraint() const
{
  auto res = isl_basic_map_n_constraint(get());
  return res;
}

basic_map basic_map::nat_universe(space space)
{
  auto res = isl_basic_map_nat_universe(space.release());
  return manage(res);
}

basic_map basic_map::neg() const
{
  auto res = isl_basic_map_neg(copy());
  return manage(res);
}

basic_map basic_map::order_ge(isl::dim type1, int pos1, isl::dim type2, int pos2) const
{
  auto res = isl_basic_map_order_ge(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
  return manage(res);
}

basic_map basic_map::order_gt(isl::dim type1, int pos1, isl::dim type2, int pos2) const
{
  auto res = isl_basic_map_order_gt(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
  return manage(res);
}

val basic_map::plain_get_val_if_fixed(isl::dim type, unsigned int pos) const
{
  auto res = isl_basic_map_plain_get_val_if_fixed(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean basic_map::plain_is_empty() const
{
  auto res = isl_basic_map_plain_is_empty(get());
  return manage(res);
}

boolean basic_map::plain_is_universe() const
{
  auto res = isl_basic_map_plain_is_universe(get());
  return manage(res);
}

basic_map basic_map::preimage_domain_multi_aff(multi_aff ma) const
{
  auto res = isl_basic_map_preimage_domain_multi_aff(copy(), ma.release());
  return manage(res);
}

basic_map basic_map::preimage_range_multi_aff(multi_aff ma) const
{
  auto res = isl_basic_map_preimage_range_multi_aff(copy(), ma.release());
  return manage(res);
}

basic_map basic_map::product(basic_map bmap2) const
{
  auto res = isl_basic_map_product(copy(), bmap2.release());
  return manage(res);
}

basic_map basic_map::project_out(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_map_project_out(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_set basic_map::range() const
{
  auto res = isl_basic_map_range(copy());
  return manage(res);
}

basic_map basic_map::range_map() const
{
  auto res = isl_basic_map_range_map(copy());
  return manage(res);
}

basic_map basic_map::range_product(basic_map bmap2) const
{
  auto res = isl_basic_map_range_product(copy(), bmap2.release());
  return manage(res);
}

basic_map basic_map::remove_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_map_remove_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_map basic_map::remove_divs() const
{
  auto res = isl_basic_map_remove_divs(copy());
  return manage(res);
}

basic_map basic_map::remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_map_remove_divs_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_map basic_map::remove_redundancies() const
{
  auto res = isl_basic_map_remove_redundancies(copy());
  return manage(res);
}

basic_map basic_map::reverse() const
{
  auto res = isl_basic_map_reverse(copy());
  return manage(res);
}

basic_map basic_map::sample() const
{
  auto res = isl_basic_map_sample(copy());
  return manage(res);
}

basic_map basic_map::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_basic_map_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

basic_map basic_map::set_tuple_name(isl::dim type, const std::string &s) const
{
  auto res = isl_basic_map_set_tuple_name(copy(), static_cast<enum isl_dim_type>(type), s.c_str());
  return manage(res);
}

basic_map basic_map::sum(basic_map bmap2) const
{
  auto res = isl_basic_map_sum(copy(), bmap2.release());
  return manage(res);
}

basic_map basic_map::uncurry() const
{
  auto res = isl_basic_map_uncurry(copy());
  return manage(res);
}

map basic_map::unite(basic_map bmap2) const
{
  auto res = isl_basic_map_union(copy(), bmap2.release());
  return manage(res);
}

basic_map basic_map::universe(space space)
{
  auto res = isl_basic_map_universe(space.release());
  return manage(res);
}

basic_map basic_map::upper_bound_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_basic_map_upper_bound_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

basic_set basic_map::wrap() const
{
  auto res = isl_basic_map_wrap(copy());
  return manage(res);
}

basic_map basic_map::zip() const
{
  auto res = isl_basic_map_zip(copy());
  return manage(res);
}

// implementations for isl::basic_map_list
basic_map_list manage(__isl_take isl_basic_map_list *ptr) {
  return basic_map_list(ptr);
}
basic_map_list manage_copy(__isl_keep isl_basic_map_list *ptr) {
  ptr = isl_basic_map_list_copy(ptr);
  return basic_map_list(ptr);
}

basic_map_list::basic_map_list()
    : ptr(nullptr) {}

basic_map_list::basic_map_list(const basic_map_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


basic_map_list::basic_map_list(__isl_take isl_basic_map_list *ptr)
    : ptr(ptr) {}


basic_map_list &basic_map_list::operator=(basic_map_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

basic_map_list::~basic_map_list() {
  if (ptr)
    isl_basic_map_list_free(ptr);
}

__isl_give isl_basic_map_list *basic_map_list::copy() const & {
  return isl_basic_map_list_copy(ptr);
}

__isl_keep isl_basic_map_list *basic_map_list::get() const {
  return ptr;
}

__isl_give isl_basic_map_list *basic_map_list::release() {
  isl_basic_map_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool basic_map_list::is_null() const {
  return ptr == nullptr;
}


ctx basic_map_list::get_ctx() const {
  return ctx(isl_basic_map_list_get_ctx(ptr));
}

void basic_map_list::dump() const {
  isl_basic_map_list_dump(get());
}


basic_map_list basic_map_list::add(basic_map el) const
{
  auto res = isl_basic_map_list_add(copy(), el.release());
  return manage(res);
}

basic_map_list basic_map_list::alloc(ctx ctx, int n)
{
  auto res = isl_basic_map_list_alloc(ctx.release(), n);
  return manage(res);
}

basic_map_list basic_map_list::clear() const
{
  auto res = isl_basic_map_list_clear(copy());
  return manage(res);
}

basic_map_list basic_map_list::concat(basic_map_list list2) const
{
  auto res = isl_basic_map_list_concat(copy(), list2.release());
  return manage(res);
}

basic_map_list basic_map_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_basic_map_list_drop(copy(), first, n);
  return manage(res);
}

stat basic_map_list::foreach(const std::function<stat(basic_map)> &fn) const
{
  struct fn_data {
    const std::function<stat(basic_map)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_basic_map *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_basic_map_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

basic_map_list basic_map_list::from_basic_map(basic_map el)
{
  auto res = isl_basic_map_list_from_basic_map(el.release());
  return manage(res);
}

basic_map basic_map_list::get_at(int index) const
{
  auto res = isl_basic_map_list_get_at(get(), index);
  return manage(res);
}

basic_map basic_map_list::get_basic_map(int index) const
{
  auto res = isl_basic_map_list_get_basic_map(get(), index);
  return manage(res);
}

basic_map_list basic_map_list::insert(unsigned int pos, basic_map el) const
{
  auto res = isl_basic_map_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size basic_map_list::n_basic_map() const
{
  auto res = isl_basic_map_list_n_basic_map(get());
  return res;
}

basic_map_list basic_map_list::reverse() const
{
  auto res = isl_basic_map_list_reverse(copy());
  return manage(res);
}

basic_map_list basic_map_list::set_basic_map(int index, basic_map el) const
{
  auto res = isl_basic_map_list_set_basic_map(copy(), index, el.release());
  return manage(res);
}

isl_size basic_map_list::size() const
{
  auto res = isl_basic_map_list_size(get());
  return res;
}

basic_map_list basic_map_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_basic_map_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::basic_set
basic_set manage(__isl_take isl_basic_set *ptr) {
  return basic_set(ptr);
}
basic_set manage_copy(__isl_keep isl_basic_set *ptr) {
  ptr = isl_basic_set_copy(ptr);
  return basic_set(ptr);
}

basic_set::basic_set()
    : ptr(nullptr) {}

basic_set::basic_set(const basic_set &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


basic_set::basic_set(__isl_take isl_basic_set *ptr)
    : ptr(ptr) {}

basic_set::basic_set(point pnt)
{
  auto res = isl_basic_set_from_point(pnt.release());
  ptr = res;
}
basic_set::basic_set(ctx ctx, const std::string &str)
{
  auto res = isl_basic_set_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

basic_set &basic_set::operator=(basic_set obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

basic_set::~basic_set() {
  if (ptr)
    isl_basic_set_free(ptr);
}

__isl_give isl_basic_set *basic_set::copy() const & {
  return isl_basic_set_copy(ptr);
}

__isl_keep isl_basic_set *basic_set::get() const {
  return ptr;
}

__isl_give isl_basic_set *basic_set::release() {
  isl_basic_set *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool basic_set::is_null() const {
  return ptr == nullptr;
}


ctx basic_set::get_ctx() const {
  return ctx(isl_basic_set_get_ctx(ptr));
}

void basic_set::dump() const {
  isl_basic_set_dump(get());
}


basic_set basic_set::affine_hull() const
{
  auto res = isl_basic_set_affine_hull(copy());
  return manage(res);
}

basic_set basic_set::align_params(space model) const
{
  auto res = isl_basic_set_align_params(copy(), model.release());
  return manage(res);
}

basic_set basic_set::apply(basic_map bmap) const
{
  auto res = isl_basic_set_apply(copy(), bmap.release());
  return manage(res);
}

basic_set basic_set::box_from_points(point pnt1, point pnt2)
{
  auto res = isl_basic_set_box_from_points(pnt1.release(), pnt2.release());
  return manage(res);
}

basic_set basic_set::coefficients() const
{
  auto res = isl_basic_set_coefficients(copy());
  return manage(res);
}

basic_set basic_set::detect_equalities() const
{
  auto res = isl_basic_set_detect_equalities(copy());
  return manage(res);
}

isl_size basic_set::dim(isl::dim type) const
{
  auto res = isl_basic_set_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

val basic_set::dim_max_val(int pos) const
{
  auto res = isl_basic_set_dim_max_val(copy(), pos);
  return manage(res);
}

basic_set basic_set::drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_set_drop_constraints_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_set basic_set::drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_set_drop_constraints_not_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_set basic_set::drop_unused_params() const
{
  auto res = isl_basic_set_drop_unused_params(copy());
  return manage(res);
}

basic_set basic_set::eliminate(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_set_eliminate(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_set basic_set::empty(space space)
{
  auto res = isl_basic_set_empty(space.release());
  return manage(res);
}

mat basic_set::equalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4) const
{
  auto res = isl_basic_set_equalities_matrix(get(), static_cast<enum isl_dim_type>(c1), static_cast<enum isl_dim_type>(c2), static_cast<enum isl_dim_type>(c3), static_cast<enum isl_dim_type>(c4));
  return manage(res);
}

basic_set basic_set::fix_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_basic_set_fix_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

basic_set basic_set::fix_val(isl::dim type, unsigned int pos, val v) const
{
  auto res = isl_basic_set_fix_val(copy(), static_cast<enum isl_dim_type>(type), pos, v.release());
  return manage(res);
}

basic_set basic_set::flat_product(basic_set bset2) const
{
  auto res = isl_basic_set_flat_product(copy(), bset2.release());
  return manage(res);
}

basic_set basic_set::flatten() const
{
  auto res = isl_basic_set_flatten(copy());
  return manage(res);
}

stat basic_set::foreach_bound_pair(isl::dim type, unsigned int pos, const std::function<stat(constraint, constraint, basic_set)> &fn) const
{
  struct fn_data {
    const std::function<stat(constraint, constraint, basic_set)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_constraint *arg_0, isl_constraint *arg_1, isl_basic_set *arg_2, void *arg_3) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_3);
    stat ret = (*data->func)(manage(arg_0), manage(arg_1), manage(arg_2));
    return ret.release();
  };
  auto res = isl_basic_set_foreach_bound_pair(get(), static_cast<enum isl_dim_type>(type), pos, fn_lambda, &fn_data);
  return manage(res);
}

stat basic_set::foreach_constraint(const std::function<stat(constraint)> &fn) const
{
  struct fn_data {
    const std::function<stat(constraint)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_constraint *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_basic_set_foreach_constraint(get(), fn_lambda, &fn_data);
  return manage(res);
}

basic_set basic_set::from_constraint(constraint constraint)
{
  auto res = isl_basic_set_from_constraint(constraint.release());
  return manage(res);
}

basic_set basic_set::from_multi_aff(multi_aff ma)
{
  auto res = isl_basic_set_from_multi_aff(ma.release());
  return manage(res);
}

basic_set basic_set::from_params() const
{
  auto res = isl_basic_set_from_params(copy());
  return manage(res);
}

constraint_list basic_set::get_constraint_list() const
{
  auto res = isl_basic_set_get_constraint_list(get());
  return manage(res);
}

id basic_set::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_basic_set_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

std::string basic_set::get_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_basic_set_get_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  std::string tmp(res);
  return tmp;
}

aff basic_set::get_div(int pos) const
{
  auto res = isl_basic_set_get_div(get(), pos);
  return manage(res);
}

local_space basic_set::get_local_space() const
{
  auto res = isl_basic_set_get_local_space(get());
  return manage(res);
}

space basic_set::get_space() const
{
  auto res = isl_basic_set_get_space(get());
  return manage(res);
}

std::string basic_set::get_tuple_name() const
{
  auto res = isl_basic_set_get_tuple_name(get());
  std::string tmp(res);
  return tmp;
}

basic_set basic_set::gist(basic_set context) const
{
  auto res = isl_basic_set_gist(copy(), context.release());
  return manage(res);
}

mat basic_set::inequalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4) const
{
  auto res = isl_basic_set_inequalities_matrix(get(), static_cast<enum isl_dim_type>(c1), static_cast<enum isl_dim_type>(c2), static_cast<enum isl_dim_type>(c3), static_cast<enum isl_dim_type>(c4));
  return manage(res);
}

basic_set basic_set::insert_dims(isl::dim type, unsigned int pos, unsigned int n) const
{
  auto res = isl_basic_set_insert_dims(copy(), static_cast<enum isl_dim_type>(type), pos, n);
  return manage(res);
}

basic_set basic_set::intersect(basic_set bset2) const
{
  auto res = isl_basic_set_intersect(copy(), bset2.release());
  return manage(res);
}

basic_set basic_set::intersect_params(basic_set bset2) const
{
  auto res = isl_basic_set_intersect_params(copy(), bset2.release());
  return manage(res);
}

boolean basic_set::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_set_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean basic_set::is_bounded() const
{
  auto res = isl_basic_set_is_bounded(get());
  return manage(res);
}

boolean basic_set::is_disjoint(const basic_set &bset2) const
{
  auto res = isl_basic_set_is_disjoint(get(), bset2.get());
  return manage(res);
}

boolean basic_set::is_empty() const
{
  auto res = isl_basic_set_is_empty(get());
  return manage(res);
}

boolean basic_set::is_equal(const basic_set &bset2) const
{
  auto res = isl_basic_set_is_equal(get(), bset2.get());
  return manage(res);
}

int basic_set::is_rational() const
{
  auto res = isl_basic_set_is_rational(get());
  return res;
}

boolean basic_set::is_subset(const basic_set &bset2) const
{
  auto res = isl_basic_set_is_subset(get(), bset2.get());
  return manage(res);
}

boolean basic_set::is_universe() const
{
  auto res = isl_basic_set_is_universe(get());
  return manage(res);
}

boolean basic_set::is_wrapping() const
{
  auto res = isl_basic_set_is_wrapping(get());
  return manage(res);
}

set basic_set::lexmax() const
{
  auto res = isl_basic_set_lexmax(copy());
  return manage(res);
}

set basic_set::lexmin() const
{
  auto res = isl_basic_set_lexmin(copy());
  return manage(res);
}

basic_set basic_set::lower_bound_val(isl::dim type, unsigned int pos, val value) const
{
  auto res = isl_basic_set_lower_bound_val(copy(), static_cast<enum isl_dim_type>(type), pos, value.release());
  return manage(res);
}

val basic_set::max_val(const aff &obj) const
{
  auto res = isl_basic_set_max_val(get(), obj.get());
  return manage(res);
}

basic_set basic_set::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_basic_set_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

isl_size basic_set::n_constraint() const
{
  auto res = isl_basic_set_n_constraint(get());
  return res;
}

isl_size basic_set::n_dim() const
{
  auto res = isl_basic_set_n_dim(get());
  return res;
}

basic_set basic_set::nat_universe(space space)
{
  auto res = isl_basic_set_nat_universe(space.release());
  return manage(res);
}

basic_set basic_set::neg() const
{
  auto res = isl_basic_set_neg(copy());
  return manage(res);
}

basic_set basic_set::params() const
{
  auto res = isl_basic_set_params(copy());
  return manage(res);
}

boolean basic_set::plain_is_empty() const
{
  auto res = isl_basic_set_plain_is_empty(get());
  return manage(res);
}

boolean basic_set::plain_is_equal(const basic_set &bset2) const
{
  auto res = isl_basic_set_plain_is_equal(get(), bset2.get());
  return manage(res);
}

boolean basic_set::plain_is_universe() const
{
  auto res = isl_basic_set_plain_is_universe(get());
  return manage(res);
}

basic_set basic_set::positive_orthant(space space)
{
  auto res = isl_basic_set_positive_orthant(space.release());
  return manage(res);
}

basic_set basic_set::preimage_multi_aff(multi_aff ma) const
{
  auto res = isl_basic_set_preimage_multi_aff(copy(), ma.release());
  return manage(res);
}

basic_set basic_set::project_out(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_set_project_out(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

mat basic_set::reduced_basis() const
{
  auto res = isl_basic_set_reduced_basis(get());
  return manage(res);
}

basic_set basic_set::remove_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_set_remove_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_set basic_set::remove_divs() const
{
  auto res = isl_basic_set_remove_divs(copy());
  return manage(res);
}

basic_set basic_set::remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_basic_set_remove_divs_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

basic_set basic_set::remove_redundancies() const
{
  auto res = isl_basic_set_remove_redundancies(copy());
  return manage(res);
}

basic_set basic_set::remove_unknown_divs() const
{
  auto res = isl_basic_set_remove_unknown_divs(copy());
  return manage(res);
}

basic_set basic_set::sample() const
{
  auto res = isl_basic_set_sample(copy());
  return manage(res);
}

point basic_set::sample_point() const
{
  auto res = isl_basic_set_sample_point(copy());
  return manage(res);
}

basic_set basic_set::set_tuple_id(id id) const
{
  auto res = isl_basic_set_set_tuple_id(copy(), id.release());
  return manage(res);
}

basic_set basic_set::set_tuple_name(const std::string &s) const
{
  auto res = isl_basic_set_set_tuple_name(copy(), s.c_str());
  return manage(res);
}

basic_set basic_set::solutions() const
{
  auto res = isl_basic_set_solutions(copy());
  return manage(res);
}

set basic_set::unite(basic_set bset2) const
{
  auto res = isl_basic_set_union(copy(), bset2.release());
  return manage(res);
}

basic_set basic_set::universe(space space)
{
  auto res = isl_basic_set_universe(space.release());
  return manage(res);
}

basic_map basic_set::unwrap() const
{
  auto res = isl_basic_set_unwrap(copy());
  return manage(res);
}

basic_set basic_set::upper_bound_val(isl::dim type, unsigned int pos, val value) const
{
  auto res = isl_basic_set_upper_bound_val(copy(), static_cast<enum isl_dim_type>(type), pos, value.release());
  return manage(res);
}

// implementations for isl::basic_set_list
basic_set_list manage(__isl_take isl_basic_set_list *ptr) {
  return basic_set_list(ptr);
}
basic_set_list manage_copy(__isl_keep isl_basic_set_list *ptr) {
  ptr = isl_basic_set_list_copy(ptr);
  return basic_set_list(ptr);
}

basic_set_list::basic_set_list()
    : ptr(nullptr) {}

basic_set_list::basic_set_list(const basic_set_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


basic_set_list::basic_set_list(__isl_take isl_basic_set_list *ptr)
    : ptr(ptr) {}


basic_set_list &basic_set_list::operator=(basic_set_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

basic_set_list::~basic_set_list() {
  if (ptr)
    isl_basic_set_list_free(ptr);
}

__isl_give isl_basic_set_list *basic_set_list::copy() const & {
  return isl_basic_set_list_copy(ptr);
}

__isl_keep isl_basic_set_list *basic_set_list::get() const {
  return ptr;
}

__isl_give isl_basic_set_list *basic_set_list::release() {
  isl_basic_set_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool basic_set_list::is_null() const {
  return ptr == nullptr;
}


ctx basic_set_list::get_ctx() const {
  return ctx(isl_basic_set_list_get_ctx(ptr));
}

void basic_set_list::dump() const {
  isl_basic_set_list_dump(get());
}


basic_set_list basic_set_list::add(basic_set el) const
{
  auto res = isl_basic_set_list_add(copy(), el.release());
  return manage(res);
}

basic_set_list basic_set_list::alloc(ctx ctx, int n)
{
  auto res = isl_basic_set_list_alloc(ctx.release(), n);
  return manage(res);
}

basic_set_list basic_set_list::clear() const
{
  auto res = isl_basic_set_list_clear(copy());
  return manage(res);
}

basic_set_list basic_set_list::coefficients() const
{
  auto res = isl_basic_set_list_coefficients(copy());
  return manage(res);
}

basic_set_list basic_set_list::concat(basic_set_list list2) const
{
  auto res = isl_basic_set_list_concat(copy(), list2.release());
  return manage(res);
}

basic_set_list basic_set_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_basic_set_list_drop(copy(), first, n);
  return manage(res);
}

stat basic_set_list::foreach(const std::function<stat(basic_set)> &fn) const
{
  struct fn_data {
    const std::function<stat(basic_set)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_basic_set *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_basic_set_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

basic_set_list basic_set_list::from_basic_set(basic_set el)
{
  auto res = isl_basic_set_list_from_basic_set(el.release());
  return manage(res);
}

basic_set basic_set_list::get_at(int index) const
{
  auto res = isl_basic_set_list_get_at(get(), index);
  return manage(res);
}

basic_set basic_set_list::get_basic_set(int index) const
{
  auto res = isl_basic_set_list_get_basic_set(get(), index);
  return manage(res);
}

basic_set_list basic_set_list::insert(unsigned int pos, basic_set el) const
{
  auto res = isl_basic_set_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size basic_set_list::n_basic_set() const
{
  auto res = isl_basic_set_list_n_basic_set(get());
  return res;
}

basic_set_list basic_set_list::reverse() const
{
  auto res = isl_basic_set_list_reverse(copy());
  return manage(res);
}

basic_set_list basic_set_list::set_basic_set(int index, basic_set el) const
{
  auto res = isl_basic_set_list_set_basic_set(copy(), index, el.release());
  return manage(res);
}

isl_size basic_set_list::size() const
{
  auto res = isl_basic_set_list_size(get());
  return res;
}

basic_set_list basic_set_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_basic_set_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::constraint
constraint manage(__isl_take isl_constraint *ptr) {
  return constraint(ptr);
}
constraint manage_copy(__isl_keep isl_constraint *ptr) {
  ptr = isl_constraint_copy(ptr);
  return constraint(ptr);
}

constraint::constraint()
    : ptr(nullptr) {}

constraint::constraint(const constraint &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


constraint::constraint(__isl_take isl_constraint *ptr)
    : ptr(ptr) {}


constraint &constraint::operator=(constraint obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

constraint::~constraint() {
  if (ptr)
    isl_constraint_free(ptr);
}

__isl_give isl_constraint *constraint::copy() const & {
  return isl_constraint_copy(ptr);
}

__isl_keep isl_constraint *constraint::get() const {
  return ptr;
}

__isl_give isl_constraint *constraint::release() {
  isl_constraint *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool constraint::is_null() const {
  return ptr == nullptr;
}


ctx constraint::get_ctx() const {
  return ctx(isl_constraint_get_ctx(ptr));
}

void constraint::dump() const {
  isl_constraint_dump(get());
}


constraint constraint::alloc_equality(local_space ls)
{
  auto res = isl_constraint_alloc_equality(ls.release());
  return manage(res);
}

constraint constraint::alloc_inequality(local_space ls)
{
  auto res = isl_constraint_alloc_inequality(ls.release());
  return manage(res);
}

int constraint::cmp_last_non_zero(const constraint &c2) const
{
  auto res = isl_constraint_cmp_last_non_zero(get(), c2.get());
  return res;
}

aff constraint::get_aff() const
{
  auto res = isl_constraint_get_aff(get());
  return manage(res);
}

aff constraint::get_bound(isl::dim type, int pos) const
{
  auto res = isl_constraint_get_bound(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

val constraint::get_coefficient_val(isl::dim type, int pos) const
{
  auto res = isl_constraint_get_coefficient_val(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

val constraint::get_constant_val() const
{
  auto res = isl_constraint_get_constant_val(get());
  return manage(res);
}

std::string constraint::get_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_constraint_get_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  std::string tmp(res);
  return tmp;
}

aff constraint::get_div(int pos) const
{
  auto res = isl_constraint_get_div(get(), pos);
  return manage(res);
}

local_space constraint::get_local_space() const
{
  auto res = isl_constraint_get_local_space(get());
  return manage(res);
}

space constraint::get_space() const
{
  auto res = isl_constraint_get_space(get());
  return manage(res);
}

boolean constraint::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_constraint_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean constraint::is_div_constraint() const
{
  auto res = isl_constraint_is_div_constraint(get());
  return manage(res);
}

boolean constraint::is_lower_bound(isl::dim type, unsigned int pos) const
{
  auto res = isl_constraint_is_lower_bound(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean constraint::is_upper_bound(isl::dim type, unsigned int pos) const
{
  auto res = isl_constraint_is_upper_bound(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

int constraint::plain_cmp(const constraint &c2) const
{
  auto res = isl_constraint_plain_cmp(get(), c2.get());
  return res;
}

constraint constraint::set_coefficient_si(isl::dim type, int pos, int v) const
{
  auto res = isl_constraint_set_coefficient_si(copy(), static_cast<enum isl_dim_type>(type), pos, v);
  return manage(res);
}

constraint constraint::set_coefficient_val(isl::dim type, int pos, val v) const
{
  auto res = isl_constraint_set_coefficient_val(copy(), static_cast<enum isl_dim_type>(type), pos, v.release());
  return manage(res);
}

constraint constraint::set_constant_si(int v) const
{
  auto res = isl_constraint_set_constant_si(copy(), v);
  return manage(res);
}

constraint constraint::set_constant_val(val v) const
{
  auto res = isl_constraint_set_constant_val(copy(), v.release());
  return manage(res);
}

// implementations for isl::constraint_list
constraint_list manage(__isl_take isl_constraint_list *ptr) {
  return constraint_list(ptr);
}
constraint_list manage_copy(__isl_keep isl_constraint_list *ptr) {
  ptr = isl_constraint_list_copy(ptr);
  return constraint_list(ptr);
}

constraint_list::constraint_list()
    : ptr(nullptr) {}

constraint_list::constraint_list(const constraint_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


constraint_list::constraint_list(__isl_take isl_constraint_list *ptr)
    : ptr(ptr) {}


constraint_list &constraint_list::operator=(constraint_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

constraint_list::~constraint_list() {
  if (ptr)
    isl_constraint_list_free(ptr);
}

__isl_give isl_constraint_list *constraint_list::copy() const & {
  return isl_constraint_list_copy(ptr);
}

__isl_keep isl_constraint_list *constraint_list::get() const {
  return ptr;
}

__isl_give isl_constraint_list *constraint_list::release() {
  isl_constraint_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool constraint_list::is_null() const {
  return ptr == nullptr;
}


ctx constraint_list::get_ctx() const {
  return ctx(isl_constraint_list_get_ctx(ptr));
}

void constraint_list::dump() const {
  isl_constraint_list_dump(get());
}


constraint_list constraint_list::add(constraint el) const
{
  auto res = isl_constraint_list_add(copy(), el.release());
  return manage(res);
}

constraint_list constraint_list::alloc(ctx ctx, int n)
{
  auto res = isl_constraint_list_alloc(ctx.release(), n);
  return manage(res);
}

constraint_list constraint_list::clear() const
{
  auto res = isl_constraint_list_clear(copy());
  return manage(res);
}

constraint_list constraint_list::concat(constraint_list list2) const
{
  auto res = isl_constraint_list_concat(copy(), list2.release());
  return manage(res);
}

constraint_list constraint_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_constraint_list_drop(copy(), first, n);
  return manage(res);
}

stat constraint_list::foreach(const std::function<stat(constraint)> &fn) const
{
  struct fn_data {
    const std::function<stat(constraint)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_constraint *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_constraint_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

constraint_list constraint_list::from_constraint(constraint el)
{
  auto res = isl_constraint_list_from_constraint(el.release());
  return manage(res);
}

constraint constraint_list::get_at(int index) const
{
  auto res = isl_constraint_list_get_at(get(), index);
  return manage(res);
}

constraint constraint_list::get_constraint(int index) const
{
  auto res = isl_constraint_list_get_constraint(get(), index);
  return manage(res);
}

constraint_list constraint_list::insert(unsigned int pos, constraint el) const
{
  auto res = isl_constraint_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size constraint_list::n_constraint() const
{
  auto res = isl_constraint_list_n_constraint(get());
  return res;
}

constraint_list constraint_list::reverse() const
{
  auto res = isl_constraint_list_reverse(copy());
  return manage(res);
}

constraint_list constraint_list::set_constraint(int index, constraint el) const
{
  auto res = isl_constraint_list_set_constraint(copy(), index, el.release());
  return manage(res);
}

isl_size constraint_list::size() const
{
  auto res = isl_constraint_list_size(get());
  return res;
}

constraint_list constraint_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_constraint_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::fixed_box
fixed_box manage(__isl_take isl_fixed_box *ptr) {
  return fixed_box(ptr);
}
fixed_box manage_copy(__isl_keep isl_fixed_box *ptr) {
  ptr = isl_fixed_box_copy(ptr);
  return fixed_box(ptr);
}

fixed_box::fixed_box()
    : ptr(nullptr) {}

fixed_box::fixed_box(const fixed_box &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


fixed_box::fixed_box(__isl_take isl_fixed_box *ptr)
    : ptr(ptr) {}


fixed_box &fixed_box::operator=(fixed_box obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

fixed_box::~fixed_box() {
  if (ptr)
    isl_fixed_box_free(ptr);
}

__isl_give isl_fixed_box *fixed_box::copy() const & {
  return isl_fixed_box_copy(ptr);
}

__isl_keep isl_fixed_box *fixed_box::get() const {
  return ptr;
}

__isl_give isl_fixed_box *fixed_box::release() {
  isl_fixed_box *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool fixed_box::is_null() const {
  return ptr == nullptr;
}


ctx fixed_box::get_ctx() const {
  return ctx(isl_fixed_box_get_ctx(ptr));
}

void fixed_box::dump() const {
  isl_fixed_box_dump(get());
}


multi_aff fixed_box::get_offset() const
{
  auto res = isl_fixed_box_get_offset(get());
  return manage(res);
}

multi_val fixed_box::get_size() const
{
  auto res = isl_fixed_box_get_size(get());
  return manage(res);
}

space fixed_box::get_space() const
{
  auto res = isl_fixed_box_get_space(get());
  return manage(res);
}

boolean fixed_box::is_valid() const
{
  auto res = isl_fixed_box_is_valid(get());
  return manage(res);
}

// implementations for isl::id
id manage(__isl_take isl_id *ptr) {
  return id(ptr);
}
id manage_copy(__isl_keep isl_id *ptr) {
  ptr = isl_id_copy(ptr);
  return id(ptr);
}

id::id()
    : ptr(nullptr) {}

id::id(const id &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


id::id(__isl_take isl_id *ptr)
    : ptr(ptr) {}

id::id(ctx ctx, const std::string &str)
{
  auto res = isl_id_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

id &id::operator=(id obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

id::~id() {
  if (ptr)
    isl_id_free(ptr);
}

__isl_give isl_id *id::copy() const & {
  return isl_id_copy(ptr);
}

__isl_keep isl_id *id::get() const {
  return ptr;
}

__isl_give isl_id *id::release() {
  isl_id *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool id::is_null() const {
  return ptr == nullptr;
}


ctx id::get_ctx() const {
  return ctx(isl_id_get_ctx(ptr));
}

void id::dump() const {
  isl_id_dump(get());
}


id id::alloc(ctx ctx, const std::string &name, void * user)
{
  auto res = isl_id_alloc(ctx.release(), name.c_str(), user);
  return manage(res);
}

uint32_t id::get_hash() const
{
  auto res = isl_id_get_hash(get());
  return res;
}

std::string id::get_name() const
{
  auto res = isl_id_get_name(get());
  std::string tmp(res);
  return tmp;
}

void * id::get_user() const
{
  auto res = isl_id_get_user(get());
  return res;
}

// implementations for isl::id_list
id_list manage(__isl_take isl_id_list *ptr) {
  return id_list(ptr);
}
id_list manage_copy(__isl_keep isl_id_list *ptr) {
  ptr = isl_id_list_copy(ptr);
  return id_list(ptr);
}

id_list::id_list()
    : ptr(nullptr) {}

id_list::id_list(const id_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


id_list::id_list(__isl_take isl_id_list *ptr)
    : ptr(ptr) {}


id_list &id_list::operator=(id_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

id_list::~id_list() {
  if (ptr)
    isl_id_list_free(ptr);
}

__isl_give isl_id_list *id_list::copy() const & {
  return isl_id_list_copy(ptr);
}

__isl_keep isl_id_list *id_list::get() const {
  return ptr;
}

__isl_give isl_id_list *id_list::release() {
  isl_id_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool id_list::is_null() const {
  return ptr == nullptr;
}


ctx id_list::get_ctx() const {
  return ctx(isl_id_list_get_ctx(ptr));
}

void id_list::dump() const {
  isl_id_list_dump(get());
}


id_list id_list::add(id el) const
{
  auto res = isl_id_list_add(copy(), el.release());
  return manage(res);
}

id_list id_list::alloc(ctx ctx, int n)
{
  auto res = isl_id_list_alloc(ctx.release(), n);
  return manage(res);
}

id_list id_list::clear() const
{
  auto res = isl_id_list_clear(copy());
  return manage(res);
}

id_list id_list::concat(id_list list2) const
{
  auto res = isl_id_list_concat(copy(), list2.release());
  return manage(res);
}

id_list id_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_id_list_drop(copy(), first, n);
  return manage(res);
}

stat id_list::foreach(const std::function<stat(id)> &fn) const
{
  struct fn_data {
    const std::function<stat(id)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_id *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_id_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

id_list id_list::from_id(id el)
{
  auto res = isl_id_list_from_id(el.release());
  return manage(res);
}

id id_list::get_at(int index) const
{
  auto res = isl_id_list_get_at(get(), index);
  return manage(res);
}

id id_list::get_id(int index) const
{
  auto res = isl_id_list_get_id(get(), index);
  return manage(res);
}

id_list id_list::insert(unsigned int pos, id el) const
{
  auto res = isl_id_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size id_list::n_id() const
{
  auto res = isl_id_list_n_id(get());
  return res;
}

id_list id_list::reverse() const
{
  auto res = isl_id_list_reverse(copy());
  return manage(res);
}

id_list id_list::set_id(int index, id el) const
{
  auto res = isl_id_list_set_id(copy(), index, el.release());
  return manage(res);
}

isl_size id_list::size() const
{
  auto res = isl_id_list_size(get());
  return res;
}

id_list id_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_id_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::id_to_ast_expr
id_to_ast_expr manage(__isl_take isl_id_to_ast_expr *ptr) {
  return id_to_ast_expr(ptr);
}
id_to_ast_expr manage_copy(__isl_keep isl_id_to_ast_expr *ptr) {
  ptr = isl_id_to_ast_expr_copy(ptr);
  return id_to_ast_expr(ptr);
}

id_to_ast_expr::id_to_ast_expr()
    : ptr(nullptr) {}

id_to_ast_expr::id_to_ast_expr(const id_to_ast_expr &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


id_to_ast_expr::id_to_ast_expr(__isl_take isl_id_to_ast_expr *ptr)
    : ptr(ptr) {}


id_to_ast_expr &id_to_ast_expr::operator=(id_to_ast_expr obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

id_to_ast_expr::~id_to_ast_expr() {
  if (ptr)
    isl_id_to_ast_expr_free(ptr);
}

__isl_give isl_id_to_ast_expr *id_to_ast_expr::copy() const & {
  return isl_id_to_ast_expr_copy(ptr);
}

__isl_keep isl_id_to_ast_expr *id_to_ast_expr::get() const {
  return ptr;
}

__isl_give isl_id_to_ast_expr *id_to_ast_expr::release() {
  isl_id_to_ast_expr *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool id_to_ast_expr::is_null() const {
  return ptr == nullptr;
}


ctx id_to_ast_expr::get_ctx() const {
  return ctx(isl_id_to_ast_expr_get_ctx(ptr));
}

void id_to_ast_expr::dump() const {
  isl_id_to_ast_expr_dump(get());
}


id_to_ast_expr id_to_ast_expr::alloc(ctx ctx, int min_size)
{
  auto res = isl_id_to_ast_expr_alloc(ctx.release(), min_size);
  return manage(res);
}

id_to_ast_expr id_to_ast_expr::drop(id key) const
{
  auto res = isl_id_to_ast_expr_drop(copy(), key.release());
  return manage(res);
}

stat id_to_ast_expr::foreach(const std::function<stat(id, ast_expr)> &fn) const
{
  struct fn_data {
    const std::function<stat(id, ast_expr)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_id *arg_0, isl_ast_expr *arg_1, void *arg_2) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_2);
    stat ret = (*data->func)(manage(arg_0), manage(arg_1));
    return ret.release();
  };
  auto res = isl_id_to_ast_expr_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

ast_expr id_to_ast_expr::get(id key) const
{
  auto res = isl_id_to_ast_expr_get(get(), key.release());
  return manage(res);
}

boolean id_to_ast_expr::has(const id &key) const
{
  auto res = isl_id_to_ast_expr_has(get(), key.get());
  return manage(res);
}

id_to_ast_expr id_to_ast_expr::set(id key, ast_expr val) const
{
  auto res = isl_id_to_ast_expr_set(copy(), key.release(), val.release());
  return manage(res);
}

// implementations for isl::local_space
local_space manage(__isl_take isl_local_space *ptr) {
  return local_space(ptr);
}
local_space manage_copy(__isl_keep isl_local_space *ptr) {
  ptr = isl_local_space_copy(ptr);
  return local_space(ptr);
}

local_space::local_space()
    : ptr(nullptr) {}

local_space::local_space(const local_space &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


local_space::local_space(__isl_take isl_local_space *ptr)
    : ptr(ptr) {}

local_space::local_space(space space)
{
  auto res = isl_local_space_from_space(space.release());
  ptr = res;
}

local_space &local_space::operator=(local_space obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

local_space::~local_space() {
  if (ptr)
    isl_local_space_free(ptr);
}

__isl_give isl_local_space *local_space::copy() const & {
  return isl_local_space_copy(ptr);
}

__isl_keep isl_local_space *local_space::get() const {
  return ptr;
}

__isl_give isl_local_space *local_space::release() {
  isl_local_space *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool local_space::is_null() const {
  return ptr == nullptr;
}


ctx local_space::get_ctx() const {
  return ctx(isl_local_space_get_ctx(ptr));
}

void local_space::dump() const {
  isl_local_space_dump(get());
}


local_space local_space::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_local_space_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

isl_size local_space::dim(isl::dim type) const
{
  auto res = isl_local_space_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

local_space local_space::domain() const
{
  auto res = isl_local_space_domain(copy());
  return manage(res);
}

local_space local_space::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_local_space_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

int local_space::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_local_space_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

local_space local_space::flatten_domain() const
{
  auto res = isl_local_space_flatten_domain(copy());
  return manage(res);
}

local_space local_space::flatten_range() const
{
  auto res = isl_local_space_flatten_range(copy());
  return manage(res);
}

local_space local_space::from_domain() const
{
  auto res = isl_local_space_from_domain(copy());
  return manage(res);
}

id local_space::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_local_space_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

std::string local_space::get_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_local_space_get_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  std::string tmp(res);
  return tmp;
}

aff local_space::get_div(int pos) const
{
  auto res = isl_local_space_get_div(get(), pos);
  return manage(res);
}

space local_space::get_space() const
{
  auto res = isl_local_space_get_space(get());
  return manage(res);
}

boolean local_space::has_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_local_space_has_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean local_space::has_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_local_space_has_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

local_space local_space::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_local_space_insert_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

local_space local_space::intersect(local_space ls2) const
{
  auto res = isl_local_space_intersect(copy(), ls2.release());
  return manage(res);
}

boolean local_space::is_equal(const local_space &ls2) const
{
  auto res = isl_local_space_is_equal(get(), ls2.get());
  return manage(res);
}

boolean local_space::is_params() const
{
  auto res = isl_local_space_is_params(get());
  return manage(res);
}

boolean local_space::is_set() const
{
  auto res = isl_local_space_is_set(get());
  return manage(res);
}

local_space local_space::range() const
{
  auto res = isl_local_space_range(copy());
  return manage(res);
}

local_space local_space::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_local_space_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

local_space local_space::set_from_params() const
{
  auto res = isl_local_space_set_from_params(copy());
  return manage(res);
}

local_space local_space::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_local_space_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

local_space local_space::wrap() const
{
  auto res = isl_local_space_wrap(copy());
  return manage(res);
}

// implementations for isl::map
map manage(__isl_take isl_map *ptr) {
  return map(ptr);
}
map manage_copy(__isl_keep isl_map *ptr) {
  ptr = isl_map_copy(ptr);
  return map(ptr);
}

map::map()
    : ptr(nullptr) {}

map::map(const map &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


map::map(__isl_take isl_map *ptr)
    : ptr(ptr) {}

map::map(basic_map bmap)
{
  auto res = isl_map_from_basic_map(bmap.release());
  ptr = res;
}
map::map(ctx ctx, const std::string &str)
{
  auto res = isl_map_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

map &map::operator=(map obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

map::~map() {
  if (ptr)
    isl_map_free(ptr);
}

__isl_give isl_map *map::copy() const & {
  return isl_map_copy(ptr);
}

__isl_keep isl_map *map::get() const {
  return ptr;
}

__isl_give isl_map *map::release() {
  isl_map *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool map::is_null() const {
  return ptr == nullptr;
}


ctx map::get_ctx() const {
  return ctx(isl_map_get_ctx(ptr));
}

void map::dump() const {
  isl_map_dump(get());
}


map map::add_constraint(constraint constraint) const
{
  auto res = isl_map_add_constraint(copy(), constraint.release());
  return manage(res);
}

map map::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_map_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

basic_map map::affine_hull() const
{
  auto res = isl_map_affine_hull(copy());
  return manage(res);
}

map map::align_params(space model) const
{
  auto res = isl_map_align_params(copy(), model.release());
  return manage(res);
}

map map::apply_domain(map map2) const
{
  auto res = isl_map_apply_domain(copy(), map2.release());
  return manage(res);
}

map map::apply_range(map map2) const
{
  auto res = isl_map_apply_range(copy(), map2.release());
  return manage(res);
}

set map::bind_domain(multi_id tuple) const
{
  auto res = isl_map_bind_domain(copy(), tuple.release());
  return manage(res);
}

set map::bind_range(multi_id tuple) const
{
  auto res = isl_map_bind_range(copy(), tuple.release());
  return manage(res);
}

boolean map::can_curry() const
{
  auto res = isl_map_can_curry(get());
  return manage(res);
}

boolean map::can_range_curry() const
{
  auto res = isl_map_can_range_curry(get());
  return manage(res);
}

boolean map::can_uncurry() const
{
  auto res = isl_map_can_uncurry(get());
  return manage(res);
}

boolean map::can_zip() const
{
  auto res = isl_map_can_zip(get());
  return manage(res);
}

map map::coalesce() const
{
  auto res = isl_map_coalesce(copy());
  return manage(res);
}

map map::complement() const
{
  auto res = isl_map_complement(copy());
  return manage(res);
}

basic_map map::convex_hull() const
{
  auto res = isl_map_convex_hull(copy());
  return manage(res);
}

map map::curry() const
{
  auto res = isl_map_curry(copy());
  return manage(res);
}

set map::deltas() const
{
  auto res = isl_map_deltas(copy());
  return manage(res);
}

map map::deltas_map() const
{
  auto res = isl_map_deltas_map(copy());
  return manage(res);
}

map map::detect_equalities() const
{
  auto res = isl_map_detect_equalities(copy());
  return manage(res);
}

isl_size map::dim(isl::dim type) const
{
  auto res = isl_map_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

pw_aff map::dim_max(int pos) const
{
  auto res = isl_map_dim_max(copy(), pos);
  return manage(res);
}

pw_aff map::dim_min(int pos) const
{
  auto res = isl_map_dim_min(copy(), pos);
  return manage(res);
}

set map::domain() const
{
  auto res = isl_map_domain(copy());
  return manage(res);
}

map map::domain_factor_domain() const
{
  auto res = isl_map_domain_factor_domain(copy());
  return manage(res);
}

map map::domain_factor_range() const
{
  auto res = isl_map_domain_factor_range(copy());
  return manage(res);
}

boolean map::domain_is_wrapping() const
{
  auto res = isl_map_domain_is_wrapping(get());
  return manage(res);
}

map map::domain_map() const
{
  auto res = isl_map_domain_map(copy());
  return manage(res);
}

map map::domain_product(map map2) const
{
  auto res = isl_map_domain_product(copy(), map2.release());
  return manage(res);
}

isl_size map::domain_tuple_dim() const
{
  auto res = isl_map_domain_tuple_dim(get());
  return res;
}

map map::drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_map_drop_constraints_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

map map::drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_map_drop_constraints_not_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

map map::drop_unused_params() const
{
  auto res = isl_map_drop_unused_params(copy());
  return manage(res);
}

map map::eliminate(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_map_eliminate(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

map map::empty(space space)
{
  auto res = isl_map_empty(space.release());
  return manage(res);
}

map map::eq_at(multi_pw_aff mpa) const
{
  auto res = isl_map_eq_at_multi_pw_aff(copy(), mpa.release());
  return manage(res);
}

map map::equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const
{
  auto res = isl_map_equate(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
  return manage(res);
}

map map::factor_domain() const
{
  auto res = isl_map_factor_domain(copy());
  return manage(res);
}

map map::factor_range() const
{
  auto res = isl_map_factor_range(copy());
  return manage(res);
}

int map::find_dim_by_id(isl::dim type, const id &id) const
{
  auto res = isl_map_find_dim_by_id(get(), static_cast<enum isl_dim_type>(type), id.get());
  return res;
}

int map::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_map_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

map map::fix_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_map_fix_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

map map::fix_val(isl::dim type, unsigned int pos, val v) const
{
  auto res = isl_map_fix_val(copy(), static_cast<enum isl_dim_type>(type), pos, v.release());
  return manage(res);
}

map map::fixed_power_val(val exp) const
{
  auto res = isl_map_fixed_power_val(copy(), exp.release());
  return manage(res);
}

map map::flat_domain_product(map map2) const
{
  auto res = isl_map_flat_domain_product(copy(), map2.release());
  return manage(res);
}

map map::flat_product(map map2) const
{
  auto res = isl_map_flat_product(copy(), map2.release());
  return manage(res);
}

map map::flat_range_product(map map2) const
{
  auto res = isl_map_flat_range_product(copy(), map2.release());
  return manage(res);
}

map map::flatten() const
{
  auto res = isl_map_flatten(copy());
  return manage(res);
}

map map::flatten_domain() const
{
  auto res = isl_map_flatten_domain(copy());
  return manage(res);
}

map map::flatten_range() const
{
  auto res = isl_map_flatten_range(copy());
  return manage(res);
}

map map::floordiv_val(val d) const
{
  auto res = isl_map_floordiv_val(copy(), d.release());
  return manage(res);
}

stat map::foreach_basic_map(const std::function<stat(basic_map)> &fn) const
{
  struct fn_data {
    const std::function<stat(basic_map)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_basic_map *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_map_foreach_basic_map(get(), fn_lambda, &fn_data);
  return manage(res);
}

map map::from_aff(aff aff)
{
  auto res = isl_map_from_aff(aff.release());
  return manage(res);
}

map map::from_domain(set set)
{
  auto res = isl_map_from_domain(set.release());
  return manage(res);
}

map map::from_domain_and_range(set domain, set range)
{
  auto res = isl_map_from_domain_and_range(domain.release(), range.release());
  return manage(res);
}

map map::from_multi_aff(multi_aff maff)
{
  auto res = isl_map_from_multi_aff(maff.release());
  return manage(res);
}

map map::from_multi_pw_aff(multi_pw_aff mpa)
{
  auto res = isl_map_from_multi_pw_aff(mpa.release());
  return manage(res);
}

map map::from_pw_aff(pw_aff pwaff)
{
  auto res = isl_map_from_pw_aff(pwaff.release());
  return manage(res);
}

map map::from_pw_multi_aff(pw_multi_aff pma)
{
  auto res = isl_map_from_pw_multi_aff(pma.release());
  return manage(res);
}

map map::from_range(set set)
{
  auto res = isl_map_from_range(set.release());
  return manage(res);
}

map map::from_union_map(union_map umap)
{
  auto res = isl_map_from_union_map(umap.release());
  return manage(res);
}

basic_map_list map::get_basic_map_list() const
{
  auto res = isl_map_get_basic_map_list(get());
  return manage(res);
}

id map::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_map_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

std::string map::get_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_map_get_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  std::string tmp(res);
  return tmp;
}

uint32_t map::get_hash() const
{
  auto res = isl_map_get_hash(get());
  return res;
}

fixed_box map::get_range_simple_fixed_box_hull() const
{
  auto res = isl_map_get_range_simple_fixed_box_hull(get());
  return manage(res);
}

space map::get_space() const
{
  auto res = isl_map_get_space(get());
  return manage(res);
}

id map::get_tuple_id(isl::dim type) const
{
  auto res = isl_map_get_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

std::string map::get_tuple_name(isl::dim type) const
{
  auto res = isl_map_get_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  std::string tmp(res);
  return tmp;
}

map map::gist(map context) const
{
  auto res = isl_map_gist(copy(), context.release());
  return manage(res);
}

map map::gist_basic_map(basic_map context) const
{
  auto res = isl_map_gist_basic_map(copy(), context.release());
  return manage(res);
}

map map::gist_domain(set context) const
{
  auto res = isl_map_gist_domain(copy(), context.release());
  return manage(res);
}

map map::gist_params(set context) const
{
  auto res = isl_map_gist_params(copy(), context.release());
  return manage(res);
}

map map::gist_range(set context) const
{
  auto res = isl_map_gist_range(copy(), context.release());
  return manage(res);
}

boolean map::has_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_map_has_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean map::has_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_map_has_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean map::has_equal_space(const map &map2) const
{
  auto res = isl_map_has_equal_space(get(), map2.get());
  return manage(res);
}

boolean map::has_tuple_id(isl::dim type) const
{
  auto res = isl_map_has_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

boolean map::has_tuple_name(isl::dim type) const
{
  auto res = isl_map_has_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

map map::identity(space space)
{
  auto res = isl_map_identity(space.release());
  return manage(res);
}

map map::insert_dims(isl::dim type, unsigned int pos, unsigned int n) const
{
  auto res = isl_map_insert_dims(copy(), static_cast<enum isl_dim_type>(type), pos, n);
  return manage(res);
}

map map::intersect(map map2) const
{
  auto res = isl_map_intersect(copy(), map2.release());
  return manage(res);
}

map map::intersect_domain(set set) const
{
  auto res = isl_map_intersect_domain(copy(), set.release());
  return manage(res);
}

map map::intersect_domain_factor_domain(map factor) const
{
  auto res = isl_map_intersect_domain_factor_domain(copy(), factor.release());
  return manage(res);
}

map map::intersect_domain_factor_range(map factor) const
{
  auto res = isl_map_intersect_domain_factor_range(copy(), factor.release());
  return manage(res);
}

map map::intersect_params(set params) const
{
  auto res = isl_map_intersect_params(copy(), params.release());
  return manage(res);
}

map map::intersect_range(set set) const
{
  auto res = isl_map_intersect_range(copy(), set.release());
  return manage(res);
}

map map::intersect_range_factor_domain(map factor) const
{
  auto res = isl_map_intersect_range_factor_domain(copy(), factor.release());
  return manage(res);
}

map map::intersect_range_factor_range(map factor) const
{
  auto res = isl_map_intersect_range_factor_range(copy(), factor.release());
  return manage(res);
}

boolean map::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_map_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean map::is_bijective() const
{
  auto res = isl_map_is_bijective(get());
  return manage(res);
}

boolean map::is_disjoint(const map &map2) const
{
  auto res = isl_map_is_disjoint(get(), map2.get());
  return manage(res);
}

boolean map::is_empty() const
{
  auto res = isl_map_is_empty(get());
  return manage(res);
}

boolean map::is_equal(const map &map2) const
{
  auto res = isl_map_is_equal(get(), map2.get());
  return manage(res);
}

boolean map::is_identity() const
{
  auto res = isl_map_is_identity(get());
  return manage(res);
}

boolean map::is_injective() const
{
  auto res = isl_map_is_injective(get());
  return manage(res);
}

boolean map::is_product() const
{
  auto res = isl_map_is_product(get());
  return manage(res);
}

boolean map::is_single_valued() const
{
  auto res = isl_map_is_single_valued(get());
  return manage(res);
}

boolean map::is_strict_subset(const map &map2) const
{
  auto res = isl_map_is_strict_subset(get(), map2.get());
  return manage(res);
}

boolean map::is_subset(const map &map2) const
{
  auto res = isl_map_is_subset(get(), map2.get());
  return manage(res);
}

int map::is_translation() const
{
  auto res = isl_map_is_translation(get());
  return res;
}

map map::lex_ge(space set_space)
{
  auto res = isl_map_lex_ge(set_space.release());
  return manage(res);
}

map map::lex_ge_at(multi_pw_aff mpa) const
{
  auto res = isl_map_lex_ge_at_multi_pw_aff(copy(), mpa.release());
  return manage(res);
}

map map::lex_ge_first(space space, unsigned int n)
{
  auto res = isl_map_lex_ge_first(space.release(), n);
  return manage(res);
}

map map::lex_ge_map(map map2) const
{
  auto res = isl_map_lex_ge_map(copy(), map2.release());
  return manage(res);
}

map map::lex_gt(space set_space)
{
  auto res = isl_map_lex_gt(set_space.release());
  return manage(res);
}

map map::lex_gt_at(multi_pw_aff mpa) const
{
  auto res = isl_map_lex_gt_at_multi_pw_aff(copy(), mpa.release());
  return manage(res);
}

map map::lex_gt_first(space space, unsigned int n)
{
  auto res = isl_map_lex_gt_first(space.release(), n);
  return manage(res);
}

map map::lex_gt_map(map map2) const
{
  auto res = isl_map_lex_gt_map(copy(), map2.release());
  return manage(res);
}

map map::lex_le(space set_space)
{
  auto res = isl_map_lex_le(set_space.release());
  return manage(res);
}

map map::lex_le_at(multi_pw_aff mpa) const
{
  auto res = isl_map_lex_le_at_multi_pw_aff(copy(), mpa.release());
  return manage(res);
}

map map::lex_le_first(space space, unsigned int n)
{
  auto res = isl_map_lex_le_first(space.release(), n);
  return manage(res);
}

map map::lex_le_map(map map2) const
{
  auto res = isl_map_lex_le_map(copy(), map2.release());
  return manage(res);
}

map map::lex_lt(space set_space)
{
  auto res = isl_map_lex_lt(set_space.release());
  return manage(res);
}

map map::lex_lt_at(multi_pw_aff mpa) const
{
  auto res = isl_map_lex_lt_at_multi_pw_aff(copy(), mpa.release());
  return manage(res);
}

map map::lex_lt_first(space space, unsigned int n)
{
  auto res = isl_map_lex_lt_first(space.release(), n);
  return manage(res);
}

map map::lex_lt_map(map map2) const
{
  auto res = isl_map_lex_lt_map(copy(), map2.release());
  return manage(res);
}

map map::lexmax() const
{
  auto res = isl_map_lexmax(copy());
  return manage(res);
}

pw_multi_aff map::lexmax_pw_multi_aff() const
{
  auto res = isl_map_lexmax_pw_multi_aff(copy());
  return manage(res);
}

map map::lexmin() const
{
  auto res = isl_map_lexmin(copy());
  return manage(res);
}

pw_multi_aff map::lexmin_pw_multi_aff() const
{
  auto res = isl_map_lexmin_pw_multi_aff(copy());
  return manage(res);
}

map map::lower_bound(multi_pw_aff lower) const
{
  auto res = isl_map_lower_bound_multi_pw_aff(copy(), lower.release());
  return manage(res);
}

map map::lower_bound_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_map_lower_bound_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

map map::lower_bound_val(isl::dim type, unsigned int pos, val value) const
{
  auto res = isl_map_lower_bound_val(copy(), static_cast<enum isl_dim_type>(type), pos, value.release());
  return manage(res);
}

multi_pw_aff map::max_multi_pw_aff() const
{
  auto res = isl_map_max_multi_pw_aff(copy());
  return manage(res);
}

multi_pw_aff map::min_multi_pw_aff() const
{
  auto res = isl_map_min_multi_pw_aff(copy());
  return manage(res);
}

map map::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_map_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

isl_size map::n_basic_map() const
{
  auto res = isl_map_n_basic_map(get());
  return res;
}

map map::nat_universe(space space)
{
  auto res = isl_map_nat_universe(space.release());
  return manage(res);
}

map map::neg() const
{
  auto res = isl_map_neg(copy());
  return manage(res);
}

map map::oppose(isl::dim type1, int pos1, isl::dim type2, int pos2) const
{
  auto res = isl_map_oppose(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
  return manage(res);
}

map map::order_ge(isl::dim type1, int pos1, isl::dim type2, int pos2) const
{
  auto res = isl_map_order_ge(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
  return manage(res);
}

map map::order_gt(isl::dim type1, int pos1, isl::dim type2, int pos2) const
{
  auto res = isl_map_order_gt(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
  return manage(res);
}

map map::order_le(isl::dim type1, int pos1, isl::dim type2, int pos2) const
{
  auto res = isl_map_order_le(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
  return manage(res);
}

map map::order_lt(isl::dim type1, int pos1, isl::dim type2, int pos2) const
{
  auto res = isl_map_order_lt(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
  return manage(res);
}

set map::params() const
{
  auto res = isl_map_params(copy());
  return manage(res);
}

val map::plain_get_val_if_fixed(isl::dim type, unsigned int pos) const
{
  auto res = isl_map_plain_get_val_if_fixed(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean map::plain_is_empty() const
{
  auto res = isl_map_plain_is_empty(get());
  return manage(res);
}

boolean map::plain_is_equal(const map &map2) const
{
  auto res = isl_map_plain_is_equal(get(), map2.get());
  return manage(res);
}

boolean map::plain_is_injective() const
{
  auto res = isl_map_plain_is_injective(get());
  return manage(res);
}

boolean map::plain_is_single_valued() const
{
  auto res = isl_map_plain_is_single_valued(get());
  return manage(res);
}

boolean map::plain_is_universe() const
{
  auto res = isl_map_plain_is_universe(get());
  return manage(res);
}

basic_map map::plain_unshifted_simple_hull() const
{
  auto res = isl_map_plain_unshifted_simple_hull(copy());
  return manage(res);
}

basic_map map::polyhedral_hull() const
{
  auto res = isl_map_polyhedral_hull(copy());
  return manage(res);
}

map map::preimage_domain(multi_aff ma) const
{
  auto res = isl_map_preimage_domain_multi_aff(copy(), ma.release());
  return manage(res);
}

map map::preimage_domain(multi_pw_aff mpa) const
{
  auto res = isl_map_preimage_domain_multi_pw_aff(copy(), mpa.release());
  return manage(res);
}

map map::preimage_domain(pw_multi_aff pma) const
{
  auto res = isl_map_preimage_domain_pw_multi_aff(copy(), pma.release());
  return manage(res);
}

map map::preimage_range(multi_aff ma) const
{
  auto res = isl_map_preimage_range_multi_aff(copy(), ma.release());
  return manage(res);
}

map map::preimage_range(pw_multi_aff pma) const
{
  auto res = isl_map_preimage_range_pw_multi_aff(copy(), pma.release());
  return manage(res);
}

map map::product(map map2) const
{
  auto res = isl_map_product(copy(), map2.release());
  return manage(res);
}

map map::project_out(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_map_project_out(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

map map::project_out_all_params() const
{
  auto res = isl_map_project_out_all_params(copy());
  return manage(res);
}

set map::range() const
{
  auto res = isl_map_range(copy());
  return manage(res);
}

map map::range_curry() const
{
  auto res = isl_map_range_curry(copy());
  return manage(res);
}

map map::range_factor_domain() const
{
  auto res = isl_map_range_factor_domain(copy());
  return manage(res);
}

map map::range_factor_range() const
{
  auto res = isl_map_range_factor_range(copy());
  return manage(res);
}

boolean map::range_is_wrapping() const
{
  auto res = isl_map_range_is_wrapping(get());
  return manage(res);
}

map map::range_map() const
{
  auto res = isl_map_range_map(copy());
  return manage(res);
}

map map::range_product(map map2) const
{
  auto res = isl_map_range_product(copy(), map2.release());
  return manage(res);
}

map map::range_reverse() const
{
  auto res = isl_map_range_reverse(copy());
  return manage(res);
}

isl_size map::range_tuple_dim() const
{
  auto res = isl_map_range_tuple_dim(get());
  return res;
}

map map::remove_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_map_remove_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

map map::remove_divs() const
{
  auto res = isl_map_remove_divs(copy());
  return manage(res);
}

map map::remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_map_remove_divs_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

map map::remove_redundancies() const
{
  auto res = isl_map_remove_redundancies(copy());
  return manage(res);
}

map map::remove_unknown_divs() const
{
  auto res = isl_map_remove_unknown_divs(copy());
  return manage(res);
}

map map::reset_tuple_id(isl::dim type) const
{
  auto res = isl_map_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

map map::reset_user() const
{
  auto res = isl_map_reset_user(copy());
  return manage(res);
}

map map::reverse() const
{
  auto res = isl_map_reverse(copy());
  return manage(res);
}

basic_map map::sample() const
{
  auto res = isl_map_sample(copy());
  return manage(res);
}

map map::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_map_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

map map::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_map_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

map map::set_tuple_name(isl::dim type, const std::string &s) const
{
  auto res = isl_map_set_tuple_name(copy(), static_cast<enum isl_dim_type>(type), s.c_str());
  return manage(res);
}

basic_map map::simple_hull() const
{
  auto res = isl_map_simple_hull(copy());
  return manage(res);
}

map map::subtract(map map2) const
{
  auto res = isl_map_subtract(copy(), map2.release());
  return manage(res);
}

map map::subtract_domain(set dom) const
{
  auto res = isl_map_subtract_domain(copy(), dom.release());
  return manage(res);
}

map map::subtract_range(set dom) const
{
  auto res = isl_map_subtract_range(copy(), dom.release());
  return manage(res);
}

map map::sum(map map2) const
{
  auto res = isl_map_sum(copy(), map2.release());
  return manage(res);
}

map map::uncurry() const
{
  auto res = isl_map_uncurry(copy());
  return manage(res);
}

map map::unite(map map2) const
{
  auto res = isl_map_union(copy(), map2.release());
  return manage(res);
}

map map::universe(space space)
{
  auto res = isl_map_universe(space.release());
  return manage(res);
}

basic_map map::unshifted_simple_hull() const
{
  auto res = isl_map_unshifted_simple_hull(copy());
  return manage(res);
}

basic_map map::unshifted_simple_hull_from_map_list(map_list list) const
{
  auto res = isl_map_unshifted_simple_hull_from_map_list(copy(), list.release());
  return manage(res);
}

map map::upper_bound(multi_pw_aff upper) const
{
  auto res = isl_map_upper_bound_multi_pw_aff(copy(), upper.release());
  return manage(res);
}

map map::upper_bound_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_map_upper_bound_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

map map::upper_bound_val(isl::dim type, unsigned int pos, val value) const
{
  auto res = isl_map_upper_bound_val(copy(), static_cast<enum isl_dim_type>(type), pos, value.release());
  return manage(res);
}

set map::wrap() const
{
  auto res = isl_map_wrap(copy());
  return manage(res);
}

map map::zip() const
{
  auto res = isl_map_zip(copy());
  return manage(res);
}

// implementations for isl::map_list
map_list manage(__isl_take isl_map_list *ptr) {
  return map_list(ptr);
}
map_list manage_copy(__isl_keep isl_map_list *ptr) {
  ptr = isl_map_list_copy(ptr);
  return map_list(ptr);
}

map_list::map_list()
    : ptr(nullptr) {}

map_list::map_list(const map_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


map_list::map_list(__isl_take isl_map_list *ptr)
    : ptr(ptr) {}


map_list &map_list::operator=(map_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

map_list::~map_list() {
  if (ptr)
    isl_map_list_free(ptr);
}

__isl_give isl_map_list *map_list::copy() const & {
  return isl_map_list_copy(ptr);
}

__isl_keep isl_map_list *map_list::get() const {
  return ptr;
}

__isl_give isl_map_list *map_list::release() {
  isl_map_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool map_list::is_null() const {
  return ptr == nullptr;
}


ctx map_list::get_ctx() const {
  return ctx(isl_map_list_get_ctx(ptr));
}

void map_list::dump() const {
  isl_map_list_dump(get());
}


map_list map_list::add(map el) const
{
  auto res = isl_map_list_add(copy(), el.release());
  return manage(res);
}

map_list map_list::alloc(ctx ctx, int n)
{
  auto res = isl_map_list_alloc(ctx.release(), n);
  return manage(res);
}

map_list map_list::clear() const
{
  auto res = isl_map_list_clear(copy());
  return manage(res);
}

map_list map_list::concat(map_list list2) const
{
  auto res = isl_map_list_concat(copy(), list2.release());
  return manage(res);
}

map_list map_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_map_list_drop(copy(), first, n);
  return manage(res);
}

stat map_list::foreach(const std::function<stat(map)> &fn) const
{
  struct fn_data {
    const std::function<stat(map)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_map *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_map_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

map_list map_list::from_map(map el)
{
  auto res = isl_map_list_from_map(el.release());
  return manage(res);
}

map map_list::get_at(int index) const
{
  auto res = isl_map_list_get_at(get(), index);
  return manage(res);
}

map map_list::get_map(int index) const
{
  auto res = isl_map_list_get_map(get(), index);
  return manage(res);
}

map_list map_list::insert(unsigned int pos, map el) const
{
  auto res = isl_map_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size map_list::n_map() const
{
  auto res = isl_map_list_n_map(get());
  return res;
}

map_list map_list::reverse() const
{
  auto res = isl_map_list_reverse(copy());
  return manage(res);
}

map_list map_list::set_map(int index, map el) const
{
  auto res = isl_map_list_set_map(copy(), index, el.release());
  return manage(res);
}

isl_size map_list::size() const
{
  auto res = isl_map_list_size(get());
  return res;
}

map_list map_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_map_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::mat
mat manage(__isl_take isl_mat *ptr) {
  return mat(ptr);
}
mat manage_copy(__isl_keep isl_mat *ptr) {
  ptr = isl_mat_copy(ptr);
  return mat(ptr);
}

mat::mat()
    : ptr(nullptr) {}

mat::mat(const mat &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


mat::mat(__isl_take isl_mat *ptr)
    : ptr(ptr) {}


mat &mat::operator=(mat obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

mat::~mat() {
  if (ptr)
    isl_mat_free(ptr);
}

__isl_give isl_mat *mat::copy() const & {
  return isl_mat_copy(ptr);
}

__isl_keep isl_mat *mat::get() const {
  return ptr;
}

__isl_give isl_mat *mat::release() {
  isl_mat *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool mat::is_null() const {
  return ptr == nullptr;
}


ctx mat::get_ctx() const {
  return ctx(isl_mat_get_ctx(ptr));
}

void mat::dump() const {
  isl_mat_dump(get());
}


mat mat::add_rows(unsigned int n) const
{
  auto res = isl_mat_add_rows(copy(), n);
  return manage(res);
}

mat mat::add_zero_cols(unsigned int n) const
{
  auto res = isl_mat_add_zero_cols(copy(), n);
  return manage(res);
}

mat mat::add_zero_rows(unsigned int n) const
{
  auto res = isl_mat_add_zero_rows(copy(), n);
  return manage(res);
}

mat mat::aff_direct_sum(mat right) const
{
  auto res = isl_mat_aff_direct_sum(copy(), right.release());
  return manage(res);
}

mat mat::alloc(ctx ctx, unsigned int n_row, unsigned int n_col)
{
  auto res = isl_mat_alloc(ctx.release(), n_row, n_col);
  return manage(res);
}

isl_size mat::cols() const
{
  auto res = isl_mat_cols(get());
  return res;
}

mat mat::concat(mat bot) const
{
  auto res = isl_mat_concat(copy(), bot.release());
  return manage(res);
}

mat mat::diagonal(mat mat2) const
{
  auto res = isl_mat_diagonal(copy(), mat2.release());
  return manage(res);
}

mat mat::drop_cols(unsigned int col, unsigned int n) const
{
  auto res = isl_mat_drop_cols(copy(), col, n);
  return manage(res);
}

mat mat::drop_rows(unsigned int row, unsigned int n) const
{
  auto res = isl_mat_drop_rows(copy(), row, n);
  return manage(res);
}

mat mat::from_row_vec(vec vec)
{
  auto res = isl_mat_from_row_vec(vec.release());
  return manage(res);
}

val mat::get_element_val(int row, int col) const
{
  auto res = isl_mat_get_element_val(get(), row, col);
  return manage(res);
}

boolean mat::has_linearly_independent_rows(const mat &mat2) const
{
  auto res = isl_mat_has_linearly_independent_rows(get(), mat2.get());
  return manage(res);
}

int mat::initial_non_zero_cols() const
{
  auto res = isl_mat_initial_non_zero_cols(get());
  return res;
}

mat mat::insert_cols(unsigned int col, unsigned int n) const
{
  auto res = isl_mat_insert_cols(copy(), col, n);
  return manage(res);
}

mat mat::insert_rows(unsigned int row, unsigned int n) const
{
  auto res = isl_mat_insert_rows(copy(), row, n);
  return manage(res);
}

mat mat::insert_zero_cols(unsigned int first, unsigned int n) const
{
  auto res = isl_mat_insert_zero_cols(copy(), first, n);
  return manage(res);
}

mat mat::insert_zero_rows(unsigned int row, unsigned int n) const
{
  auto res = isl_mat_insert_zero_rows(copy(), row, n);
  return manage(res);
}

mat mat::inverse_product(mat right) const
{
  auto res = isl_mat_inverse_product(copy(), right.release());
  return manage(res);
}

boolean mat::is_equal(const mat &mat2) const
{
  auto res = isl_mat_is_equal(get(), mat2.get());
  return manage(res);
}

mat mat::lin_to_aff() const
{
  auto res = isl_mat_lin_to_aff(copy());
  return manage(res);
}

mat mat::move_cols(unsigned int dst_col, unsigned int src_col, unsigned int n) const
{
  auto res = isl_mat_move_cols(copy(), dst_col, src_col, n);
  return manage(res);
}

mat mat::normalize() const
{
  auto res = isl_mat_normalize(copy());
  return manage(res);
}

mat mat::normalize_row(int row) const
{
  auto res = isl_mat_normalize_row(copy(), row);
  return manage(res);
}

mat mat::product(mat right) const
{
  auto res = isl_mat_product(copy(), right.release());
  return manage(res);
}

isl_size mat::rank() const
{
  auto res = isl_mat_rank(get());
  return res;
}

mat mat::right_inverse() const
{
  auto res = isl_mat_right_inverse(copy());
  return manage(res);
}

mat mat::right_kernel() const
{
  auto res = isl_mat_right_kernel(copy());
  return manage(res);
}

mat mat::row_basis() const
{
  auto res = isl_mat_row_basis(copy());
  return manage(res);
}

mat mat::row_basis_extension(mat mat2) const
{
  auto res = isl_mat_row_basis_extension(copy(), mat2.release());
  return manage(res);
}

isl_size mat::rows() const
{
  auto res = isl_mat_rows(get());
  return res;
}

mat mat::set_element_si(int row, int col, int v) const
{
  auto res = isl_mat_set_element_si(copy(), row, col, v);
  return manage(res);
}

mat mat::set_element_val(int row, int col, val v) const
{
  auto res = isl_mat_set_element_val(copy(), row, col, v.release());
  return manage(res);
}

mat mat::swap_cols(unsigned int i, unsigned int j) const
{
  auto res = isl_mat_swap_cols(copy(), i, j);
  return manage(res);
}

mat mat::swap_rows(unsigned int i, unsigned int j) const
{
  auto res = isl_mat_swap_rows(copy(), i, j);
  return manage(res);
}

mat mat::transpose() const
{
  auto res = isl_mat_transpose(copy());
  return manage(res);
}

mat mat::unimodular_complete(int row) const
{
  auto res = isl_mat_unimodular_complete(copy(), row);
  return manage(res);
}

mat mat::vec_concat(vec bot) const
{
  auto res = isl_mat_vec_concat(copy(), bot.release());
  return manage(res);
}

vec mat::vec_inverse_product(vec vec) const
{
  auto res = isl_mat_vec_inverse_product(copy(), vec.release());
  return manage(res);
}

vec mat::vec_product(vec vec) const
{
  auto res = isl_mat_vec_product(copy(), vec.release());
  return manage(res);
}

// implementations for isl::multi_aff
multi_aff manage(__isl_take isl_multi_aff *ptr) {
  return multi_aff(ptr);
}
multi_aff manage_copy(__isl_keep isl_multi_aff *ptr) {
  ptr = isl_multi_aff_copy(ptr);
  return multi_aff(ptr);
}

multi_aff::multi_aff()
    : ptr(nullptr) {}

multi_aff::multi_aff(const multi_aff &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


multi_aff::multi_aff(__isl_take isl_multi_aff *ptr)
    : ptr(ptr) {}

multi_aff::multi_aff(aff aff)
{
  auto res = isl_multi_aff_from_aff(aff.release());
  ptr = res;
}
multi_aff::multi_aff(space space, aff_list list)
{
  auto res = isl_multi_aff_from_aff_list(space.release(), list.release());
  ptr = res;
}
multi_aff::multi_aff(ctx ctx, const std::string &str)
{
  auto res = isl_multi_aff_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

multi_aff &multi_aff::operator=(multi_aff obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

multi_aff::~multi_aff() {
  if (ptr)
    isl_multi_aff_free(ptr);
}

__isl_give isl_multi_aff *multi_aff::copy() const & {
  return isl_multi_aff_copy(ptr);
}

__isl_keep isl_multi_aff *multi_aff::get() const {
  return ptr;
}

__isl_give isl_multi_aff *multi_aff::release() {
  isl_multi_aff *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool multi_aff::is_null() const {
  return ptr == nullptr;
}


ctx multi_aff::get_ctx() const {
  return ctx(isl_multi_aff_get_ctx(ptr));
}

void multi_aff::dump() const {
  isl_multi_aff_dump(get());
}


multi_aff multi_aff::add(multi_aff multi2) const
{
  auto res = isl_multi_aff_add(copy(), multi2.release());
  return manage(res);
}

multi_aff multi_aff::add_constant(multi_val mv) const
{
  auto res = isl_multi_aff_add_constant_multi_val(copy(), mv.release());
  return manage(res);
}

multi_aff multi_aff::add_constant(val v) const
{
  auto res = isl_multi_aff_add_constant_val(copy(), v.release());
  return manage(res);
}

multi_aff multi_aff::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_multi_aff_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

multi_aff multi_aff::align_params(space model) const
{
  auto res = isl_multi_aff_align_params(copy(), model.release());
  return manage(res);
}

basic_set multi_aff::bind(multi_id tuple) const
{
  auto res = isl_multi_aff_bind(copy(), tuple.release());
  return manage(res);
}

multi_aff multi_aff::bind_domain(multi_id tuple) const
{
  auto res = isl_multi_aff_bind_domain(copy(), tuple.release());
  return manage(res);
}

multi_aff multi_aff::bind_domain_wrapped_domain(multi_id tuple) const
{
  auto res = isl_multi_aff_bind_domain_wrapped_domain(copy(), tuple.release());
  return manage(res);
}

isl_size multi_aff::dim(isl::dim type) const
{
  auto res = isl_multi_aff_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

multi_aff multi_aff::domain_map(space space)
{
  auto res = isl_multi_aff_domain_map(space.release());
  return manage(res);
}

multi_aff multi_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_multi_aff_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

multi_aff multi_aff::factor_range() const
{
  auto res = isl_multi_aff_factor_range(copy());
  return manage(res);
}

int multi_aff::find_dim_by_id(isl::dim type, const id &id) const
{
  auto res = isl_multi_aff_find_dim_by_id(get(), static_cast<enum isl_dim_type>(type), id.get());
  return res;
}

int multi_aff::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_multi_aff_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

multi_aff multi_aff::flat_range_product(multi_aff multi2) const
{
  auto res = isl_multi_aff_flat_range_product(copy(), multi2.release());
  return manage(res);
}

multi_aff multi_aff::flatten_domain() const
{
  auto res = isl_multi_aff_flatten_domain(copy());
  return manage(res);
}

multi_aff multi_aff::flatten_range() const
{
  auto res = isl_multi_aff_flatten_range(copy());
  return manage(res);
}

multi_aff multi_aff::floor() const
{
  auto res = isl_multi_aff_floor(copy());
  return manage(res);
}

multi_aff multi_aff::from_range() const
{
  auto res = isl_multi_aff_from_range(copy());
  return manage(res);
}

aff multi_aff::get_aff(int pos) const
{
  auto res = isl_multi_aff_get_aff(get(), pos);
  return manage(res);
}

aff multi_aff::get_at(int pos) const
{
  auto res = isl_multi_aff_get_at(get(), pos);
  return manage(res);
}

multi_val multi_aff::get_constant_multi_val() const
{
  auto res = isl_multi_aff_get_constant_multi_val(get());
  return manage(res);
}

id multi_aff::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_multi_aff_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

space multi_aff::get_domain_space() const
{
  auto res = isl_multi_aff_get_domain_space(get());
  return manage(res);
}

aff_list multi_aff::get_list() const
{
  auto res = isl_multi_aff_get_list(get());
  return manage(res);
}

space multi_aff::get_space() const
{
  auto res = isl_multi_aff_get_space(get());
  return manage(res);
}

id multi_aff::get_tuple_id(isl::dim type) const
{
  auto res = isl_multi_aff_get_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

std::string multi_aff::get_tuple_name(isl::dim type) const
{
  auto res = isl_multi_aff_get_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  std::string tmp(res);
  return tmp;
}

multi_aff multi_aff::gist(set context) const
{
  auto res = isl_multi_aff_gist(copy(), context.release());
  return manage(res);
}

multi_aff multi_aff::gist_params(set context) const
{
  auto res = isl_multi_aff_gist_params(copy(), context.release());
  return manage(res);
}

boolean multi_aff::has_tuple_id(isl::dim type) const
{
  auto res = isl_multi_aff_has_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

multi_aff multi_aff::identity(space space)
{
  auto res = isl_multi_aff_identity(space.release());
  return manage(res);
}

multi_aff multi_aff::identity() const
{
  auto res = isl_multi_aff_identity_multi_aff(copy());
  return manage(res);
}

multi_aff multi_aff::identity_on_domain(space space)
{
  auto res = isl_multi_aff_identity_on_domain_space(space.release());
  return manage(res);
}

multi_aff multi_aff::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_multi_aff_insert_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

multi_aff multi_aff::insert_domain(space domain) const
{
  auto res = isl_multi_aff_insert_domain(copy(), domain.release());
  return manage(res);
}

boolean multi_aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_multi_aff_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean multi_aff::involves_locals() const
{
  auto res = isl_multi_aff_involves_locals(get());
  return manage(res);
}

boolean multi_aff::involves_nan() const
{
  auto res = isl_multi_aff_involves_nan(get());
  return manage(res);
}

set multi_aff::lex_ge_set(multi_aff ma2) const
{
  auto res = isl_multi_aff_lex_ge_set(copy(), ma2.release());
  return manage(res);
}

set multi_aff::lex_gt_set(multi_aff ma2) const
{
  auto res = isl_multi_aff_lex_gt_set(copy(), ma2.release());
  return manage(res);
}

set multi_aff::lex_le_set(multi_aff ma2) const
{
  auto res = isl_multi_aff_lex_le_set(copy(), ma2.release());
  return manage(res);
}

set multi_aff::lex_lt_set(multi_aff ma2) const
{
  auto res = isl_multi_aff_lex_lt_set(copy(), ma2.release());
  return manage(res);
}

multi_aff multi_aff::mod_multi_val(multi_val mv) const
{
  auto res = isl_multi_aff_mod_multi_val(copy(), mv.release());
  return manage(res);
}

multi_aff multi_aff::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_multi_aff_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

multi_aff multi_aff::multi_val_on_space(space space, multi_val mv)
{
  auto res = isl_multi_aff_multi_val_on_space(space.release(), mv.release());
  return manage(res);
}

multi_aff multi_aff::neg() const
{
  auto res = isl_multi_aff_neg(copy());
  return manage(res);
}

int multi_aff::plain_cmp(const multi_aff &multi2) const
{
  auto res = isl_multi_aff_plain_cmp(get(), multi2.get());
  return res;
}

boolean multi_aff::plain_is_equal(const multi_aff &multi2) const
{
  auto res = isl_multi_aff_plain_is_equal(get(), multi2.get());
  return manage(res);
}

multi_aff multi_aff::product(multi_aff multi2) const
{
  auto res = isl_multi_aff_product(copy(), multi2.release());
  return manage(res);
}

multi_aff multi_aff::project_domain_on_params() const
{
  auto res = isl_multi_aff_project_domain_on_params(copy());
  return manage(res);
}

multi_aff multi_aff::project_out_map(space space, isl::dim type, unsigned int first, unsigned int n)
{
  auto res = isl_multi_aff_project_out_map(space.release(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

multi_aff multi_aff::pullback(multi_aff ma2) const
{
  auto res = isl_multi_aff_pullback_multi_aff(copy(), ma2.release());
  return manage(res);
}

multi_aff multi_aff::range_factor_domain() const
{
  auto res = isl_multi_aff_range_factor_domain(copy());
  return manage(res);
}

multi_aff multi_aff::range_factor_range() const
{
  auto res = isl_multi_aff_range_factor_range(copy());
  return manage(res);
}

boolean multi_aff::range_is_wrapping() const
{
  auto res = isl_multi_aff_range_is_wrapping(get());
  return manage(res);
}

multi_aff multi_aff::range_map(space space)
{
  auto res = isl_multi_aff_range_map(space.release());
  return manage(res);
}

multi_aff multi_aff::range_product(multi_aff multi2) const
{
  auto res = isl_multi_aff_range_product(copy(), multi2.release());
  return manage(res);
}

multi_aff multi_aff::range_splice(unsigned int pos, multi_aff multi2) const
{
  auto res = isl_multi_aff_range_splice(copy(), pos, multi2.release());
  return manage(res);
}

multi_aff multi_aff::reset_tuple_id(isl::dim type) const
{
  auto res = isl_multi_aff_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

multi_aff multi_aff::reset_user() const
{
  auto res = isl_multi_aff_reset_user(copy());
  return manage(res);
}

multi_aff multi_aff::scale(multi_val mv) const
{
  auto res = isl_multi_aff_scale_multi_val(copy(), mv.release());
  return manage(res);
}

multi_aff multi_aff::scale(val v) const
{
  auto res = isl_multi_aff_scale_val(copy(), v.release());
  return manage(res);
}

multi_aff multi_aff::scale_down(multi_val mv) const
{
  auto res = isl_multi_aff_scale_down_multi_val(copy(), mv.release());
  return manage(res);
}

multi_aff multi_aff::scale_down(val v) const
{
  auto res = isl_multi_aff_scale_down_val(copy(), v.release());
  return manage(res);
}

multi_aff multi_aff::set_aff(int pos, aff el) const
{
  auto res = isl_multi_aff_set_aff(copy(), pos, el.release());
  return manage(res);
}

multi_aff multi_aff::set_at(int pos, aff el) const
{
  auto res = isl_multi_aff_set_at(copy(), pos, el.release());
  return manage(res);
}

multi_aff multi_aff::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_multi_aff_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

multi_aff multi_aff::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_multi_aff_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

multi_aff multi_aff::set_tuple_name(isl::dim type, const std::string &s) const
{
  auto res = isl_multi_aff_set_tuple_name(copy(), static_cast<enum isl_dim_type>(type), s.c_str());
  return manage(res);
}

isl_size multi_aff::size() const
{
  auto res = isl_multi_aff_size(get());
  return res;
}

multi_aff multi_aff::splice(unsigned int in_pos, unsigned int out_pos, multi_aff multi2) const
{
  auto res = isl_multi_aff_splice(copy(), in_pos, out_pos, multi2.release());
  return manage(res);
}

multi_aff multi_aff::sub(multi_aff multi2) const
{
  auto res = isl_multi_aff_sub(copy(), multi2.release());
  return manage(res);
}

multi_aff multi_aff::unbind_params_insert_domain(multi_id domain) const
{
  auto res = isl_multi_aff_unbind_params_insert_domain(copy(), domain.release());
  return manage(res);
}

multi_aff multi_aff::zero(space space)
{
  auto res = isl_multi_aff_zero(space.release());
  return manage(res);
}

// implementations for isl::multi_id
multi_id manage(__isl_take isl_multi_id *ptr) {
  return multi_id(ptr);
}
multi_id manage_copy(__isl_keep isl_multi_id *ptr) {
  ptr = isl_multi_id_copy(ptr);
  return multi_id(ptr);
}

multi_id::multi_id()
    : ptr(nullptr) {}

multi_id::multi_id(const multi_id &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


multi_id::multi_id(__isl_take isl_multi_id *ptr)
    : ptr(ptr) {}

multi_id::multi_id(space space, id_list list)
{
  auto res = isl_multi_id_from_id_list(space.release(), list.release());
  ptr = res;
}
multi_id::multi_id(ctx ctx, const std::string &str)
{
  auto res = isl_multi_id_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

multi_id &multi_id::operator=(multi_id obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

multi_id::~multi_id() {
  if (ptr)
    isl_multi_id_free(ptr);
}

__isl_give isl_multi_id *multi_id::copy() const & {
  return isl_multi_id_copy(ptr);
}

__isl_keep isl_multi_id *multi_id::get() const {
  return ptr;
}

__isl_give isl_multi_id *multi_id::release() {
  isl_multi_id *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool multi_id::is_null() const {
  return ptr == nullptr;
}


ctx multi_id::get_ctx() const {
  return ctx(isl_multi_id_get_ctx(ptr));
}

void multi_id::dump() const {
  isl_multi_id_dump(get());
}


multi_id multi_id::align_params(space model) const
{
  auto res = isl_multi_id_align_params(copy(), model.release());
  return manage(res);
}

multi_id multi_id::factor_range() const
{
  auto res = isl_multi_id_factor_range(copy());
  return manage(res);
}

multi_id multi_id::flat_range_product(multi_id multi2) const
{
  auto res = isl_multi_id_flat_range_product(copy(), multi2.release());
  return manage(res);
}

multi_id multi_id::flatten_range() const
{
  auto res = isl_multi_id_flatten_range(copy());
  return manage(res);
}

multi_id multi_id::from_range() const
{
  auto res = isl_multi_id_from_range(copy());
  return manage(res);
}

id multi_id::get_at(int pos) const
{
  auto res = isl_multi_id_get_at(get(), pos);
  return manage(res);
}

space multi_id::get_domain_space() const
{
  auto res = isl_multi_id_get_domain_space(get());
  return manage(res);
}

id multi_id::get_id(int pos) const
{
  auto res = isl_multi_id_get_id(get(), pos);
  return manage(res);
}

id_list multi_id::get_list() const
{
  auto res = isl_multi_id_get_list(get());
  return manage(res);
}

space multi_id::get_space() const
{
  auto res = isl_multi_id_get_space(get());
  return manage(res);
}

boolean multi_id::plain_is_equal(const multi_id &multi2) const
{
  auto res = isl_multi_id_plain_is_equal(get(), multi2.get());
  return manage(res);
}

multi_id multi_id::range_factor_domain() const
{
  auto res = isl_multi_id_range_factor_domain(copy());
  return manage(res);
}

multi_id multi_id::range_factor_range() const
{
  auto res = isl_multi_id_range_factor_range(copy());
  return manage(res);
}

boolean multi_id::range_is_wrapping() const
{
  auto res = isl_multi_id_range_is_wrapping(get());
  return manage(res);
}

multi_id multi_id::range_product(multi_id multi2) const
{
  auto res = isl_multi_id_range_product(copy(), multi2.release());
  return manage(res);
}

multi_id multi_id::range_splice(unsigned int pos, multi_id multi2) const
{
  auto res = isl_multi_id_range_splice(copy(), pos, multi2.release());
  return manage(res);
}

multi_id multi_id::reset_user() const
{
  auto res = isl_multi_id_reset_user(copy());
  return manage(res);
}

multi_id multi_id::set_at(int pos, id el) const
{
  auto res = isl_multi_id_set_at(copy(), pos, el.release());
  return manage(res);
}

multi_id multi_id::set_id(int pos, id el) const
{
  auto res = isl_multi_id_set_id(copy(), pos, el.release());
  return manage(res);
}

isl_size multi_id::size() const
{
  auto res = isl_multi_id_size(get());
  return res;
}

// implementations for isl::multi_pw_aff
multi_pw_aff manage(__isl_take isl_multi_pw_aff *ptr) {
  return multi_pw_aff(ptr);
}
multi_pw_aff manage_copy(__isl_keep isl_multi_pw_aff *ptr) {
  ptr = isl_multi_pw_aff_copy(ptr);
  return multi_pw_aff(ptr);
}

multi_pw_aff::multi_pw_aff()
    : ptr(nullptr) {}

multi_pw_aff::multi_pw_aff(const multi_pw_aff &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


multi_pw_aff::multi_pw_aff(__isl_take isl_multi_pw_aff *ptr)
    : ptr(ptr) {}

multi_pw_aff::multi_pw_aff(aff aff)
{
  auto res = isl_multi_pw_aff_from_aff(aff.release());
  ptr = res;
}
multi_pw_aff::multi_pw_aff(multi_aff ma)
{
  auto res = isl_multi_pw_aff_from_multi_aff(ma.release());
  ptr = res;
}
multi_pw_aff::multi_pw_aff(pw_aff pa)
{
  auto res = isl_multi_pw_aff_from_pw_aff(pa.release());
  ptr = res;
}
multi_pw_aff::multi_pw_aff(space space, pw_aff_list list)
{
  auto res = isl_multi_pw_aff_from_pw_aff_list(space.release(), list.release());
  ptr = res;
}
multi_pw_aff::multi_pw_aff(pw_multi_aff pma)
{
  auto res = isl_multi_pw_aff_from_pw_multi_aff(pma.release());
  ptr = res;
}
multi_pw_aff::multi_pw_aff(ctx ctx, const std::string &str)
{
  auto res = isl_multi_pw_aff_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

multi_pw_aff &multi_pw_aff::operator=(multi_pw_aff obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

multi_pw_aff::~multi_pw_aff() {
  if (ptr)
    isl_multi_pw_aff_free(ptr);
}

__isl_give isl_multi_pw_aff *multi_pw_aff::copy() const & {
  return isl_multi_pw_aff_copy(ptr);
}

__isl_keep isl_multi_pw_aff *multi_pw_aff::get() const {
  return ptr;
}

__isl_give isl_multi_pw_aff *multi_pw_aff::release() {
  isl_multi_pw_aff *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool multi_pw_aff::is_null() const {
  return ptr == nullptr;
}


ctx multi_pw_aff::get_ctx() const {
  return ctx(isl_multi_pw_aff_get_ctx(ptr));
}

void multi_pw_aff::dump() const {
  isl_multi_pw_aff_dump(get());
}


multi_pw_aff multi_pw_aff::add(multi_pw_aff multi2) const
{
  auto res = isl_multi_pw_aff_add(copy(), multi2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::add_constant(multi_val mv) const
{
  auto res = isl_multi_pw_aff_add_constant_multi_val(copy(), mv.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::add_constant(val v) const
{
  auto res = isl_multi_pw_aff_add_constant_val(copy(), v.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_multi_pw_aff_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

multi_pw_aff multi_pw_aff::align_params(space model) const
{
  auto res = isl_multi_pw_aff_align_params(copy(), model.release());
  return manage(res);
}

set multi_pw_aff::bind(multi_id tuple) const
{
  auto res = isl_multi_pw_aff_bind(copy(), tuple.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::bind_domain(multi_id tuple) const
{
  auto res = isl_multi_pw_aff_bind_domain(copy(), tuple.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::bind_domain_wrapped_domain(multi_id tuple) const
{
  auto res = isl_multi_pw_aff_bind_domain_wrapped_domain(copy(), tuple.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::coalesce() const
{
  auto res = isl_multi_pw_aff_coalesce(copy());
  return manage(res);
}

isl_size multi_pw_aff::dim(isl::dim type) const
{
  auto res = isl_multi_pw_aff_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

set multi_pw_aff::domain() const
{
  auto res = isl_multi_pw_aff_domain(copy());
  return manage(res);
}

multi_pw_aff multi_pw_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_multi_pw_aff_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

map multi_pw_aff::eq_map(multi_pw_aff mpa2) const
{
  auto res = isl_multi_pw_aff_eq_map(copy(), mpa2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::factor_range() const
{
  auto res = isl_multi_pw_aff_factor_range(copy());
  return manage(res);
}

int multi_pw_aff::find_dim_by_id(isl::dim type, const id &id) const
{
  auto res = isl_multi_pw_aff_find_dim_by_id(get(), static_cast<enum isl_dim_type>(type), id.get());
  return res;
}

int multi_pw_aff::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_multi_pw_aff_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

multi_pw_aff multi_pw_aff::flat_range_product(multi_pw_aff multi2) const
{
  auto res = isl_multi_pw_aff_flat_range_product(copy(), multi2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::flatten_range() const
{
  auto res = isl_multi_pw_aff_flatten_range(copy());
  return manage(res);
}

multi_pw_aff multi_pw_aff::from_range() const
{
  auto res = isl_multi_pw_aff_from_range(copy());
  return manage(res);
}

pw_aff multi_pw_aff::get_at(int pos) const
{
  auto res = isl_multi_pw_aff_get_at(get(), pos);
  return manage(res);
}

id multi_pw_aff::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_multi_pw_aff_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

space multi_pw_aff::get_domain_space() const
{
  auto res = isl_multi_pw_aff_get_domain_space(get());
  return manage(res);
}

uint32_t multi_pw_aff::get_hash() const
{
  auto res = isl_multi_pw_aff_get_hash(get());
  return res;
}

pw_aff_list multi_pw_aff::get_list() const
{
  auto res = isl_multi_pw_aff_get_list(get());
  return manage(res);
}

pw_aff multi_pw_aff::get_pw_aff(int pos) const
{
  auto res = isl_multi_pw_aff_get_pw_aff(get(), pos);
  return manage(res);
}

space multi_pw_aff::get_space() const
{
  auto res = isl_multi_pw_aff_get_space(get());
  return manage(res);
}

id multi_pw_aff::get_tuple_id(isl::dim type) const
{
  auto res = isl_multi_pw_aff_get_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

std::string multi_pw_aff::get_tuple_name(isl::dim type) const
{
  auto res = isl_multi_pw_aff_get_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  std::string tmp(res);
  return tmp;
}

multi_pw_aff multi_pw_aff::gist(set set) const
{
  auto res = isl_multi_pw_aff_gist(copy(), set.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::gist_params(set set) const
{
  auto res = isl_multi_pw_aff_gist_params(copy(), set.release());
  return manage(res);
}

boolean multi_pw_aff::has_tuple_id(isl::dim type) const
{
  auto res = isl_multi_pw_aff_has_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

multi_pw_aff multi_pw_aff::identity(space space)
{
  auto res = isl_multi_pw_aff_identity(space.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::identity() const
{
  auto res = isl_multi_pw_aff_identity_multi_pw_aff(copy());
  return manage(res);
}

multi_pw_aff multi_pw_aff::identity_on_domain(space space)
{
  auto res = isl_multi_pw_aff_identity_on_domain_space(space.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_multi_pw_aff_insert_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

multi_pw_aff multi_pw_aff::insert_domain(space domain) const
{
  auto res = isl_multi_pw_aff_insert_domain(copy(), domain.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::intersect_domain(set domain) const
{
  auto res = isl_multi_pw_aff_intersect_domain(copy(), domain.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::intersect_params(set set) const
{
  auto res = isl_multi_pw_aff_intersect_params(copy(), set.release());
  return manage(res);
}

boolean multi_pw_aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_multi_pw_aff_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean multi_pw_aff::involves_nan() const
{
  auto res = isl_multi_pw_aff_involves_nan(get());
  return manage(res);
}

boolean multi_pw_aff::involves_param(const id &id) const
{
  auto res = isl_multi_pw_aff_involves_param_id(get(), id.get());
  return manage(res);
}

boolean multi_pw_aff::involves_param(const id_list &list) const
{
  auto res = isl_multi_pw_aff_involves_param_id_list(get(), list.get());
  return manage(res);
}

boolean multi_pw_aff::is_cst() const
{
  auto res = isl_multi_pw_aff_is_cst(get());
  return manage(res);
}

boolean multi_pw_aff::is_equal(const multi_pw_aff &mpa2) const
{
  auto res = isl_multi_pw_aff_is_equal(get(), mpa2.get());
  return manage(res);
}

map multi_pw_aff::lex_ge_map(multi_pw_aff mpa2) const
{
  auto res = isl_multi_pw_aff_lex_ge_map(copy(), mpa2.release());
  return manage(res);
}

map multi_pw_aff::lex_gt_map(multi_pw_aff mpa2) const
{
  auto res = isl_multi_pw_aff_lex_gt_map(copy(), mpa2.release());
  return manage(res);
}

map multi_pw_aff::lex_le_map(multi_pw_aff mpa2) const
{
  auto res = isl_multi_pw_aff_lex_le_map(copy(), mpa2.release());
  return manage(res);
}

map multi_pw_aff::lex_lt_map(multi_pw_aff mpa2) const
{
  auto res = isl_multi_pw_aff_lex_lt_map(copy(), mpa2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::max(multi_pw_aff multi2) const
{
  auto res = isl_multi_pw_aff_max(copy(), multi2.release());
  return manage(res);
}

multi_val multi_pw_aff::max_multi_val() const
{
  auto res = isl_multi_pw_aff_max_multi_val(copy());
  return manage(res);
}

multi_pw_aff multi_pw_aff::min(multi_pw_aff multi2) const
{
  auto res = isl_multi_pw_aff_min(copy(), multi2.release());
  return manage(res);
}

multi_val multi_pw_aff::min_multi_val() const
{
  auto res = isl_multi_pw_aff_min_multi_val(copy());
  return manage(res);
}

multi_pw_aff multi_pw_aff::mod_multi_val(multi_val mv) const
{
  auto res = isl_multi_pw_aff_mod_multi_val(copy(), mv.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_multi_pw_aff_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

multi_pw_aff multi_pw_aff::neg() const
{
  auto res = isl_multi_pw_aff_neg(copy());
  return manage(res);
}

boolean multi_pw_aff::plain_is_equal(const multi_pw_aff &multi2) const
{
  auto res = isl_multi_pw_aff_plain_is_equal(get(), multi2.get());
  return manage(res);
}

multi_pw_aff multi_pw_aff::product(multi_pw_aff multi2) const
{
  auto res = isl_multi_pw_aff_product(copy(), multi2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::project_domain_on_params() const
{
  auto res = isl_multi_pw_aff_project_domain_on_params(copy());
  return manage(res);
}

multi_pw_aff multi_pw_aff::pullback(multi_aff ma) const
{
  auto res = isl_multi_pw_aff_pullback_multi_aff(copy(), ma.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::pullback(multi_pw_aff mpa2) const
{
  auto res = isl_multi_pw_aff_pullback_multi_pw_aff(copy(), mpa2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::pullback(pw_multi_aff pma) const
{
  auto res = isl_multi_pw_aff_pullback_pw_multi_aff(copy(), pma.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::range_factor_domain() const
{
  auto res = isl_multi_pw_aff_range_factor_domain(copy());
  return manage(res);
}

multi_pw_aff multi_pw_aff::range_factor_range() const
{
  auto res = isl_multi_pw_aff_range_factor_range(copy());
  return manage(res);
}

boolean multi_pw_aff::range_is_wrapping() const
{
  auto res = isl_multi_pw_aff_range_is_wrapping(get());
  return manage(res);
}

multi_pw_aff multi_pw_aff::range_product(multi_pw_aff multi2) const
{
  auto res = isl_multi_pw_aff_range_product(copy(), multi2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::range_splice(unsigned int pos, multi_pw_aff multi2) const
{
  auto res = isl_multi_pw_aff_range_splice(copy(), pos, multi2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::reset_tuple_id(isl::dim type) const
{
  auto res = isl_multi_pw_aff_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

multi_pw_aff multi_pw_aff::reset_user() const
{
  auto res = isl_multi_pw_aff_reset_user(copy());
  return manage(res);
}

multi_pw_aff multi_pw_aff::scale(multi_val mv) const
{
  auto res = isl_multi_pw_aff_scale_multi_val(copy(), mv.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::scale(val v) const
{
  auto res = isl_multi_pw_aff_scale_val(copy(), v.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::scale_down(multi_val mv) const
{
  auto res = isl_multi_pw_aff_scale_down_multi_val(copy(), mv.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::scale_down(val v) const
{
  auto res = isl_multi_pw_aff_scale_down_val(copy(), v.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::set_at(int pos, pw_aff el) const
{
  auto res = isl_multi_pw_aff_set_at(copy(), pos, el.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_multi_pw_aff_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::set_pw_aff(int pos, pw_aff el) const
{
  auto res = isl_multi_pw_aff_set_pw_aff(copy(), pos, el.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_multi_pw_aff_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::set_tuple_name(isl::dim type, const std::string &s) const
{
  auto res = isl_multi_pw_aff_set_tuple_name(copy(), static_cast<enum isl_dim_type>(type), s.c_str());
  return manage(res);
}

isl_size multi_pw_aff::size() const
{
  auto res = isl_multi_pw_aff_size(get());
  return res;
}

multi_pw_aff multi_pw_aff::splice(unsigned int in_pos, unsigned int out_pos, multi_pw_aff multi2) const
{
  auto res = isl_multi_pw_aff_splice(copy(), in_pos, out_pos, multi2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::sub(multi_pw_aff multi2) const
{
  auto res = isl_multi_pw_aff_sub(copy(), multi2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::unbind_params_insert_domain(multi_id domain) const
{
  auto res = isl_multi_pw_aff_unbind_params_insert_domain(copy(), domain.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::union_add(multi_pw_aff mpa2) const
{
  auto res = isl_multi_pw_aff_union_add(copy(), mpa2.release());
  return manage(res);
}

multi_pw_aff multi_pw_aff::zero(space space)
{
  auto res = isl_multi_pw_aff_zero(space.release());
  return manage(res);
}

// implementations for isl::multi_union_pw_aff
multi_union_pw_aff manage(__isl_take isl_multi_union_pw_aff *ptr) {
  return multi_union_pw_aff(ptr);
}
multi_union_pw_aff manage_copy(__isl_keep isl_multi_union_pw_aff *ptr) {
  ptr = isl_multi_union_pw_aff_copy(ptr);
  return multi_union_pw_aff(ptr);
}

multi_union_pw_aff::multi_union_pw_aff()
    : ptr(nullptr) {}

multi_union_pw_aff::multi_union_pw_aff(const multi_union_pw_aff &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


multi_union_pw_aff::multi_union_pw_aff(__isl_take isl_multi_union_pw_aff *ptr)
    : ptr(ptr) {}

multi_union_pw_aff::multi_union_pw_aff(multi_pw_aff mpa)
{
  auto res = isl_multi_union_pw_aff_from_multi_pw_aff(mpa.release());
  ptr = res;
}
multi_union_pw_aff::multi_union_pw_aff(union_pw_aff upa)
{
  auto res = isl_multi_union_pw_aff_from_union_pw_aff(upa.release());
  ptr = res;
}
multi_union_pw_aff::multi_union_pw_aff(space space, union_pw_aff_list list)
{
  auto res = isl_multi_union_pw_aff_from_union_pw_aff_list(space.release(), list.release());
  ptr = res;
}
multi_union_pw_aff::multi_union_pw_aff(union_pw_multi_aff upma)
{
  auto res = isl_multi_union_pw_aff_from_union_pw_multi_aff(upma.release());
  ptr = res;
}
multi_union_pw_aff::multi_union_pw_aff(ctx ctx, const std::string &str)
{
  auto res = isl_multi_union_pw_aff_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

multi_union_pw_aff &multi_union_pw_aff::operator=(multi_union_pw_aff obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

multi_union_pw_aff::~multi_union_pw_aff() {
  if (ptr)
    isl_multi_union_pw_aff_free(ptr);
}

__isl_give isl_multi_union_pw_aff *multi_union_pw_aff::copy() const & {
  return isl_multi_union_pw_aff_copy(ptr);
}

__isl_keep isl_multi_union_pw_aff *multi_union_pw_aff::get() const {
  return ptr;
}

__isl_give isl_multi_union_pw_aff *multi_union_pw_aff::release() {
  isl_multi_union_pw_aff *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool multi_union_pw_aff::is_null() const {
  return ptr == nullptr;
}


ctx multi_union_pw_aff::get_ctx() const {
  return ctx(isl_multi_union_pw_aff_get_ctx(ptr));
}

void multi_union_pw_aff::dump() const {
  isl_multi_union_pw_aff_dump(get());
}


multi_union_pw_aff multi_union_pw_aff::add(multi_union_pw_aff multi2) const
{
  auto res = isl_multi_union_pw_aff_add(copy(), multi2.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::align_params(space model) const
{
  auto res = isl_multi_union_pw_aff_align_params(copy(), model.release());
  return manage(res);
}

union_pw_aff multi_union_pw_aff::apply_aff(aff aff) const
{
  auto res = isl_multi_union_pw_aff_apply_aff(copy(), aff.release());
  return manage(res);
}

union_pw_aff multi_union_pw_aff::apply_pw_aff(pw_aff pa) const
{
  auto res = isl_multi_union_pw_aff_apply_pw_aff(copy(), pa.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::apply_pw_multi_aff(pw_multi_aff pma) const
{
  auto res = isl_multi_union_pw_aff_apply_pw_multi_aff(copy(), pma.release());
  return manage(res);
}

union_set multi_union_pw_aff::bind(multi_id tuple) const
{
  auto res = isl_multi_union_pw_aff_bind(copy(), tuple.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::coalesce() const
{
  auto res = isl_multi_union_pw_aff_coalesce(copy());
  return manage(res);
}

isl_size multi_union_pw_aff::dim(isl::dim type) const
{
  auto res = isl_multi_union_pw_aff_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

union_set multi_union_pw_aff::domain() const
{
  auto res = isl_multi_union_pw_aff_domain(copy());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_multi_union_pw_aff_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

multi_pw_aff multi_union_pw_aff::extract_multi_pw_aff(space space) const
{
  auto res = isl_multi_union_pw_aff_extract_multi_pw_aff(get(), space.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::factor_range() const
{
  auto res = isl_multi_union_pw_aff_factor_range(copy());
  return manage(res);
}

int multi_union_pw_aff::find_dim_by_id(isl::dim type, const id &id) const
{
  auto res = isl_multi_union_pw_aff_find_dim_by_id(get(), static_cast<enum isl_dim_type>(type), id.get());
  return res;
}

int multi_union_pw_aff::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_multi_union_pw_aff_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

multi_union_pw_aff multi_union_pw_aff::flat_range_product(multi_union_pw_aff multi2) const
{
  auto res = isl_multi_union_pw_aff_flat_range_product(copy(), multi2.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::flatten_range() const
{
  auto res = isl_multi_union_pw_aff_flatten_range(copy());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::floor() const
{
  auto res = isl_multi_union_pw_aff_floor(copy());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::from_multi_aff(multi_aff ma)
{
  auto res = isl_multi_union_pw_aff_from_multi_aff(ma.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::from_range() const
{
  auto res = isl_multi_union_pw_aff_from_range(copy());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::from_union_map(union_map umap)
{
  auto res = isl_multi_union_pw_aff_from_union_map(umap.release());
  return manage(res);
}

union_pw_aff multi_union_pw_aff::get_at(int pos) const
{
  auto res = isl_multi_union_pw_aff_get_at(get(), pos);
  return manage(res);
}

id multi_union_pw_aff::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_multi_union_pw_aff_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

space multi_union_pw_aff::get_domain_space() const
{
  auto res = isl_multi_union_pw_aff_get_domain_space(get());
  return manage(res);
}

union_pw_aff_list multi_union_pw_aff::get_list() const
{
  auto res = isl_multi_union_pw_aff_get_list(get());
  return manage(res);
}

space multi_union_pw_aff::get_space() const
{
  auto res = isl_multi_union_pw_aff_get_space(get());
  return manage(res);
}

id multi_union_pw_aff::get_tuple_id(isl::dim type) const
{
  auto res = isl_multi_union_pw_aff_get_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

std::string multi_union_pw_aff::get_tuple_name(isl::dim type) const
{
  auto res = isl_multi_union_pw_aff_get_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  std::string tmp(res);
  return tmp;
}

union_pw_aff multi_union_pw_aff::get_union_pw_aff(int pos) const
{
  auto res = isl_multi_union_pw_aff_get_union_pw_aff(get(), pos);
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::gist(union_set context) const
{
  auto res = isl_multi_union_pw_aff_gist(copy(), context.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::gist_params(set context) const
{
  auto res = isl_multi_union_pw_aff_gist_params(copy(), context.release());
  return manage(res);
}

boolean multi_union_pw_aff::has_tuple_id(isl::dim type) const
{
  auto res = isl_multi_union_pw_aff_has_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::intersect_domain(union_set uset) const
{
  auto res = isl_multi_union_pw_aff_intersect_domain(copy(), uset.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::intersect_params(set params) const
{
  auto res = isl_multi_union_pw_aff_intersect_params(copy(), params.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::intersect_range(set set) const
{
  auto res = isl_multi_union_pw_aff_intersect_range(copy(), set.release());
  return manage(res);
}

boolean multi_union_pw_aff::involves_nan() const
{
  auto res = isl_multi_union_pw_aff_involves_nan(get());
  return manage(res);
}

multi_val multi_union_pw_aff::max_multi_val() const
{
  auto res = isl_multi_union_pw_aff_max_multi_val(copy());
  return manage(res);
}

multi_val multi_union_pw_aff::min_multi_val() const
{
  auto res = isl_multi_union_pw_aff_min_multi_val(copy());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::mod_multi_val(multi_val mv) const
{
  auto res = isl_multi_union_pw_aff_mod_multi_val(copy(), mv.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::multi_aff_on_domain(union_set domain, multi_aff ma)
{
  auto res = isl_multi_union_pw_aff_multi_aff_on_domain(domain.release(), ma.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::multi_val_on_domain(union_set domain, multi_val mv)
{
  auto res = isl_multi_union_pw_aff_multi_val_on_domain(domain.release(), mv.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::neg() const
{
  auto res = isl_multi_union_pw_aff_neg(copy());
  return manage(res);
}

boolean multi_union_pw_aff::plain_is_equal(const multi_union_pw_aff &multi2) const
{
  auto res = isl_multi_union_pw_aff_plain_is_equal(get(), multi2.get());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::pullback(union_pw_multi_aff upma) const
{
  auto res = isl_multi_union_pw_aff_pullback_union_pw_multi_aff(copy(), upma.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::pw_multi_aff_on_domain(union_set domain, pw_multi_aff pma)
{
  auto res = isl_multi_union_pw_aff_pw_multi_aff_on_domain(domain.release(), pma.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::range_factor_domain() const
{
  auto res = isl_multi_union_pw_aff_range_factor_domain(copy());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::range_factor_range() const
{
  auto res = isl_multi_union_pw_aff_range_factor_range(copy());
  return manage(res);
}

boolean multi_union_pw_aff::range_is_wrapping() const
{
  auto res = isl_multi_union_pw_aff_range_is_wrapping(get());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::range_product(multi_union_pw_aff multi2) const
{
  auto res = isl_multi_union_pw_aff_range_product(copy(), multi2.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::range_splice(unsigned int pos, multi_union_pw_aff multi2) const
{
  auto res = isl_multi_union_pw_aff_range_splice(copy(), pos, multi2.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::reset_tuple_id(isl::dim type) const
{
  auto res = isl_multi_union_pw_aff_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::reset_user() const
{
  auto res = isl_multi_union_pw_aff_reset_user(copy());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::scale(multi_val mv) const
{
  auto res = isl_multi_union_pw_aff_scale_multi_val(copy(), mv.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::scale(val v) const
{
  auto res = isl_multi_union_pw_aff_scale_val(copy(), v.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::scale_down(multi_val mv) const
{
  auto res = isl_multi_union_pw_aff_scale_down_multi_val(copy(), mv.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::scale_down(val v) const
{
  auto res = isl_multi_union_pw_aff_scale_down_val(copy(), v.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::set_at(int pos, union_pw_aff el) const
{
  auto res = isl_multi_union_pw_aff_set_at(copy(), pos, el.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_multi_union_pw_aff_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_multi_union_pw_aff_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::set_tuple_name(isl::dim type, const std::string &s) const
{
  auto res = isl_multi_union_pw_aff_set_tuple_name(copy(), static_cast<enum isl_dim_type>(type), s.c_str());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::set_union_pw_aff(int pos, union_pw_aff el) const
{
  auto res = isl_multi_union_pw_aff_set_union_pw_aff(copy(), pos, el.release());
  return manage(res);
}

isl_size multi_union_pw_aff::size() const
{
  auto res = isl_multi_union_pw_aff_size(get());
  return res;
}

multi_union_pw_aff multi_union_pw_aff::sub(multi_union_pw_aff multi2) const
{
  auto res = isl_multi_union_pw_aff_sub(copy(), multi2.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::union_add(multi_union_pw_aff mupa2) const
{
  auto res = isl_multi_union_pw_aff_union_add(copy(), mupa2.release());
  return manage(res);
}

multi_union_pw_aff multi_union_pw_aff::zero(space space)
{
  auto res = isl_multi_union_pw_aff_zero(space.release());
  return manage(res);
}

union_set multi_union_pw_aff::zero_union_set() const
{
  auto res = isl_multi_union_pw_aff_zero_union_set(copy());
  return manage(res);
}

// implementations for isl::multi_val
multi_val manage(__isl_take isl_multi_val *ptr) {
  return multi_val(ptr);
}
multi_val manage_copy(__isl_keep isl_multi_val *ptr) {
  ptr = isl_multi_val_copy(ptr);
  return multi_val(ptr);
}

multi_val::multi_val()
    : ptr(nullptr) {}

multi_val::multi_val(const multi_val &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


multi_val::multi_val(__isl_take isl_multi_val *ptr)
    : ptr(ptr) {}

multi_val::multi_val(space space, val_list list)
{
  auto res = isl_multi_val_from_val_list(space.release(), list.release());
  ptr = res;
}
multi_val::multi_val(ctx ctx, const std::string &str)
{
  auto res = isl_multi_val_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

multi_val &multi_val::operator=(multi_val obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

multi_val::~multi_val() {
  if (ptr)
    isl_multi_val_free(ptr);
}

__isl_give isl_multi_val *multi_val::copy() const & {
  return isl_multi_val_copy(ptr);
}

__isl_keep isl_multi_val *multi_val::get() const {
  return ptr;
}

__isl_give isl_multi_val *multi_val::release() {
  isl_multi_val *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool multi_val::is_null() const {
  return ptr == nullptr;
}


ctx multi_val::get_ctx() const {
  return ctx(isl_multi_val_get_ctx(ptr));
}

void multi_val::dump() const {
  isl_multi_val_dump(get());
}


multi_val multi_val::add(multi_val multi2) const
{
  auto res = isl_multi_val_add(copy(), multi2.release());
  return manage(res);
}

multi_val multi_val::add(val v) const
{
  auto res = isl_multi_val_add_val(copy(), v.release());
  return manage(res);
}

multi_val multi_val::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_multi_val_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

multi_val multi_val::align_params(space model) const
{
  auto res = isl_multi_val_align_params(copy(), model.release());
  return manage(res);
}

isl_size multi_val::dim(isl::dim type) const
{
  auto res = isl_multi_val_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

multi_val multi_val::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_multi_val_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

multi_val multi_val::factor_range() const
{
  auto res = isl_multi_val_factor_range(copy());
  return manage(res);
}

int multi_val::find_dim_by_id(isl::dim type, const id &id) const
{
  auto res = isl_multi_val_find_dim_by_id(get(), static_cast<enum isl_dim_type>(type), id.get());
  return res;
}

int multi_val::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_multi_val_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

multi_val multi_val::flat_range_product(multi_val multi2) const
{
  auto res = isl_multi_val_flat_range_product(copy(), multi2.release());
  return manage(res);
}

multi_val multi_val::flatten_range() const
{
  auto res = isl_multi_val_flatten_range(copy());
  return manage(res);
}

multi_val multi_val::from_range() const
{
  auto res = isl_multi_val_from_range(copy());
  return manage(res);
}

val multi_val::get_at(int pos) const
{
  auto res = isl_multi_val_get_at(get(), pos);
  return manage(res);
}

id multi_val::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_multi_val_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

space multi_val::get_domain_space() const
{
  auto res = isl_multi_val_get_domain_space(get());
  return manage(res);
}

val_list multi_val::get_list() const
{
  auto res = isl_multi_val_get_list(get());
  return manage(res);
}

space multi_val::get_space() const
{
  auto res = isl_multi_val_get_space(get());
  return manage(res);
}

id multi_val::get_tuple_id(isl::dim type) const
{
  auto res = isl_multi_val_get_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

std::string multi_val::get_tuple_name(isl::dim type) const
{
  auto res = isl_multi_val_get_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  std::string tmp(res);
  return tmp;
}

val multi_val::get_val(int pos) const
{
  auto res = isl_multi_val_get_val(get(), pos);
  return manage(res);
}

boolean multi_val::has_tuple_id(isl::dim type) const
{
  auto res = isl_multi_val_has_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

multi_val multi_val::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_multi_val_insert_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean multi_val::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_multi_val_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean multi_val::involves_nan() const
{
  auto res = isl_multi_val_involves_nan(get());
  return manage(res);
}

boolean multi_val::is_zero() const
{
  auto res = isl_multi_val_is_zero(get());
  return manage(res);
}

multi_val multi_val::max(multi_val multi2) const
{
  auto res = isl_multi_val_max(copy(), multi2.release());
  return manage(res);
}

multi_val multi_val::min(multi_val multi2) const
{
  auto res = isl_multi_val_min(copy(), multi2.release());
  return manage(res);
}

multi_val multi_val::mod_multi_val(multi_val mv) const
{
  auto res = isl_multi_val_mod_multi_val(copy(), mv.release());
  return manage(res);
}

multi_val multi_val::mod_val(val v) const
{
  auto res = isl_multi_val_mod_val(copy(), v.release());
  return manage(res);
}

multi_val multi_val::neg() const
{
  auto res = isl_multi_val_neg(copy());
  return manage(res);
}

boolean multi_val::plain_is_equal(const multi_val &multi2) const
{
  auto res = isl_multi_val_plain_is_equal(get(), multi2.get());
  return manage(res);
}

multi_val multi_val::product(multi_val multi2) const
{
  auto res = isl_multi_val_product(copy(), multi2.release());
  return manage(res);
}

multi_val multi_val::project_domain_on_params() const
{
  auto res = isl_multi_val_project_domain_on_params(copy());
  return manage(res);
}

multi_val multi_val::range_factor_domain() const
{
  auto res = isl_multi_val_range_factor_domain(copy());
  return manage(res);
}

multi_val multi_val::range_factor_range() const
{
  auto res = isl_multi_val_range_factor_range(copy());
  return manage(res);
}

boolean multi_val::range_is_wrapping() const
{
  auto res = isl_multi_val_range_is_wrapping(get());
  return manage(res);
}

multi_val multi_val::range_product(multi_val multi2) const
{
  auto res = isl_multi_val_range_product(copy(), multi2.release());
  return manage(res);
}

multi_val multi_val::range_splice(unsigned int pos, multi_val multi2) const
{
  auto res = isl_multi_val_range_splice(copy(), pos, multi2.release());
  return manage(res);
}

multi_val multi_val::reset_tuple_id(isl::dim type) const
{
  auto res = isl_multi_val_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

multi_val multi_val::reset_user() const
{
  auto res = isl_multi_val_reset_user(copy());
  return manage(res);
}

multi_val multi_val::scale(multi_val mv) const
{
  auto res = isl_multi_val_scale_multi_val(copy(), mv.release());
  return manage(res);
}

multi_val multi_val::scale(val v) const
{
  auto res = isl_multi_val_scale_val(copy(), v.release());
  return manage(res);
}

multi_val multi_val::scale_down(multi_val mv) const
{
  auto res = isl_multi_val_scale_down_multi_val(copy(), mv.release());
  return manage(res);
}

multi_val multi_val::scale_down(val v) const
{
  auto res = isl_multi_val_scale_down_val(copy(), v.release());
  return manage(res);
}

multi_val multi_val::set_at(int pos, val el) const
{
  auto res = isl_multi_val_set_at(copy(), pos, el.release());
  return manage(res);
}

multi_val multi_val::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_multi_val_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

multi_val multi_val::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_multi_val_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

multi_val multi_val::set_tuple_name(isl::dim type, const std::string &s) const
{
  auto res = isl_multi_val_set_tuple_name(copy(), static_cast<enum isl_dim_type>(type), s.c_str());
  return manage(res);
}

multi_val multi_val::set_val(int pos, val el) const
{
  auto res = isl_multi_val_set_val(copy(), pos, el.release());
  return manage(res);
}

isl_size multi_val::size() const
{
  auto res = isl_multi_val_size(get());
  return res;
}

multi_val multi_val::splice(unsigned int in_pos, unsigned int out_pos, multi_val multi2) const
{
  auto res = isl_multi_val_splice(copy(), in_pos, out_pos, multi2.release());
  return manage(res);
}

multi_val multi_val::sub(multi_val multi2) const
{
  auto res = isl_multi_val_sub(copy(), multi2.release());
  return manage(res);
}

multi_val multi_val::zero(space space)
{
  auto res = isl_multi_val_zero(space.release());
  return manage(res);
}

// implementations for isl::point
point manage(__isl_take isl_point *ptr) {
  return point(ptr);
}
point manage_copy(__isl_keep isl_point *ptr) {
  ptr = isl_point_copy(ptr);
  return point(ptr);
}

point::point()
    : ptr(nullptr) {}

point::point(const point &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


point::point(__isl_take isl_point *ptr)
    : ptr(ptr) {}

point::point(space dim)
{
  auto res = isl_point_zero(dim.release());
  ptr = res;
}

point &point::operator=(point obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

point::~point() {
  if (ptr)
    isl_point_free(ptr);
}

__isl_give isl_point *point::copy() const & {
  return isl_point_copy(ptr);
}

__isl_keep isl_point *point::get() const {
  return ptr;
}

__isl_give isl_point *point::release() {
  isl_point *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool point::is_null() const {
  return ptr == nullptr;
}


ctx point::get_ctx() const {
  return ctx(isl_point_get_ctx(ptr));
}

void point::dump() const {
  isl_point_dump(get());
}


point point::add_ui(isl::dim type, int pos, unsigned int val) const
{
  auto res = isl_point_add_ui(copy(), static_cast<enum isl_dim_type>(type), pos, val);
  return manage(res);
}

val point::get_coordinate_val(isl::dim type, int pos) const
{
  auto res = isl_point_get_coordinate_val(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

multi_val point::get_multi_val() const
{
  auto res = isl_point_get_multi_val(get());
  return manage(res);
}

space point::get_space() const
{
  auto res = isl_point_get_space(get());
  return manage(res);
}

point point::set_coordinate_val(isl::dim type, int pos, val v) const
{
  auto res = isl_point_set_coordinate_val(copy(), static_cast<enum isl_dim_type>(type), pos, v.release());
  return manage(res);
}

point point::sub_ui(isl::dim type, int pos, unsigned int val) const
{
  auto res = isl_point_sub_ui(copy(), static_cast<enum isl_dim_type>(type), pos, val);
  return manage(res);
}

// implementations for isl::pw_aff
pw_aff manage(__isl_take isl_pw_aff *ptr) {
  return pw_aff(ptr);
}
pw_aff manage_copy(__isl_keep isl_pw_aff *ptr) {
  ptr = isl_pw_aff_copy(ptr);
  return pw_aff(ptr);
}

pw_aff::pw_aff()
    : ptr(nullptr) {}

pw_aff::pw_aff(const pw_aff &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


pw_aff::pw_aff(__isl_take isl_pw_aff *ptr)
    : ptr(ptr) {}

pw_aff::pw_aff(aff aff)
{
  auto res = isl_pw_aff_from_aff(aff.release());
  ptr = res;
}
pw_aff::pw_aff(ctx ctx, const std::string &str)
{
  auto res = isl_pw_aff_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}
pw_aff::pw_aff(set domain, val v)
{
  auto res = isl_pw_aff_val_on_domain(domain.release(), v.release());
  ptr = res;
}
pw_aff::pw_aff(local_space ls)
{
  auto res = isl_pw_aff_zero_on_domain(ls.release());
  ptr = res;
}

pw_aff &pw_aff::operator=(pw_aff obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

pw_aff::~pw_aff() {
  if (ptr)
    isl_pw_aff_free(ptr);
}

__isl_give isl_pw_aff *pw_aff::copy() const & {
  return isl_pw_aff_copy(ptr);
}

__isl_keep isl_pw_aff *pw_aff::get() const {
  return ptr;
}

__isl_give isl_pw_aff *pw_aff::release() {
  isl_pw_aff *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool pw_aff::is_null() const {
  return ptr == nullptr;
}


ctx pw_aff::get_ctx() const {
  return ctx(isl_pw_aff_get_ctx(ptr));
}

void pw_aff::dump() const {
  isl_pw_aff_dump(get());
}


pw_aff pw_aff::add(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_add(copy(), pwaff2.release());
  return manage(res);
}

pw_aff pw_aff::add_constant(val v) const
{
  auto res = isl_pw_aff_add_constant_val(copy(), v.release());
  return manage(res);
}

pw_aff pw_aff::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_pw_aff_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

pw_aff pw_aff::align_params(space model) const
{
  auto res = isl_pw_aff_align_params(copy(), model.release());
  return manage(res);
}

pw_aff pw_aff::alloc(set set, aff aff)
{
  auto res = isl_pw_aff_alloc(set.release(), aff.release());
  return manage(res);
}

aff pw_aff::as_aff() const
{
  auto res = isl_pw_aff_as_aff(copy());
  return manage(res);
}

set pw_aff::bind(id id) const
{
  auto res = isl_pw_aff_bind_id(copy(), id.release());
  return manage(res);
}

pw_aff pw_aff::bind_domain(multi_id tuple) const
{
  auto res = isl_pw_aff_bind_domain(copy(), tuple.release());
  return manage(res);
}

pw_aff pw_aff::bind_domain_wrapped_domain(multi_id tuple) const
{
  auto res = isl_pw_aff_bind_domain_wrapped_domain(copy(), tuple.release());
  return manage(res);
}

pw_aff pw_aff::ceil() const
{
  auto res = isl_pw_aff_ceil(copy());
  return manage(res);
}

pw_aff pw_aff::coalesce() const
{
  auto res = isl_pw_aff_coalesce(copy());
  return manage(res);
}

pw_aff pw_aff::cond(pw_aff pwaff_true, pw_aff pwaff_false) const
{
  auto res = isl_pw_aff_cond(copy(), pwaff_true.release(), pwaff_false.release());
  return manage(res);
}

isl_size pw_aff::dim(isl::dim type) const
{
  auto res = isl_pw_aff_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

pw_aff pw_aff::div(pw_aff pa2) const
{
  auto res = isl_pw_aff_div(copy(), pa2.release());
  return manage(res);
}

set pw_aff::domain() const
{
  auto res = isl_pw_aff_domain(copy());
  return manage(res);
}

pw_aff pw_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_pw_aff_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

pw_aff pw_aff::drop_unused_params() const
{
  auto res = isl_pw_aff_drop_unused_params(copy());
  return manage(res);
}

pw_aff pw_aff::empty(space space)
{
  auto res = isl_pw_aff_empty(space.release());
  return manage(res);
}

map pw_aff::eq_map(pw_aff pa2) const
{
  auto res = isl_pw_aff_eq_map(copy(), pa2.release());
  return manage(res);
}

set pw_aff::eq_set(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_eq_set(copy(), pwaff2.release());
  return manage(res);
}

val pw_aff::eval(point pnt) const
{
  auto res = isl_pw_aff_eval(copy(), pnt.release());
  return manage(res);
}

int pw_aff::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_pw_aff_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

pw_aff pw_aff::floor() const
{
  auto res = isl_pw_aff_floor(copy());
  return manage(res);
}

stat pw_aff::foreach_piece(const std::function<stat(set, aff)> &fn) const
{
  struct fn_data {
    const std::function<stat(set, aff)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_set *arg_0, isl_aff *arg_1, void *arg_2) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_2);
    stat ret = (*data->func)(manage(arg_0), manage(arg_1));
    return ret.release();
  };
  auto res = isl_pw_aff_foreach_piece(get(), fn_lambda, &fn_data);
  return manage(res);
}

pw_aff pw_aff::from_range() const
{
  auto res = isl_pw_aff_from_range(copy());
  return manage(res);
}

map pw_aff::ge_map(pw_aff pa2) const
{
  auto res = isl_pw_aff_ge_map(copy(), pa2.release());
  return manage(res);
}

set pw_aff::ge_set(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_ge_set(copy(), pwaff2.release());
  return manage(res);
}

id pw_aff::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_pw_aff_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

std::string pw_aff::get_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_pw_aff_get_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  std::string tmp(res);
  return tmp;
}

space pw_aff::get_domain_space() const
{
  auto res = isl_pw_aff_get_domain_space(get());
  return manage(res);
}

uint32_t pw_aff::get_hash() const
{
  auto res = isl_pw_aff_get_hash(get());
  return res;
}

space pw_aff::get_space() const
{
  auto res = isl_pw_aff_get_space(get());
  return manage(res);
}

id pw_aff::get_tuple_id(isl::dim type) const
{
  auto res = isl_pw_aff_get_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

pw_aff pw_aff::gist(set context) const
{
  auto res = isl_pw_aff_gist(copy(), context.release());
  return manage(res);
}

pw_aff pw_aff::gist_params(set context) const
{
  auto res = isl_pw_aff_gist_params(copy(), context.release());
  return manage(res);
}

map pw_aff::gt_map(pw_aff pa2) const
{
  auto res = isl_pw_aff_gt_map(copy(), pa2.release());
  return manage(res);
}

set pw_aff::gt_set(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_gt_set(copy(), pwaff2.release());
  return manage(res);
}

boolean pw_aff::has_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_pw_aff_has_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean pw_aff::has_tuple_id(isl::dim type) const
{
  auto res = isl_pw_aff_has_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

pw_aff pw_aff::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_pw_aff_insert_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

pw_aff pw_aff::insert_domain(space domain) const
{
  auto res = isl_pw_aff_insert_domain(copy(), domain.release());
  return manage(res);
}

pw_aff pw_aff::intersect_domain(set set) const
{
  auto res = isl_pw_aff_intersect_domain(copy(), set.release());
  return manage(res);
}

pw_aff pw_aff::intersect_domain_wrapped_domain(set set) const
{
  auto res = isl_pw_aff_intersect_domain_wrapped_domain(copy(), set.release());
  return manage(res);
}

pw_aff pw_aff::intersect_domain_wrapped_range(set set) const
{
  auto res = isl_pw_aff_intersect_domain_wrapped_range(copy(), set.release());
  return manage(res);
}

pw_aff pw_aff::intersect_params(set set) const
{
  auto res = isl_pw_aff_intersect_params(copy(), set.release());
  return manage(res);
}

boolean pw_aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_pw_aff_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean pw_aff::involves_nan() const
{
  auto res = isl_pw_aff_involves_nan(get());
  return manage(res);
}

boolean pw_aff::involves_param_id(const id &id) const
{
  auto res = isl_pw_aff_involves_param_id(get(), id.get());
  return manage(res);
}

boolean pw_aff::is_cst() const
{
  auto res = isl_pw_aff_is_cst(get());
  return manage(res);
}

boolean pw_aff::is_empty() const
{
  auto res = isl_pw_aff_is_empty(get());
  return manage(res);
}

boolean pw_aff::is_equal(const pw_aff &pa2) const
{
  auto res = isl_pw_aff_is_equal(get(), pa2.get());
  return manage(res);
}

boolean pw_aff::isa_aff() const
{
  auto res = isl_pw_aff_isa_aff(get());
  return manage(res);
}

map pw_aff::le_map(pw_aff pa2) const
{
  auto res = isl_pw_aff_le_map(copy(), pa2.release());
  return manage(res);
}

set pw_aff::le_set(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_le_set(copy(), pwaff2.release());
  return manage(res);
}

map pw_aff::lt_map(pw_aff pa2) const
{
  auto res = isl_pw_aff_lt_map(copy(), pa2.release());
  return manage(res);
}

set pw_aff::lt_set(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_lt_set(copy(), pwaff2.release());
  return manage(res);
}

pw_aff pw_aff::max(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_max(copy(), pwaff2.release());
  return manage(res);
}

pw_aff pw_aff::min(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_min(copy(), pwaff2.release());
  return manage(res);
}

pw_aff pw_aff::mod(val mod) const
{
  auto res = isl_pw_aff_mod_val(copy(), mod.release());
  return manage(res);
}

pw_aff pw_aff::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_pw_aff_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

pw_aff pw_aff::mul(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_mul(copy(), pwaff2.release());
  return manage(res);
}

isl_size pw_aff::n_piece() const
{
  auto res = isl_pw_aff_n_piece(get());
  return res;
}

pw_aff pw_aff::nan_on_domain(local_space ls)
{
  auto res = isl_pw_aff_nan_on_domain(ls.release());
  return manage(res);
}

pw_aff pw_aff::nan_on_domain_space(space space)
{
  auto res = isl_pw_aff_nan_on_domain_space(space.release());
  return manage(res);
}

set pw_aff::ne_set(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_ne_set(copy(), pwaff2.release());
  return manage(res);
}

pw_aff pw_aff::neg() const
{
  auto res = isl_pw_aff_neg(copy());
  return manage(res);
}

set pw_aff::non_zero_set() const
{
  auto res = isl_pw_aff_non_zero_set(copy());
  return manage(res);
}

set pw_aff::nonneg_set() const
{
  auto res = isl_pw_aff_nonneg_set(copy());
  return manage(res);
}

pw_aff pw_aff::param_on_domain(set domain, id id)
{
  auto res = isl_pw_aff_param_on_domain_id(domain.release(), id.release());
  return manage(res);
}

set pw_aff::params() const
{
  auto res = isl_pw_aff_params(copy());
  return manage(res);
}

int pw_aff::plain_cmp(const pw_aff &pa2) const
{
  auto res = isl_pw_aff_plain_cmp(get(), pa2.get());
  return res;
}

boolean pw_aff::plain_is_equal(const pw_aff &pwaff2) const
{
  auto res = isl_pw_aff_plain_is_equal(get(), pwaff2.get());
  return manage(res);
}

set pw_aff::pos_set() const
{
  auto res = isl_pw_aff_pos_set(copy());
  return manage(res);
}

pw_aff pw_aff::project_domain_on_params() const
{
  auto res = isl_pw_aff_project_domain_on_params(copy());
  return manage(res);
}

pw_aff pw_aff::pullback(multi_aff ma) const
{
  auto res = isl_pw_aff_pullback_multi_aff(copy(), ma.release());
  return manage(res);
}

pw_aff pw_aff::pullback(multi_pw_aff mpa) const
{
  auto res = isl_pw_aff_pullback_multi_pw_aff(copy(), mpa.release());
  return manage(res);
}

pw_aff pw_aff::pullback(pw_multi_aff pma) const
{
  auto res = isl_pw_aff_pullback_pw_multi_aff(copy(), pma.release());
  return manage(res);
}

pw_aff pw_aff::reset_tuple_id(isl::dim type) const
{
  auto res = isl_pw_aff_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

pw_aff pw_aff::reset_user() const
{
  auto res = isl_pw_aff_reset_user(copy());
  return manage(res);
}

pw_aff pw_aff::scale(val v) const
{
  auto res = isl_pw_aff_scale_val(copy(), v.release());
  return manage(res);
}

pw_aff pw_aff::scale_down(val f) const
{
  auto res = isl_pw_aff_scale_down_val(copy(), f.release());
  return manage(res);
}

pw_aff pw_aff::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_pw_aff_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

pw_aff pw_aff::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_pw_aff_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

pw_aff pw_aff::sub(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_sub(copy(), pwaff2.release());
  return manage(res);
}

pw_aff pw_aff::subtract_domain(set set) const
{
  auto res = isl_pw_aff_subtract_domain(copy(), set.release());
  return manage(res);
}

pw_aff pw_aff::tdiv_q(pw_aff pa2) const
{
  auto res = isl_pw_aff_tdiv_q(copy(), pa2.release());
  return manage(res);
}

pw_aff pw_aff::tdiv_r(pw_aff pa2) const
{
  auto res = isl_pw_aff_tdiv_r(copy(), pa2.release());
  return manage(res);
}

pw_aff pw_aff::union_add(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_union_add(copy(), pwaff2.release());
  return manage(res);
}

pw_aff pw_aff::union_max(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_union_max(copy(), pwaff2.release());
  return manage(res);
}

pw_aff pw_aff::union_min(pw_aff pwaff2) const
{
  auto res = isl_pw_aff_union_min(copy(), pwaff2.release());
  return manage(res);
}

pw_aff pw_aff::var_on_domain(local_space ls, isl::dim type, unsigned int pos)
{
  auto res = isl_pw_aff_var_on_domain(ls.release(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

set pw_aff::zero_set() const
{
  auto res = isl_pw_aff_zero_set(copy());
  return manage(res);
}

// implementations for isl::pw_aff_list
pw_aff_list manage(__isl_take isl_pw_aff_list *ptr) {
  return pw_aff_list(ptr);
}
pw_aff_list manage_copy(__isl_keep isl_pw_aff_list *ptr) {
  ptr = isl_pw_aff_list_copy(ptr);
  return pw_aff_list(ptr);
}

pw_aff_list::pw_aff_list()
    : ptr(nullptr) {}

pw_aff_list::pw_aff_list(const pw_aff_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


pw_aff_list::pw_aff_list(__isl_take isl_pw_aff_list *ptr)
    : ptr(ptr) {}


pw_aff_list &pw_aff_list::operator=(pw_aff_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

pw_aff_list::~pw_aff_list() {
  if (ptr)
    isl_pw_aff_list_free(ptr);
}

__isl_give isl_pw_aff_list *pw_aff_list::copy() const & {
  return isl_pw_aff_list_copy(ptr);
}

__isl_keep isl_pw_aff_list *pw_aff_list::get() const {
  return ptr;
}

__isl_give isl_pw_aff_list *pw_aff_list::release() {
  isl_pw_aff_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool pw_aff_list::is_null() const {
  return ptr == nullptr;
}


ctx pw_aff_list::get_ctx() const {
  return ctx(isl_pw_aff_list_get_ctx(ptr));
}

void pw_aff_list::dump() const {
  isl_pw_aff_list_dump(get());
}


pw_aff_list pw_aff_list::add(pw_aff el) const
{
  auto res = isl_pw_aff_list_add(copy(), el.release());
  return manage(res);
}

pw_aff_list pw_aff_list::alloc(ctx ctx, int n)
{
  auto res = isl_pw_aff_list_alloc(ctx.release(), n);
  return manage(res);
}

pw_aff_list pw_aff_list::clear() const
{
  auto res = isl_pw_aff_list_clear(copy());
  return manage(res);
}

pw_aff_list pw_aff_list::concat(pw_aff_list list2) const
{
  auto res = isl_pw_aff_list_concat(copy(), list2.release());
  return manage(res);
}

pw_aff_list pw_aff_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_pw_aff_list_drop(copy(), first, n);
  return manage(res);
}

set pw_aff_list::eq_set(pw_aff_list list2) const
{
  auto res = isl_pw_aff_list_eq_set(copy(), list2.release());
  return manage(res);
}

stat pw_aff_list::foreach(const std::function<stat(pw_aff)> &fn) const
{
  struct fn_data {
    const std::function<stat(pw_aff)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_pw_aff *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_pw_aff_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

pw_aff_list pw_aff_list::from_pw_aff(pw_aff el)
{
  auto res = isl_pw_aff_list_from_pw_aff(el.release());
  return manage(res);
}

set pw_aff_list::ge_set(pw_aff_list list2) const
{
  auto res = isl_pw_aff_list_ge_set(copy(), list2.release());
  return manage(res);
}

pw_aff pw_aff_list::get_at(int index) const
{
  auto res = isl_pw_aff_list_get_at(get(), index);
  return manage(res);
}

pw_aff pw_aff_list::get_pw_aff(int index) const
{
  auto res = isl_pw_aff_list_get_pw_aff(get(), index);
  return manage(res);
}

set pw_aff_list::gt_set(pw_aff_list list2) const
{
  auto res = isl_pw_aff_list_gt_set(copy(), list2.release());
  return manage(res);
}

pw_aff_list pw_aff_list::insert(unsigned int pos, pw_aff el) const
{
  auto res = isl_pw_aff_list_insert(copy(), pos, el.release());
  return manage(res);
}

set pw_aff_list::le_set(pw_aff_list list2) const
{
  auto res = isl_pw_aff_list_le_set(copy(), list2.release());
  return manage(res);
}

set pw_aff_list::lt_set(pw_aff_list list2) const
{
  auto res = isl_pw_aff_list_lt_set(copy(), list2.release());
  return manage(res);
}

pw_aff pw_aff_list::max() const
{
  auto res = isl_pw_aff_list_max(copy());
  return manage(res);
}

pw_aff pw_aff_list::min() const
{
  auto res = isl_pw_aff_list_min(copy());
  return manage(res);
}

isl_size pw_aff_list::n_pw_aff() const
{
  auto res = isl_pw_aff_list_n_pw_aff(get());
  return res;
}

set pw_aff_list::ne_set(pw_aff_list list2) const
{
  auto res = isl_pw_aff_list_ne_set(copy(), list2.release());
  return manage(res);
}

pw_aff_list pw_aff_list::reverse() const
{
  auto res = isl_pw_aff_list_reverse(copy());
  return manage(res);
}

pw_aff_list pw_aff_list::set_pw_aff(int index, pw_aff el) const
{
  auto res = isl_pw_aff_list_set_pw_aff(copy(), index, el.release());
  return manage(res);
}

isl_size pw_aff_list::size() const
{
  auto res = isl_pw_aff_list_size(get());
  return res;
}

pw_aff_list pw_aff_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_pw_aff_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::pw_multi_aff
pw_multi_aff manage(__isl_take isl_pw_multi_aff *ptr) {
  return pw_multi_aff(ptr);
}
pw_multi_aff manage_copy(__isl_keep isl_pw_multi_aff *ptr) {
  ptr = isl_pw_multi_aff_copy(ptr);
  return pw_multi_aff(ptr);
}

pw_multi_aff::pw_multi_aff()
    : ptr(nullptr) {}

pw_multi_aff::pw_multi_aff(const pw_multi_aff &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


pw_multi_aff::pw_multi_aff(__isl_take isl_pw_multi_aff *ptr)
    : ptr(ptr) {}

pw_multi_aff::pw_multi_aff(multi_aff ma)
{
  auto res = isl_pw_multi_aff_from_multi_aff(ma.release());
  ptr = res;
}
pw_multi_aff::pw_multi_aff(pw_aff pa)
{
  auto res = isl_pw_multi_aff_from_pw_aff(pa.release());
  ptr = res;
}
pw_multi_aff::pw_multi_aff(ctx ctx, const std::string &str)
{
  auto res = isl_pw_multi_aff_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

pw_multi_aff &pw_multi_aff::operator=(pw_multi_aff obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

pw_multi_aff::~pw_multi_aff() {
  if (ptr)
    isl_pw_multi_aff_free(ptr);
}

__isl_give isl_pw_multi_aff *pw_multi_aff::copy() const & {
  return isl_pw_multi_aff_copy(ptr);
}

__isl_keep isl_pw_multi_aff *pw_multi_aff::get() const {
  return ptr;
}

__isl_give isl_pw_multi_aff *pw_multi_aff::release() {
  isl_pw_multi_aff *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool pw_multi_aff::is_null() const {
  return ptr == nullptr;
}


ctx pw_multi_aff::get_ctx() const {
  return ctx(isl_pw_multi_aff_get_ctx(ptr));
}

void pw_multi_aff::dump() const {
  isl_pw_multi_aff_dump(get());
}


pw_multi_aff pw_multi_aff::add(pw_multi_aff pma2) const
{
  auto res = isl_pw_multi_aff_add(copy(), pma2.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::add_constant(multi_val mv) const
{
  auto res = isl_pw_multi_aff_add_constant_multi_val(copy(), mv.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::add_constant(val v) const
{
  auto res = isl_pw_multi_aff_add_constant_val(copy(), v.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::align_params(space model) const
{
  auto res = isl_pw_multi_aff_align_params(copy(), model.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::alloc(set set, multi_aff maff)
{
  auto res = isl_pw_multi_aff_alloc(set.release(), maff.release());
  return manage(res);
}

multi_aff pw_multi_aff::as_multi_aff() const
{
  auto res = isl_pw_multi_aff_as_multi_aff(copy());
  return manage(res);
}

pw_multi_aff pw_multi_aff::bind_domain(multi_id tuple) const
{
  auto res = isl_pw_multi_aff_bind_domain(copy(), tuple.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::bind_domain_wrapped_domain(multi_id tuple) const
{
  auto res = isl_pw_multi_aff_bind_domain_wrapped_domain(copy(), tuple.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::coalesce() const
{
  auto res = isl_pw_multi_aff_coalesce(copy());
  return manage(res);
}

isl_size pw_multi_aff::dim(isl::dim type) const
{
  auto res = isl_pw_multi_aff_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

set pw_multi_aff::domain() const
{
  auto res = isl_pw_multi_aff_domain(copy());
  return manage(res);
}

pw_multi_aff pw_multi_aff::domain_map(space space)
{
  auto res = isl_pw_multi_aff_domain_map(space.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_pw_multi_aff_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

pw_multi_aff pw_multi_aff::drop_unused_params() const
{
  auto res = isl_pw_multi_aff_drop_unused_params(copy());
  return manage(res);
}

pw_multi_aff pw_multi_aff::empty(space space)
{
  auto res = isl_pw_multi_aff_empty(space.release());
  return manage(res);
}

int pw_multi_aff::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_pw_multi_aff_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

pw_multi_aff pw_multi_aff::fix_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_pw_multi_aff_fix_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

pw_multi_aff pw_multi_aff::flat_range_product(pw_multi_aff pma2) const
{
  auto res = isl_pw_multi_aff_flat_range_product(copy(), pma2.release());
  return manage(res);
}

stat pw_multi_aff::foreach_piece(const std::function<stat(set, multi_aff)> &fn) const
{
  struct fn_data {
    const std::function<stat(set, multi_aff)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_set *arg_0, isl_multi_aff *arg_1, void *arg_2) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_2);
    stat ret = (*data->func)(manage(arg_0), manage(arg_1));
    return ret.release();
  };
  auto res = isl_pw_multi_aff_foreach_piece(get(), fn_lambda, &fn_data);
  return manage(res);
}

pw_multi_aff pw_multi_aff::from_domain(set set)
{
  auto res = isl_pw_multi_aff_from_domain(set.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::from_map(map map)
{
  auto res = isl_pw_multi_aff_from_map(map.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::from_multi_pw_aff(multi_pw_aff mpa)
{
  auto res = isl_pw_multi_aff_from_multi_pw_aff(mpa.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::from_set(set set)
{
  auto res = isl_pw_multi_aff_from_set(set.release());
  return manage(res);
}

id pw_multi_aff::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_pw_multi_aff_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

std::string pw_multi_aff::get_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_pw_multi_aff_get_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  std::string tmp(res);
  return tmp;
}

space pw_multi_aff::get_domain_space() const
{
  auto res = isl_pw_multi_aff_get_domain_space(get());
  return manage(res);
}

pw_aff pw_multi_aff::get_pw_aff(int pos) const
{
  auto res = isl_pw_multi_aff_get_pw_aff(get(), pos);
  return manage(res);
}

space pw_multi_aff::get_space() const
{
  auto res = isl_pw_multi_aff_get_space(get());
  return manage(res);
}

id pw_multi_aff::get_tuple_id(isl::dim type) const
{
  auto res = isl_pw_multi_aff_get_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

std::string pw_multi_aff::get_tuple_name(isl::dim type) const
{
  auto res = isl_pw_multi_aff_get_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  std::string tmp(res);
  return tmp;
}

pw_multi_aff pw_multi_aff::gist(set set) const
{
  auto res = isl_pw_multi_aff_gist(copy(), set.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::gist_params(set set) const
{
  auto res = isl_pw_multi_aff_gist_params(copy(), set.release());
  return manage(res);
}

boolean pw_multi_aff::has_tuple_id(isl::dim type) const
{
  auto res = isl_pw_multi_aff_has_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

boolean pw_multi_aff::has_tuple_name(isl::dim type) const
{
  auto res = isl_pw_multi_aff_has_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

pw_multi_aff pw_multi_aff::identity(space space)
{
  auto res = isl_pw_multi_aff_identity(space.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::identity_on_domain(space space)
{
  auto res = isl_pw_multi_aff_identity_on_domain_space(space.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::insert_domain(space domain) const
{
  auto res = isl_pw_multi_aff_insert_domain(copy(), domain.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::intersect_domain(set set) const
{
  auto res = isl_pw_multi_aff_intersect_domain(copy(), set.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::intersect_domain_wrapped_domain(set set) const
{
  auto res = isl_pw_multi_aff_intersect_domain_wrapped_domain(copy(), set.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::intersect_domain_wrapped_range(set set) const
{
  auto res = isl_pw_multi_aff_intersect_domain_wrapped_range(copy(), set.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::intersect_params(set set) const
{
  auto res = isl_pw_multi_aff_intersect_params(copy(), set.release());
  return manage(res);
}

boolean pw_multi_aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_pw_multi_aff_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean pw_multi_aff::involves_locals() const
{
  auto res = isl_pw_multi_aff_involves_locals(get());
  return manage(res);
}

boolean pw_multi_aff::involves_nan() const
{
  auto res = isl_pw_multi_aff_involves_nan(get());
  return manage(res);
}

boolean pw_multi_aff::involves_param_id(const id &id) const
{
  auto res = isl_pw_multi_aff_involves_param_id(get(), id.get());
  return manage(res);
}

boolean pw_multi_aff::is_equal(const pw_multi_aff &pma2) const
{
  auto res = isl_pw_multi_aff_is_equal(get(), pma2.get());
  return manage(res);
}

boolean pw_multi_aff::isa_multi_aff() const
{
  auto res = isl_pw_multi_aff_isa_multi_aff(get());
  return manage(res);
}

multi_val pw_multi_aff::max_multi_val() const
{
  auto res = isl_pw_multi_aff_max_multi_val(copy());
  return manage(res);
}

multi_val pw_multi_aff::min_multi_val() const
{
  auto res = isl_pw_multi_aff_min_multi_val(copy());
  return manage(res);
}

pw_multi_aff pw_multi_aff::multi_val_on_domain(set domain, multi_val mv)
{
  auto res = isl_pw_multi_aff_multi_val_on_domain(domain.release(), mv.release());
  return manage(res);
}

isl_size pw_multi_aff::n_piece() const
{
  auto res = isl_pw_multi_aff_n_piece(get());
  return res;
}

pw_multi_aff pw_multi_aff::neg() const
{
  auto res = isl_pw_multi_aff_neg(copy());
  return manage(res);
}

boolean pw_multi_aff::plain_is_equal(const pw_multi_aff &pma2) const
{
  auto res = isl_pw_multi_aff_plain_is_equal(get(), pma2.get());
  return manage(res);
}

pw_multi_aff pw_multi_aff::preimage_domain_wrapped_domain(pw_multi_aff pma2) const
{
  auto res = isl_pw_multi_aff_preimage_domain_wrapped_domain_pw_multi_aff(copy(), pma2.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::product(pw_multi_aff pma2) const
{
  auto res = isl_pw_multi_aff_product(copy(), pma2.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::project_domain_on_params() const
{
  auto res = isl_pw_multi_aff_project_domain_on_params(copy());
  return manage(res);
}

pw_multi_aff pw_multi_aff::project_out_map(space space, isl::dim type, unsigned int first, unsigned int n)
{
  auto res = isl_pw_multi_aff_project_out_map(space.release(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

pw_multi_aff pw_multi_aff::pullback(multi_aff ma) const
{
  auto res = isl_pw_multi_aff_pullback_multi_aff(copy(), ma.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::pullback(pw_multi_aff pma2) const
{
  auto res = isl_pw_multi_aff_pullback_pw_multi_aff(copy(), pma2.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::range_factor_domain() const
{
  auto res = isl_pw_multi_aff_range_factor_domain(copy());
  return manage(res);
}

pw_multi_aff pw_multi_aff::range_factor_range() const
{
  auto res = isl_pw_multi_aff_range_factor_range(copy());
  return manage(res);
}

pw_multi_aff pw_multi_aff::range_map(space space)
{
  auto res = isl_pw_multi_aff_range_map(space.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::range_product(pw_multi_aff pma2) const
{
  auto res = isl_pw_multi_aff_range_product(copy(), pma2.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::reset_tuple_id(isl::dim type) const
{
  auto res = isl_pw_multi_aff_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

pw_multi_aff pw_multi_aff::reset_user() const
{
  auto res = isl_pw_multi_aff_reset_user(copy());
  return manage(res);
}

pw_multi_aff pw_multi_aff::scale(val v) const
{
  auto res = isl_pw_multi_aff_scale_val(copy(), v.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::scale_down(val v) const
{
  auto res = isl_pw_multi_aff_scale_down_val(copy(), v.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::scale_multi_val(multi_val mv) const
{
  auto res = isl_pw_multi_aff_scale_multi_val(copy(), mv.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_pw_multi_aff_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::set_pw_aff(unsigned int pos, pw_aff pa) const
{
  auto res = isl_pw_multi_aff_set_pw_aff(copy(), pos, pa.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_pw_multi_aff_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::sub(pw_multi_aff pma2) const
{
  auto res = isl_pw_multi_aff_sub(copy(), pma2.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::subtract_domain(set set) const
{
  auto res = isl_pw_multi_aff_subtract_domain(copy(), set.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::union_add(pw_multi_aff pma2) const
{
  auto res = isl_pw_multi_aff_union_add(copy(), pma2.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::union_lexmax(pw_multi_aff pma2) const
{
  auto res = isl_pw_multi_aff_union_lexmax(copy(), pma2.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::union_lexmin(pw_multi_aff pma2) const
{
  auto res = isl_pw_multi_aff_union_lexmin(copy(), pma2.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff::zero(space space)
{
  auto res = isl_pw_multi_aff_zero(space.release());
  return manage(res);
}

// implementations for isl::pw_multi_aff_list
pw_multi_aff_list manage(__isl_take isl_pw_multi_aff_list *ptr) {
  return pw_multi_aff_list(ptr);
}
pw_multi_aff_list manage_copy(__isl_keep isl_pw_multi_aff_list *ptr) {
  ptr = isl_pw_multi_aff_list_copy(ptr);
  return pw_multi_aff_list(ptr);
}

pw_multi_aff_list::pw_multi_aff_list()
    : ptr(nullptr) {}

pw_multi_aff_list::pw_multi_aff_list(const pw_multi_aff_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


pw_multi_aff_list::pw_multi_aff_list(__isl_take isl_pw_multi_aff_list *ptr)
    : ptr(ptr) {}


pw_multi_aff_list &pw_multi_aff_list::operator=(pw_multi_aff_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

pw_multi_aff_list::~pw_multi_aff_list() {
  if (ptr)
    isl_pw_multi_aff_list_free(ptr);
}

__isl_give isl_pw_multi_aff_list *pw_multi_aff_list::copy() const & {
  return isl_pw_multi_aff_list_copy(ptr);
}

__isl_keep isl_pw_multi_aff_list *pw_multi_aff_list::get() const {
  return ptr;
}

__isl_give isl_pw_multi_aff_list *pw_multi_aff_list::release() {
  isl_pw_multi_aff_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool pw_multi_aff_list::is_null() const {
  return ptr == nullptr;
}


ctx pw_multi_aff_list::get_ctx() const {
  return ctx(isl_pw_multi_aff_list_get_ctx(ptr));
}

void pw_multi_aff_list::dump() const {
  isl_pw_multi_aff_list_dump(get());
}


pw_multi_aff_list pw_multi_aff_list::add(pw_multi_aff el) const
{
  auto res = isl_pw_multi_aff_list_add(copy(), el.release());
  return manage(res);
}

pw_multi_aff_list pw_multi_aff_list::alloc(ctx ctx, int n)
{
  auto res = isl_pw_multi_aff_list_alloc(ctx.release(), n);
  return manage(res);
}

pw_multi_aff_list pw_multi_aff_list::clear() const
{
  auto res = isl_pw_multi_aff_list_clear(copy());
  return manage(res);
}

pw_multi_aff_list pw_multi_aff_list::concat(pw_multi_aff_list list2) const
{
  auto res = isl_pw_multi_aff_list_concat(copy(), list2.release());
  return manage(res);
}

pw_multi_aff_list pw_multi_aff_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_pw_multi_aff_list_drop(copy(), first, n);
  return manage(res);
}

stat pw_multi_aff_list::foreach(const std::function<stat(pw_multi_aff)> &fn) const
{
  struct fn_data {
    const std::function<stat(pw_multi_aff)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_pw_multi_aff *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_pw_multi_aff_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

pw_multi_aff_list pw_multi_aff_list::from_pw_multi_aff(pw_multi_aff el)
{
  auto res = isl_pw_multi_aff_list_from_pw_multi_aff(el.release());
  return manage(res);
}

pw_multi_aff pw_multi_aff_list::get_at(int index) const
{
  auto res = isl_pw_multi_aff_list_get_at(get(), index);
  return manage(res);
}

pw_multi_aff pw_multi_aff_list::get_pw_multi_aff(int index) const
{
  auto res = isl_pw_multi_aff_list_get_pw_multi_aff(get(), index);
  return manage(res);
}

pw_multi_aff_list pw_multi_aff_list::insert(unsigned int pos, pw_multi_aff el) const
{
  auto res = isl_pw_multi_aff_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size pw_multi_aff_list::n_pw_multi_aff() const
{
  auto res = isl_pw_multi_aff_list_n_pw_multi_aff(get());
  return res;
}

pw_multi_aff_list pw_multi_aff_list::reverse() const
{
  auto res = isl_pw_multi_aff_list_reverse(copy());
  return manage(res);
}

pw_multi_aff_list pw_multi_aff_list::set_pw_multi_aff(int index, pw_multi_aff el) const
{
  auto res = isl_pw_multi_aff_list_set_pw_multi_aff(copy(), index, el.release());
  return manage(res);
}

isl_size pw_multi_aff_list::size() const
{
  auto res = isl_pw_multi_aff_list_size(get());
  return res;
}

pw_multi_aff_list pw_multi_aff_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_pw_multi_aff_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::pw_qpolynomial
pw_qpolynomial manage(__isl_take isl_pw_qpolynomial *ptr) {
  return pw_qpolynomial(ptr);
}
pw_qpolynomial manage_copy(__isl_keep isl_pw_qpolynomial *ptr) {
  ptr = isl_pw_qpolynomial_copy(ptr);
  return pw_qpolynomial(ptr);
}

pw_qpolynomial::pw_qpolynomial()
    : ptr(nullptr) {}

pw_qpolynomial::pw_qpolynomial(const pw_qpolynomial &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


pw_qpolynomial::pw_qpolynomial(__isl_take isl_pw_qpolynomial *ptr)
    : ptr(ptr) {}

pw_qpolynomial::pw_qpolynomial(ctx ctx, const std::string &str)
{
  auto res = isl_pw_qpolynomial_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

pw_qpolynomial &pw_qpolynomial::operator=(pw_qpolynomial obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

pw_qpolynomial::~pw_qpolynomial() {
  if (ptr)
    isl_pw_qpolynomial_free(ptr);
}

__isl_give isl_pw_qpolynomial *pw_qpolynomial::copy() const & {
  return isl_pw_qpolynomial_copy(ptr);
}

__isl_keep isl_pw_qpolynomial *pw_qpolynomial::get() const {
  return ptr;
}

__isl_give isl_pw_qpolynomial *pw_qpolynomial::release() {
  isl_pw_qpolynomial *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool pw_qpolynomial::is_null() const {
  return ptr == nullptr;
}


ctx pw_qpolynomial::get_ctx() const {
  return ctx(isl_pw_qpolynomial_get_ctx(ptr));
}

void pw_qpolynomial::dump() const {
  isl_pw_qpolynomial_dump(get());
}


pw_qpolynomial pw_qpolynomial::add(pw_qpolynomial pwqp2) const
{
  auto res = isl_pw_qpolynomial_add(copy(), pwqp2.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_pw_qpolynomial_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::alloc(set set, qpolynomial qp)
{
  auto res = isl_pw_qpolynomial_alloc(set.release(), qp.release());
  return manage(res);
}

qpolynomial pw_qpolynomial::as_qpolynomial() const
{
  auto res = isl_pw_qpolynomial_as_qpolynomial(copy());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::coalesce() const
{
  auto res = isl_pw_qpolynomial_coalesce(copy());
  return manage(res);
}

isl_size pw_qpolynomial::dim(isl::dim type) const
{
  auto res = isl_pw_qpolynomial_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

set pw_qpolynomial::domain() const
{
  auto res = isl_pw_qpolynomial_domain(copy());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_pw_qpolynomial_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::drop_unused_params() const
{
  auto res = isl_pw_qpolynomial_drop_unused_params(copy());
  return manage(res);
}

val pw_qpolynomial::eval(point pnt) const
{
  auto res = isl_pw_qpolynomial_eval(copy(), pnt.release());
  return manage(res);
}

int pw_qpolynomial::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_pw_qpolynomial_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

pw_qpolynomial pw_qpolynomial::fix_val(isl::dim type, unsigned int n, val v) const
{
  auto res = isl_pw_qpolynomial_fix_val(copy(), static_cast<enum isl_dim_type>(type), n, v.release());
  return manage(res);
}

stat pw_qpolynomial::foreach_piece(const std::function<stat(set, qpolynomial)> &fn) const
{
  struct fn_data {
    const std::function<stat(set, qpolynomial)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_set *arg_0, isl_qpolynomial *arg_1, void *arg_2) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_2);
    stat ret = (*data->func)(manage(arg_0), manage(arg_1));
    return ret.release();
  };
  auto res = isl_pw_qpolynomial_foreach_piece(get(), fn_lambda, &fn_data);
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::from_pw_aff(pw_aff pwaff)
{
  auto res = isl_pw_qpolynomial_from_pw_aff(pwaff.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::from_qpolynomial(qpolynomial qp)
{
  auto res = isl_pw_qpolynomial_from_qpolynomial(qp.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::from_range() const
{
  auto res = isl_pw_qpolynomial_from_range(copy());
  return manage(res);
}

space pw_qpolynomial::get_domain_space() const
{
  auto res = isl_pw_qpolynomial_get_domain_space(get());
  return manage(res);
}

space pw_qpolynomial::get_space() const
{
  auto res = isl_pw_qpolynomial_get_space(get());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::gist(set context) const
{
  auto res = isl_pw_qpolynomial_gist(copy(), context.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::gist_params(set context) const
{
  auto res = isl_pw_qpolynomial_gist_params(copy(), context.release());
  return manage(res);
}

boolean pw_qpolynomial::has_equal_space(const pw_qpolynomial &pwqp2) const
{
  auto res = isl_pw_qpolynomial_has_equal_space(get(), pwqp2.get());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_pw_qpolynomial_insert_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::intersect_domain(set set) const
{
  auto res = isl_pw_qpolynomial_intersect_domain(copy(), set.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::intersect_domain_wrapped_domain(set set) const
{
  auto res = isl_pw_qpolynomial_intersect_domain_wrapped_domain(copy(), set.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::intersect_domain_wrapped_range(set set) const
{
  auto res = isl_pw_qpolynomial_intersect_domain_wrapped_range(copy(), set.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::intersect_params(set set) const
{
  auto res = isl_pw_qpolynomial_intersect_params(copy(), set.release());
  return manage(res);
}

boolean pw_qpolynomial::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_pw_qpolynomial_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean pw_qpolynomial::involves_nan() const
{
  auto res = isl_pw_qpolynomial_involves_nan(get());
  return manage(res);
}

boolean pw_qpolynomial::involves_param_id(const id &id) const
{
  auto res = isl_pw_qpolynomial_involves_param_id(get(), id.get());
  return manage(res);
}

boolean pw_qpolynomial::is_zero() const
{
  auto res = isl_pw_qpolynomial_is_zero(get());
  return manage(res);
}

boolean pw_qpolynomial::isa_qpolynomial() const
{
  auto res = isl_pw_qpolynomial_isa_qpolynomial(get());
  return manage(res);
}

val pw_qpolynomial::max() const
{
  auto res = isl_pw_qpolynomial_max(copy());
  return manage(res);
}

val pw_qpolynomial::min() const
{
  auto res = isl_pw_qpolynomial_min(copy());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_pw_qpolynomial_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::mul(pw_qpolynomial pwqp2) const
{
  auto res = isl_pw_qpolynomial_mul(copy(), pwqp2.release());
  return manage(res);
}

isl_size pw_qpolynomial::n_piece() const
{
  auto res = isl_pw_qpolynomial_n_piece(get());
  return res;
}

pw_qpolynomial pw_qpolynomial::neg() const
{
  auto res = isl_pw_qpolynomial_neg(copy());
  return manage(res);
}

boolean pw_qpolynomial::plain_is_equal(const pw_qpolynomial &pwqp2) const
{
  auto res = isl_pw_qpolynomial_plain_is_equal(get(), pwqp2.get());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::pow(unsigned int exponent) const
{
  auto res = isl_pw_qpolynomial_pow(copy(), exponent);
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::project_domain_on_params() const
{
  auto res = isl_pw_qpolynomial_project_domain_on_params(copy());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::reset_domain_space(space space) const
{
  auto res = isl_pw_qpolynomial_reset_domain_space(copy(), space.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::reset_user() const
{
  auto res = isl_pw_qpolynomial_reset_user(copy());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::scale_down_val(val v) const
{
  auto res = isl_pw_qpolynomial_scale_down_val(copy(), v.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::scale_val(val v) const
{
  auto res = isl_pw_qpolynomial_scale_val(copy(), v.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::split_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_pw_qpolynomial_split_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::split_periods(int max_periods) const
{
  auto res = isl_pw_qpolynomial_split_periods(copy(), max_periods);
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::sub(pw_qpolynomial pwqp2) const
{
  auto res = isl_pw_qpolynomial_sub(copy(), pwqp2.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::subtract_domain(set set) const
{
  auto res = isl_pw_qpolynomial_subtract_domain(copy(), set.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::to_polynomial(int sign) const
{
  auto res = isl_pw_qpolynomial_to_polynomial(copy(), sign);
  return manage(res);
}

pw_qpolynomial pw_qpolynomial::zero(space space)
{
  auto res = isl_pw_qpolynomial_zero(space.release());
  return manage(res);
}

// implementations for isl::pw_qpolynomial_fold_list
pw_qpolynomial_fold_list manage(__isl_take isl_pw_qpolynomial_fold_list *ptr) {
  return pw_qpolynomial_fold_list(ptr);
}
pw_qpolynomial_fold_list manage_copy(__isl_keep isl_pw_qpolynomial_fold_list *ptr) {
  ptr = isl_pw_qpolynomial_fold_list_copy(ptr);
  return pw_qpolynomial_fold_list(ptr);
}

pw_qpolynomial_fold_list::pw_qpolynomial_fold_list()
    : ptr(nullptr) {}

pw_qpolynomial_fold_list::pw_qpolynomial_fold_list(const pw_qpolynomial_fold_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


pw_qpolynomial_fold_list::pw_qpolynomial_fold_list(__isl_take isl_pw_qpolynomial_fold_list *ptr)
    : ptr(ptr) {}


pw_qpolynomial_fold_list &pw_qpolynomial_fold_list::operator=(pw_qpolynomial_fold_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

pw_qpolynomial_fold_list::~pw_qpolynomial_fold_list() {
  if (ptr)
    isl_pw_qpolynomial_fold_list_free(ptr);
}

__isl_give isl_pw_qpolynomial_fold_list *pw_qpolynomial_fold_list::copy() const & {
  return isl_pw_qpolynomial_fold_list_copy(ptr);
}

__isl_keep isl_pw_qpolynomial_fold_list *pw_qpolynomial_fold_list::get() const {
  return ptr;
}

__isl_give isl_pw_qpolynomial_fold_list *pw_qpolynomial_fold_list::release() {
  isl_pw_qpolynomial_fold_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool pw_qpolynomial_fold_list::is_null() const {
  return ptr == nullptr;
}


ctx pw_qpolynomial_fold_list::get_ctx() const {
  return ctx(isl_pw_qpolynomial_fold_list_get_ctx(ptr));
}

void pw_qpolynomial_fold_list::dump() const {
  isl_pw_qpolynomial_fold_list_dump(get());
}



// implementations for isl::pw_qpolynomial_list
pw_qpolynomial_list manage(__isl_take isl_pw_qpolynomial_list *ptr) {
  return pw_qpolynomial_list(ptr);
}
pw_qpolynomial_list manage_copy(__isl_keep isl_pw_qpolynomial_list *ptr) {
  ptr = isl_pw_qpolynomial_list_copy(ptr);
  return pw_qpolynomial_list(ptr);
}

pw_qpolynomial_list::pw_qpolynomial_list()
    : ptr(nullptr) {}

pw_qpolynomial_list::pw_qpolynomial_list(const pw_qpolynomial_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


pw_qpolynomial_list::pw_qpolynomial_list(__isl_take isl_pw_qpolynomial_list *ptr)
    : ptr(ptr) {}


pw_qpolynomial_list &pw_qpolynomial_list::operator=(pw_qpolynomial_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

pw_qpolynomial_list::~pw_qpolynomial_list() {
  if (ptr)
    isl_pw_qpolynomial_list_free(ptr);
}

__isl_give isl_pw_qpolynomial_list *pw_qpolynomial_list::copy() const & {
  return isl_pw_qpolynomial_list_copy(ptr);
}

__isl_keep isl_pw_qpolynomial_list *pw_qpolynomial_list::get() const {
  return ptr;
}

__isl_give isl_pw_qpolynomial_list *pw_qpolynomial_list::release() {
  isl_pw_qpolynomial_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool pw_qpolynomial_list::is_null() const {
  return ptr == nullptr;
}


ctx pw_qpolynomial_list::get_ctx() const {
  return ctx(isl_pw_qpolynomial_list_get_ctx(ptr));
}

void pw_qpolynomial_list::dump() const {
  isl_pw_qpolynomial_list_dump(get());
}


pw_qpolynomial_list pw_qpolynomial_list::add(pw_qpolynomial el) const
{
  auto res = isl_pw_qpolynomial_list_add(copy(), el.release());
  return manage(res);
}

pw_qpolynomial_list pw_qpolynomial_list::alloc(ctx ctx, int n)
{
  auto res = isl_pw_qpolynomial_list_alloc(ctx.release(), n);
  return manage(res);
}

pw_qpolynomial_list pw_qpolynomial_list::clear() const
{
  auto res = isl_pw_qpolynomial_list_clear(copy());
  return manage(res);
}

pw_qpolynomial_list pw_qpolynomial_list::concat(pw_qpolynomial_list list2) const
{
  auto res = isl_pw_qpolynomial_list_concat(copy(), list2.release());
  return manage(res);
}

pw_qpolynomial_list pw_qpolynomial_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_pw_qpolynomial_list_drop(copy(), first, n);
  return manage(res);
}

stat pw_qpolynomial_list::foreach(const std::function<stat(pw_qpolynomial)> &fn) const
{
  struct fn_data {
    const std::function<stat(pw_qpolynomial)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_pw_qpolynomial *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_pw_qpolynomial_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

pw_qpolynomial_list pw_qpolynomial_list::from_pw_qpolynomial(pw_qpolynomial el)
{
  auto res = isl_pw_qpolynomial_list_from_pw_qpolynomial(el.release());
  return manage(res);
}

pw_qpolynomial pw_qpolynomial_list::get_at(int index) const
{
  auto res = isl_pw_qpolynomial_list_get_at(get(), index);
  return manage(res);
}

pw_qpolynomial pw_qpolynomial_list::get_pw_qpolynomial(int index) const
{
  auto res = isl_pw_qpolynomial_list_get_pw_qpolynomial(get(), index);
  return manage(res);
}

pw_qpolynomial_list pw_qpolynomial_list::insert(unsigned int pos, pw_qpolynomial el) const
{
  auto res = isl_pw_qpolynomial_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size pw_qpolynomial_list::n_pw_qpolynomial() const
{
  auto res = isl_pw_qpolynomial_list_n_pw_qpolynomial(get());
  return res;
}

pw_qpolynomial_list pw_qpolynomial_list::reverse() const
{
  auto res = isl_pw_qpolynomial_list_reverse(copy());
  return manage(res);
}

pw_qpolynomial_list pw_qpolynomial_list::set_pw_qpolynomial(int index, pw_qpolynomial el) const
{
  auto res = isl_pw_qpolynomial_list_set_pw_qpolynomial(copy(), index, el.release());
  return manage(res);
}

isl_size pw_qpolynomial_list::size() const
{
  auto res = isl_pw_qpolynomial_list_size(get());
  return res;
}

pw_qpolynomial_list pw_qpolynomial_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_pw_qpolynomial_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::qpolynomial
qpolynomial manage(__isl_take isl_qpolynomial *ptr) {
  return qpolynomial(ptr);
}
qpolynomial manage_copy(__isl_keep isl_qpolynomial *ptr) {
  ptr = isl_qpolynomial_copy(ptr);
  return qpolynomial(ptr);
}

qpolynomial::qpolynomial()
    : ptr(nullptr) {}

qpolynomial::qpolynomial(const qpolynomial &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


qpolynomial::qpolynomial(__isl_take isl_qpolynomial *ptr)
    : ptr(ptr) {}


qpolynomial &qpolynomial::operator=(qpolynomial obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

qpolynomial::~qpolynomial() {
  if (ptr)
    isl_qpolynomial_free(ptr);
}

__isl_give isl_qpolynomial *qpolynomial::copy() const & {
  return isl_qpolynomial_copy(ptr);
}

__isl_keep isl_qpolynomial *qpolynomial::get() const {
  return ptr;
}

__isl_give isl_qpolynomial *qpolynomial::release() {
  isl_qpolynomial *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool qpolynomial::is_null() const {
  return ptr == nullptr;
}


ctx qpolynomial::get_ctx() const {
  return ctx(isl_qpolynomial_get_ctx(ptr));
}

void qpolynomial::dump() const {
  isl_qpolynomial_dump(get());
}


qpolynomial qpolynomial::add(qpolynomial qp2) const
{
  auto res = isl_qpolynomial_add(copy(), qp2.release());
  return manage(res);
}

qpolynomial qpolynomial::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_qpolynomial_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

qpolynomial qpolynomial::align_params(space model) const
{
  auto res = isl_qpolynomial_align_params(copy(), model.release());
  return manage(res);
}

stat qpolynomial::as_polynomial_on_domain(const basic_set &bset, const std::function<stat(basic_set, qpolynomial)> &fn) const
{
  struct fn_data {
    const std::function<stat(basic_set, qpolynomial)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_basic_set *arg_0, isl_qpolynomial *arg_1, void *arg_2) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_2);
    stat ret = (*data->func)(manage(arg_0), manage(arg_1));
    return ret.release();
  };
  auto res = isl_qpolynomial_as_polynomial_on_domain(get(), bset.get(), fn_lambda, &fn_data);
  return manage(res);
}

isl_size qpolynomial::dim(isl::dim type) const
{
  auto res = isl_qpolynomial_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

qpolynomial qpolynomial::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_qpolynomial_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

val qpolynomial::eval(point pnt) const
{
  auto res = isl_qpolynomial_eval(copy(), pnt.release());
  return manage(res);
}

stat qpolynomial::foreach_term(const std::function<stat(term)> &fn) const
{
  struct fn_data {
    const std::function<stat(term)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_term *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_qpolynomial_foreach_term(get(), fn_lambda, &fn_data);
  return manage(res);
}

qpolynomial qpolynomial::from_aff(aff aff)
{
  auto res = isl_qpolynomial_from_aff(aff.release());
  return manage(res);
}

qpolynomial qpolynomial::from_constraint(constraint c, isl::dim type, unsigned int pos)
{
  auto res = isl_qpolynomial_from_constraint(c.release(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

qpolynomial qpolynomial::from_term(term term)
{
  auto res = isl_qpolynomial_from_term(term.release());
  return manage(res);
}

val qpolynomial::get_constant_val() const
{
  auto res = isl_qpolynomial_get_constant_val(get());
  return manage(res);
}

space qpolynomial::get_domain_space() const
{
  auto res = isl_qpolynomial_get_domain_space(get());
  return manage(res);
}

space qpolynomial::get_space() const
{
  auto res = isl_qpolynomial_get_space(get());
  return manage(res);
}

qpolynomial qpolynomial::gist(set context) const
{
  auto res = isl_qpolynomial_gist(copy(), context.release());
  return manage(res);
}

qpolynomial qpolynomial::gist_params(set context) const
{
  auto res = isl_qpolynomial_gist_params(copy(), context.release());
  return manage(res);
}

qpolynomial qpolynomial::homogenize() const
{
  auto res = isl_qpolynomial_homogenize(copy());
  return manage(res);
}

qpolynomial qpolynomial::infty_on_domain(space domain)
{
  auto res = isl_qpolynomial_infty_on_domain(domain.release());
  return manage(res);
}

qpolynomial qpolynomial::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_qpolynomial_insert_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean qpolynomial::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_qpolynomial_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean qpolynomial::is_infty() const
{
  auto res = isl_qpolynomial_is_infty(get());
  return manage(res);
}

boolean qpolynomial::is_nan() const
{
  auto res = isl_qpolynomial_is_nan(get());
  return manage(res);
}

boolean qpolynomial::is_neginfty() const
{
  auto res = isl_qpolynomial_is_neginfty(get());
  return manage(res);
}

boolean qpolynomial::is_zero() const
{
  auto res = isl_qpolynomial_is_zero(get());
  return manage(res);
}

qpolynomial qpolynomial::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_qpolynomial_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

qpolynomial qpolynomial::mul(qpolynomial qp2) const
{
  auto res = isl_qpolynomial_mul(copy(), qp2.release());
  return manage(res);
}

qpolynomial qpolynomial::nan_on_domain(space domain)
{
  auto res = isl_qpolynomial_nan_on_domain(domain.release());
  return manage(res);
}

qpolynomial qpolynomial::neg() const
{
  auto res = isl_qpolynomial_neg(copy());
  return manage(res);
}

qpolynomial qpolynomial::neginfty_on_domain(space domain)
{
  auto res = isl_qpolynomial_neginfty_on_domain(domain.release());
  return manage(res);
}

qpolynomial qpolynomial::one_on_domain(space domain)
{
  auto res = isl_qpolynomial_one_on_domain(domain.release());
  return manage(res);
}

boolean qpolynomial::plain_is_equal(const qpolynomial &qp2) const
{
  auto res = isl_qpolynomial_plain_is_equal(get(), qp2.get());
  return manage(res);
}

qpolynomial qpolynomial::pow(unsigned int power) const
{
  auto res = isl_qpolynomial_pow(copy(), power);
  return manage(res);
}

qpolynomial qpolynomial::project_domain_on_params() const
{
  auto res = isl_qpolynomial_project_domain_on_params(copy());
  return manage(res);
}

qpolynomial qpolynomial::scale_down_val(val v) const
{
  auto res = isl_qpolynomial_scale_down_val(copy(), v.release());
  return manage(res);
}

qpolynomial qpolynomial::scale_val(val v) const
{
  auto res = isl_qpolynomial_scale_val(copy(), v.release());
  return manage(res);
}

int qpolynomial::sgn() const
{
  auto res = isl_qpolynomial_sgn(get());
  return res;
}

qpolynomial qpolynomial::sub(qpolynomial qp2) const
{
  auto res = isl_qpolynomial_sub(copy(), qp2.release());
  return manage(res);
}

qpolynomial qpolynomial::val_on_domain(space space, val val)
{
  auto res = isl_qpolynomial_val_on_domain(space.release(), val.release());
  return manage(res);
}

qpolynomial qpolynomial::var_on_domain(space domain, isl::dim type, unsigned int pos)
{
  auto res = isl_qpolynomial_var_on_domain(domain.release(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

qpolynomial qpolynomial::zero_on_domain(space domain)
{
  auto res = isl_qpolynomial_zero_on_domain(domain.release());
  return manage(res);
}

// implementations for isl::qpolynomial_list
qpolynomial_list manage(__isl_take isl_qpolynomial_list *ptr) {
  return qpolynomial_list(ptr);
}
qpolynomial_list manage_copy(__isl_keep isl_qpolynomial_list *ptr) {
  ptr = isl_qpolynomial_list_copy(ptr);
  return qpolynomial_list(ptr);
}

qpolynomial_list::qpolynomial_list()
    : ptr(nullptr) {}

qpolynomial_list::qpolynomial_list(const qpolynomial_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


qpolynomial_list::qpolynomial_list(__isl_take isl_qpolynomial_list *ptr)
    : ptr(ptr) {}


qpolynomial_list &qpolynomial_list::operator=(qpolynomial_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

qpolynomial_list::~qpolynomial_list() {
  if (ptr)
    isl_qpolynomial_list_free(ptr);
}

__isl_give isl_qpolynomial_list *qpolynomial_list::copy() const & {
  return isl_qpolynomial_list_copy(ptr);
}

__isl_keep isl_qpolynomial_list *qpolynomial_list::get() const {
  return ptr;
}

__isl_give isl_qpolynomial_list *qpolynomial_list::release() {
  isl_qpolynomial_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool qpolynomial_list::is_null() const {
  return ptr == nullptr;
}


ctx qpolynomial_list::get_ctx() const {
  return ctx(isl_qpolynomial_list_get_ctx(ptr));
}

void qpolynomial_list::dump() const {
  isl_qpolynomial_list_dump(get());
}


qpolynomial_list qpolynomial_list::add(qpolynomial el) const
{
  auto res = isl_qpolynomial_list_add(copy(), el.release());
  return manage(res);
}

qpolynomial_list qpolynomial_list::alloc(ctx ctx, int n)
{
  auto res = isl_qpolynomial_list_alloc(ctx.release(), n);
  return manage(res);
}

qpolynomial_list qpolynomial_list::clear() const
{
  auto res = isl_qpolynomial_list_clear(copy());
  return manage(res);
}

qpolynomial_list qpolynomial_list::concat(qpolynomial_list list2) const
{
  auto res = isl_qpolynomial_list_concat(copy(), list2.release());
  return manage(res);
}

qpolynomial_list qpolynomial_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_qpolynomial_list_drop(copy(), first, n);
  return manage(res);
}

stat qpolynomial_list::foreach(const std::function<stat(qpolynomial)> &fn) const
{
  struct fn_data {
    const std::function<stat(qpolynomial)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_qpolynomial *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_qpolynomial_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

qpolynomial_list qpolynomial_list::from_qpolynomial(qpolynomial el)
{
  auto res = isl_qpolynomial_list_from_qpolynomial(el.release());
  return manage(res);
}

qpolynomial qpolynomial_list::get_at(int index) const
{
  auto res = isl_qpolynomial_list_get_at(get(), index);
  return manage(res);
}

qpolynomial qpolynomial_list::get_qpolynomial(int index) const
{
  auto res = isl_qpolynomial_list_get_qpolynomial(get(), index);
  return manage(res);
}

qpolynomial_list qpolynomial_list::insert(unsigned int pos, qpolynomial el) const
{
  auto res = isl_qpolynomial_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size qpolynomial_list::n_qpolynomial() const
{
  auto res = isl_qpolynomial_list_n_qpolynomial(get());
  return res;
}

qpolynomial_list qpolynomial_list::reverse() const
{
  auto res = isl_qpolynomial_list_reverse(copy());
  return manage(res);
}

qpolynomial_list qpolynomial_list::set_qpolynomial(int index, qpolynomial el) const
{
  auto res = isl_qpolynomial_list_set_qpolynomial(copy(), index, el.release());
  return manage(res);
}

isl_size qpolynomial_list::size() const
{
  auto res = isl_qpolynomial_list_size(get());
  return res;
}

qpolynomial_list qpolynomial_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_qpolynomial_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::schedule
schedule manage(__isl_take isl_schedule *ptr) {
  return schedule(ptr);
}
schedule manage_copy(__isl_keep isl_schedule *ptr) {
  ptr = isl_schedule_copy(ptr);
  return schedule(ptr);
}

schedule::schedule()
    : ptr(nullptr) {}

schedule::schedule(const schedule &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


schedule::schedule(__isl_take isl_schedule *ptr)
    : ptr(ptr) {}

schedule::schedule(ctx ctx, const std::string &str)
{
  auto res = isl_schedule_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

schedule &schedule::operator=(schedule obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

schedule::~schedule() {
  if (ptr)
    isl_schedule_free(ptr);
}

__isl_give isl_schedule *schedule::copy() const & {
  return isl_schedule_copy(ptr);
}

__isl_keep isl_schedule *schedule::get() const {
  return ptr;
}

__isl_give isl_schedule *schedule::release() {
  isl_schedule *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool schedule::is_null() const {
  return ptr == nullptr;
}


ctx schedule::get_ctx() const {
  return ctx(isl_schedule_get_ctx(ptr));
}

void schedule::dump() const {
  isl_schedule_dump(get());
}


schedule schedule::align_params(space space) const
{
  auto res = isl_schedule_align_params(copy(), space.release());
  return manage(res);
}

schedule schedule::empty(space space)
{
  auto res = isl_schedule_empty(space.release());
  return manage(res);
}

schedule schedule::from_domain(union_set domain)
{
  auto res = isl_schedule_from_domain(domain.release());
  return manage(res);
}

union_set schedule::get_domain() const
{
  auto res = isl_schedule_get_domain(get());
  return manage(res);
}

union_map schedule::get_map() const
{
  auto res = isl_schedule_get_map(get());
  return manage(res);
}

schedule_node schedule::get_root() const
{
  auto res = isl_schedule_get_root(get());
  return manage(res);
}

schedule schedule::gist_domain_params(set context) const
{
  auto res = isl_schedule_gist_domain_params(copy(), context.release());
  return manage(res);
}

schedule schedule::insert_context(set context) const
{
  auto res = isl_schedule_insert_context(copy(), context.release());
  return manage(res);
}

schedule schedule::insert_guard(set guard) const
{
  auto res = isl_schedule_insert_guard(copy(), guard.release());
  return manage(res);
}

schedule schedule::insert_partial_schedule(multi_union_pw_aff partial) const
{
  auto res = isl_schedule_insert_partial_schedule(copy(), partial.release());
  return manage(res);
}

schedule schedule::intersect_domain(union_set domain) const
{
  auto res = isl_schedule_intersect_domain(copy(), domain.release());
  return manage(res);
}

boolean schedule::plain_is_equal(const schedule &schedule2) const
{
  auto res = isl_schedule_plain_is_equal(get(), schedule2.get());
  return manage(res);
}

schedule schedule::pullback(union_pw_multi_aff upma) const
{
  auto res = isl_schedule_pullback_union_pw_multi_aff(copy(), upma.release());
  return manage(res);
}

schedule schedule::reset_user() const
{
  auto res = isl_schedule_reset_user(copy());
  return manage(res);
}

schedule schedule::sequence(schedule schedule2) const
{
  auto res = isl_schedule_sequence(copy(), schedule2.release());
  return manage(res);
}

// implementations for isl::schedule_constraints
schedule_constraints manage(__isl_take isl_schedule_constraints *ptr) {
  return schedule_constraints(ptr);
}
schedule_constraints manage_copy(__isl_keep isl_schedule_constraints *ptr) {
  ptr = isl_schedule_constraints_copy(ptr);
  return schedule_constraints(ptr);
}

schedule_constraints::schedule_constraints()
    : ptr(nullptr) {}

schedule_constraints::schedule_constraints(const schedule_constraints &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


schedule_constraints::schedule_constraints(__isl_take isl_schedule_constraints *ptr)
    : ptr(ptr) {}

schedule_constraints::schedule_constraints(ctx ctx, const std::string &str)
{
  auto res = isl_schedule_constraints_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

schedule_constraints &schedule_constraints::operator=(schedule_constraints obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

schedule_constraints::~schedule_constraints() {
  if (ptr)
    isl_schedule_constraints_free(ptr);
}

__isl_give isl_schedule_constraints *schedule_constraints::copy() const & {
  return isl_schedule_constraints_copy(ptr);
}

__isl_keep isl_schedule_constraints *schedule_constraints::get() const {
  return ptr;
}

__isl_give isl_schedule_constraints *schedule_constraints::release() {
  isl_schedule_constraints *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool schedule_constraints::is_null() const {
  return ptr == nullptr;
}


ctx schedule_constraints::get_ctx() const {
  return ctx(isl_schedule_constraints_get_ctx(ptr));
}

void schedule_constraints::dump() const {
  isl_schedule_constraints_dump(get());
}


schedule_constraints schedule_constraints::apply(union_map umap) const
{
  auto res = isl_schedule_constraints_apply(copy(), umap.release());
  return manage(res);
}

schedule schedule_constraints::compute_schedule() const
{
  auto res = isl_schedule_constraints_compute_schedule(copy());
  return manage(res);
}

union_map schedule_constraints::get_coincidence() const
{
  auto res = isl_schedule_constraints_get_coincidence(get());
  return manage(res);
}

union_map schedule_constraints::get_conditional_validity() const
{
  auto res = isl_schedule_constraints_get_conditional_validity(get());
  return manage(res);
}

union_map schedule_constraints::get_conditional_validity_condition() const
{
  auto res = isl_schedule_constraints_get_conditional_validity_condition(get());
  return manage(res);
}

set schedule_constraints::get_context() const
{
  auto res = isl_schedule_constraints_get_context(get());
  return manage(res);
}

union_set schedule_constraints::get_domain() const
{
  auto res = isl_schedule_constraints_get_domain(get());
  return manage(res);
}

union_map schedule_constraints::get_proximity() const
{
  auto res = isl_schedule_constraints_get_proximity(get());
  return manage(res);
}

union_map schedule_constraints::get_validity() const
{
  auto res = isl_schedule_constraints_get_validity(get());
  return manage(res);
}

schedule_constraints schedule_constraints::on_domain(union_set domain)
{
  auto res = isl_schedule_constraints_on_domain(domain.release());
  return manage(res);
}

schedule_constraints schedule_constraints::set_coincidence(union_map coincidence) const
{
  auto res = isl_schedule_constraints_set_coincidence(copy(), coincidence.release());
  return manage(res);
}

schedule_constraints schedule_constraints::set_conditional_validity(union_map condition, union_map validity) const
{
  auto res = isl_schedule_constraints_set_conditional_validity(copy(), condition.release(), validity.release());
  return manage(res);
}

schedule_constraints schedule_constraints::set_context(set context) const
{
  auto res = isl_schedule_constraints_set_context(copy(), context.release());
  return manage(res);
}

schedule_constraints schedule_constraints::set_proximity(union_map proximity) const
{
  auto res = isl_schedule_constraints_set_proximity(copy(), proximity.release());
  return manage(res);
}

schedule_constraints schedule_constraints::set_validity(union_map validity) const
{
  auto res = isl_schedule_constraints_set_validity(copy(), validity.release());
  return manage(res);
}

// implementations for isl::schedule_node
schedule_node manage(__isl_take isl_schedule_node *ptr) {
  return schedule_node(ptr);
}
schedule_node manage_copy(__isl_keep isl_schedule_node *ptr) {
  ptr = isl_schedule_node_copy(ptr);
  return schedule_node(ptr);
}

schedule_node::schedule_node()
    : ptr(nullptr) {}

schedule_node::schedule_node(const schedule_node &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


schedule_node::schedule_node(__isl_take isl_schedule_node *ptr)
    : ptr(ptr) {}


schedule_node &schedule_node::operator=(schedule_node obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

schedule_node::~schedule_node() {
  if (ptr)
    isl_schedule_node_free(ptr);
}

__isl_give isl_schedule_node *schedule_node::copy() const & {
  return isl_schedule_node_copy(ptr);
}

__isl_keep isl_schedule_node *schedule_node::get() const {
  return ptr;
}

__isl_give isl_schedule_node *schedule_node::release() {
  isl_schedule_node *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool schedule_node::is_null() const {
  return ptr == nullptr;
}


ctx schedule_node::get_ctx() const {
  return ctx(isl_schedule_node_get_ctx(ptr));
}

void schedule_node::dump() const {
  isl_schedule_node_dump(get());
}


schedule_node schedule_node::align_params(space space) const
{
  auto res = isl_schedule_node_align_params(copy(), space.release());
  return manage(res);
}

schedule_node schedule_node::ancestor(int generation) const
{
  auto res = isl_schedule_node_ancestor(copy(), generation);
  return manage(res);
}

boolean schedule_node::band_member_get_coincident(int pos) const
{
  auto res = isl_schedule_node_band_member_get_coincident(get(), pos);
  return manage(res);
}

schedule_node schedule_node::band_member_set_coincident(int pos, int coincident) const
{
  auto res = isl_schedule_node_band_member_set_coincident(copy(), pos, coincident);
  return manage(res);
}

schedule_node schedule_node::band_set_ast_build_options(union_set options) const
{
  auto res = isl_schedule_node_band_set_ast_build_options(copy(), options.release());
  return manage(res);
}

schedule_node schedule_node::child(int pos) const
{
  auto res = isl_schedule_node_child(copy(), pos);
  return manage(res);
}

set schedule_node::context_get_context() const
{
  auto res = isl_schedule_node_context_get_context(get());
  return manage(res);
}

schedule_node schedule_node::cut() const
{
  auto res = isl_schedule_node_cut(copy());
  return manage(res);
}

union_set schedule_node::domain_get_domain() const
{
  auto res = isl_schedule_node_domain_get_domain(get());
  return manage(res);
}

union_pw_multi_aff schedule_node::expansion_get_contraction() const
{
  auto res = isl_schedule_node_expansion_get_contraction(get());
  return manage(res);
}

union_map schedule_node::expansion_get_expansion() const
{
  auto res = isl_schedule_node_expansion_get_expansion(get());
  return manage(res);
}

union_map schedule_node::extension_get_extension() const
{
  auto res = isl_schedule_node_extension_get_extension(get());
  return manage(res);
}

union_set schedule_node::filter_get_filter() const
{
  auto res = isl_schedule_node_filter_get_filter(get());
  return manage(res);
}

schedule_node schedule_node::first_child() const
{
  auto res = isl_schedule_node_first_child(copy());
  return manage(res);
}

stat schedule_node::foreach_ancestor_top_down(const std::function<stat(schedule_node)> &fn) const
{
  struct fn_data {
    const std::function<stat(schedule_node)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_schedule_node *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage_copy(arg_0));
    return ret.release();
  };
  auto res = isl_schedule_node_foreach_ancestor_top_down(get(), fn_lambda, &fn_data);
  return manage(res);
}

schedule_node schedule_node::from_domain(union_set domain)
{
  auto res = isl_schedule_node_from_domain(domain.release());
  return manage(res);
}

schedule_node schedule_node::from_extension(union_map extension)
{
  auto res = isl_schedule_node_from_extension(extension.release());
  return manage(res);
}

isl_size schedule_node::get_ancestor_child_position(const schedule_node &ancestor) const
{
  auto res = isl_schedule_node_get_ancestor_child_position(get(), ancestor.get());
  return res;
}

schedule_node schedule_node::get_child(int pos) const
{
  auto res = isl_schedule_node_get_child(get(), pos);
  return manage(res);
}

isl_size schedule_node::get_child_position() const
{
  auto res = isl_schedule_node_get_child_position(get());
  return res;
}

union_set schedule_node::get_domain() const
{
  auto res = isl_schedule_node_get_domain(get());
  return manage(res);
}

multi_union_pw_aff schedule_node::get_prefix_schedule_multi_union_pw_aff() const
{
  auto res = isl_schedule_node_get_prefix_schedule_multi_union_pw_aff(get());
  return manage(res);
}

union_map schedule_node::get_prefix_schedule_relation() const
{
  auto res = isl_schedule_node_get_prefix_schedule_relation(get());
  return manage(res);
}

union_map schedule_node::get_prefix_schedule_union_map() const
{
  auto res = isl_schedule_node_get_prefix_schedule_union_map(get());
  return manage(res);
}

union_pw_multi_aff schedule_node::get_prefix_schedule_union_pw_multi_aff() const
{
  auto res = isl_schedule_node_get_prefix_schedule_union_pw_multi_aff(get());
  return manage(res);
}

schedule schedule_node::get_schedule() const
{
  auto res = isl_schedule_node_get_schedule(get());
  return manage(res);
}

isl_size schedule_node::get_schedule_depth() const
{
  auto res = isl_schedule_node_get_schedule_depth(get());
  return res;
}

schedule_node schedule_node::get_shared_ancestor(const schedule_node &node2) const
{
  auto res = isl_schedule_node_get_shared_ancestor(get(), node2.get());
  return manage(res);
}

union_pw_multi_aff schedule_node::get_subtree_contraction() const
{
  auto res = isl_schedule_node_get_subtree_contraction(get());
  return manage(res);
}

union_map schedule_node::get_subtree_expansion() const
{
  auto res = isl_schedule_node_get_subtree_expansion(get());
  return manage(res);
}

union_map schedule_node::get_subtree_schedule_union_map() const
{
  auto res = isl_schedule_node_get_subtree_schedule_union_map(get());
  return manage(res);
}

isl_size schedule_node::get_tree_depth() const
{
  auto res = isl_schedule_node_get_tree_depth(get());
  return res;
}

union_set schedule_node::get_universe_domain() const
{
  auto res = isl_schedule_node_get_universe_domain(get());
  return manage(res);
}

schedule_node schedule_node::graft_after(schedule_node graft) const
{
  auto res = isl_schedule_node_graft_after(copy(), graft.release());
  return manage(res);
}

schedule_node schedule_node::graft_before(schedule_node graft) const
{
  auto res = isl_schedule_node_graft_before(copy(), graft.release());
  return manage(res);
}

schedule_node schedule_node::group(id group_id) const
{
  auto res = isl_schedule_node_group(copy(), group_id.release());
  return manage(res);
}

set schedule_node::guard_get_guard() const
{
  auto res = isl_schedule_node_guard_get_guard(get());
  return manage(res);
}

boolean schedule_node::has_children() const
{
  auto res = isl_schedule_node_has_children(get());
  return manage(res);
}

boolean schedule_node::has_next_sibling() const
{
  auto res = isl_schedule_node_has_next_sibling(get());
  return manage(res);
}

boolean schedule_node::has_parent() const
{
  auto res = isl_schedule_node_has_parent(get());
  return manage(res);
}

boolean schedule_node::has_previous_sibling() const
{
  auto res = isl_schedule_node_has_previous_sibling(get());
  return manage(res);
}

schedule_node schedule_node::insert_context(set context) const
{
  auto res = isl_schedule_node_insert_context(copy(), context.release());
  return manage(res);
}

schedule_node schedule_node::insert_filter(union_set filter) const
{
  auto res = isl_schedule_node_insert_filter(copy(), filter.release());
  return manage(res);
}

schedule_node schedule_node::insert_guard(set context) const
{
  auto res = isl_schedule_node_insert_guard(copy(), context.release());
  return manage(res);
}

schedule_node schedule_node::insert_mark(id mark) const
{
  auto res = isl_schedule_node_insert_mark(copy(), mark.release());
  return manage(res);
}

schedule_node schedule_node::insert_partial_schedule(multi_union_pw_aff schedule) const
{
  auto res = isl_schedule_node_insert_partial_schedule(copy(), schedule.release());
  return manage(res);
}

schedule_node schedule_node::insert_sequence(union_set_list filters) const
{
  auto res = isl_schedule_node_insert_sequence(copy(), filters.release());
  return manage(res);
}

schedule_node schedule_node::insert_set(union_set_list filters) const
{
  auto res = isl_schedule_node_insert_set(copy(), filters.release());
  return manage(res);
}

boolean schedule_node::is_equal(const schedule_node &node2) const
{
  auto res = isl_schedule_node_is_equal(get(), node2.get());
  return manage(res);
}

boolean schedule_node::is_subtree_anchored() const
{
  auto res = isl_schedule_node_is_subtree_anchored(get());
  return manage(res);
}

id schedule_node::mark_get_id() const
{
  auto res = isl_schedule_node_mark_get_id(get());
  return manage(res);
}

isl_size schedule_node::n_children() const
{
  auto res = isl_schedule_node_n_children(get());
  return res;
}

schedule_node schedule_node::next_sibling() const
{
  auto res = isl_schedule_node_next_sibling(copy());
  return manage(res);
}

schedule_node schedule_node::order_after(union_set filter) const
{
  auto res = isl_schedule_node_order_after(copy(), filter.release());
  return manage(res);
}

schedule_node schedule_node::order_before(union_set filter) const
{
  auto res = isl_schedule_node_order_before(copy(), filter.release());
  return manage(res);
}

schedule_node schedule_node::parent() const
{
  auto res = isl_schedule_node_parent(copy());
  return manage(res);
}

schedule_node schedule_node::previous_sibling() const
{
  auto res = isl_schedule_node_previous_sibling(copy());
  return manage(res);
}

schedule_node schedule_node::reset_user() const
{
  auto res = isl_schedule_node_reset_user(copy());
  return manage(res);
}

schedule_node schedule_node::root() const
{
  auto res = isl_schedule_node_root(copy());
  return manage(res);
}

schedule_node schedule_node::sequence_splice_child(int pos) const
{
  auto res = isl_schedule_node_sequence_splice_child(copy(), pos);
  return manage(res);
}

// implementations for isl::set
set manage(__isl_take isl_set *ptr) {
  return set(ptr);
}
set manage_copy(__isl_keep isl_set *ptr) {
  ptr = isl_set_copy(ptr);
  return set(ptr);
}

set::set()
    : ptr(nullptr) {}

set::set(const set &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


set::set(__isl_take isl_set *ptr)
    : ptr(ptr) {}

set::set(basic_set bset)
{
  auto res = isl_set_from_basic_set(bset.release());
  ptr = res;
}
set::set(point pnt)
{
  auto res = isl_set_from_point(pnt.release());
  ptr = res;
}
set::set(union_set uset)
{
  auto res = isl_set_from_union_set(uset.release());
  ptr = res;
}
set::set(ctx ctx, const std::string &str)
{
  auto res = isl_set_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

set &set::operator=(set obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

set::~set() {
  if (ptr)
    isl_set_free(ptr);
}

__isl_give isl_set *set::copy() const & {
  return isl_set_copy(ptr);
}

__isl_keep isl_set *set::get() const {
  return ptr;
}

__isl_give isl_set *set::release() {
  isl_set *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool set::is_null() const {
  return ptr == nullptr;
}


ctx set::get_ctx() const {
  return ctx(isl_set_get_ctx(ptr));
}

void set::dump() const {
  isl_set_dump(get());
}


set set::add_constraint(constraint constraint) const
{
  auto res = isl_set_add_constraint(copy(), constraint.release());
  return manage(res);
}

set set::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_set_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

basic_set set::affine_hull() const
{
  auto res = isl_set_affine_hull(copy());
  return manage(res);
}

set set::align_params(space model) const
{
  auto res = isl_set_align_params(copy(), model.release());
  return manage(res);
}

set set::apply(map map) const
{
  auto res = isl_set_apply(copy(), map.release());
  return manage(res);
}

set set::bind(multi_id tuple) const
{
  auto res = isl_set_bind(copy(), tuple.release());
  return manage(res);
}

basic_set set::bounded_simple_hull() const
{
  auto res = isl_set_bounded_simple_hull(copy());
  return manage(res);
}

set set::box_from_points(point pnt1, point pnt2)
{
  auto res = isl_set_box_from_points(pnt1.release(), pnt2.release());
  return manage(res);
}

set set::coalesce() const
{
  auto res = isl_set_coalesce(copy());
  return manage(res);
}

basic_set set::coefficients() const
{
  auto res = isl_set_coefficients(copy());
  return manage(res);
}

set set::complement() const
{
  auto res = isl_set_complement(copy());
  return manage(res);
}

basic_set set::convex_hull() const
{
  auto res = isl_set_convex_hull(copy());
  return manage(res);
}

val set::count_val() const
{
  auto res = isl_set_count_val(get());
  return manage(res);
}

set set::detect_equalities() const
{
  auto res = isl_set_detect_equalities(copy());
  return manage(res);
}

isl_size set::dim(isl::dim type) const
{
  auto res = isl_set_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

boolean set::dim_has_any_lower_bound(isl::dim type, unsigned int pos) const
{
  auto res = isl_set_dim_has_any_lower_bound(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean set::dim_has_any_upper_bound(isl::dim type, unsigned int pos) const
{
  auto res = isl_set_dim_has_any_upper_bound(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean set::dim_has_lower_bound(isl::dim type, unsigned int pos) const
{
  auto res = isl_set_dim_has_lower_bound(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean set::dim_has_upper_bound(isl::dim type, unsigned int pos) const
{
  auto res = isl_set_dim_has_upper_bound(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean set::dim_is_bounded(isl::dim type, unsigned int pos) const
{
  auto res = isl_set_dim_is_bounded(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

pw_aff set::dim_max(int pos) const
{
  auto res = isl_set_dim_max(copy(), pos);
  return manage(res);
}

val set::dim_max_val(int pos) const
{
  auto res = isl_set_dim_max_val(copy(), pos);
  return manage(res);
}

pw_aff set::dim_min(int pos) const
{
  auto res = isl_set_dim_min(copy(), pos);
  return manage(res);
}

val set::dim_min_val(int pos) const
{
  auto res = isl_set_dim_min_val(copy(), pos);
  return manage(res);
}

set set::drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_set_drop_constraints_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

set set::drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_set_drop_constraints_not_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

set set::drop_unused_params() const
{
  auto res = isl_set_drop_unused_params(copy());
  return manage(res);
}

set set::eliminate(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_set_eliminate(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

set set::empty(space space)
{
  auto res = isl_set_empty(space.release());
  return manage(res);
}

set set::equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const
{
  auto res = isl_set_equate(copy(), static_cast<enum isl_dim_type>(type1), pos1, static_cast<enum isl_dim_type>(type2), pos2);
  return manage(res);
}

int set::find_dim_by_id(isl::dim type, const id &id) const
{
  auto res = isl_set_find_dim_by_id(get(), static_cast<enum isl_dim_type>(type), id.get());
  return res;
}

int set::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_set_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

set set::fix_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_set_fix_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

set set::fix_val(isl::dim type, unsigned int pos, val v) const
{
  auto res = isl_set_fix_val(copy(), static_cast<enum isl_dim_type>(type), pos, v.release());
  return manage(res);
}

set set::flat_product(set set2) const
{
  auto res = isl_set_flat_product(copy(), set2.release());
  return manage(res);
}

set set::flatten() const
{
  auto res = isl_set_flatten(copy());
  return manage(res);
}

map set::flatten_map() const
{
  auto res = isl_set_flatten_map(copy());
  return manage(res);
}

int set::follows_at(const set &set2, int pos) const
{
  auto res = isl_set_follows_at(get(), set2.get(), pos);
  return res;
}

stat set::foreach_basic_set(const std::function<stat(basic_set)> &fn) const
{
  struct fn_data {
    const std::function<stat(basic_set)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_basic_set *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_set_foreach_basic_set(get(), fn_lambda, &fn_data);
  return manage(res);
}

stat set::foreach_point(const std::function<stat(point)> &fn) const
{
  struct fn_data {
    const std::function<stat(point)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_point *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_set_foreach_point(get(), fn_lambda, &fn_data);
  return manage(res);
}

set set::from_multi_aff(multi_aff ma)
{
  auto res = isl_set_from_multi_aff(ma.release());
  return manage(res);
}

set set::from_multi_pw_aff(multi_pw_aff mpa)
{
  auto res = isl_set_from_multi_pw_aff(mpa.release());
  return manage(res);
}

set set::from_params() const
{
  auto res = isl_set_from_params(copy());
  return manage(res);
}

set set::from_pw_aff(pw_aff pwaff)
{
  auto res = isl_set_from_pw_aff(pwaff.release());
  return manage(res);
}

set set::from_pw_multi_aff(pw_multi_aff pma)
{
  auto res = isl_set_from_pw_multi_aff(pma.release());
  return manage(res);
}

basic_set_list set::get_basic_set_list() const
{
  auto res = isl_set_get_basic_set_list(get());
  return manage(res);
}

id set::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_set_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

std::string set::get_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_set_get_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  std::string tmp(res);
  return tmp;
}

multi_val set::get_plain_multi_val_if_fixed() const
{
  auto res = isl_set_get_plain_multi_val_if_fixed(get());
  return manage(res);
}

fixed_box set::get_simple_fixed_box_hull() const
{
  auto res = isl_set_get_simple_fixed_box_hull(get());
  return manage(res);
}

space set::get_space() const
{
  auto res = isl_set_get_space(get());
  return manage(res);
}

val set::get_stride(int pos) const
{
  auto res = isl_set_get_stride(get(), pos);
  return manage(res);
}

id set::get_tuple_id() const
{
  auto res = isl_set_get_tuple_id(get());
  return manage(res);
}

std::string set::get_tuple_name() const
{
  auto res = isl_set_get_tuple_name(get());
  std::string tmp(res);
  return tmp;
}

set set::gist(set context) const
{
  auto res = isl_set_gist(copy(), context.release());
  return manage(res);
}

set set::gist_basic_set(basic_set context) const
{
  auto res = isl_set_gist_basic_set(copy(), context.release());
  return manage(res);
}

set set::gist_params(set context) const
{
  auto res = isl_set_gist_params(copy(), context.release());
  return manage(res);
}

boolean set::has_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_set_has_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean set::has_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_set_has_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean set::has_equal_space(const set &set2) const
{
  auto res = isl_set_has_equal_space(get(), set2.get());
  return manage(res);
}

boolean set::has_tuple_id() const
{
  auto res = isl_set_has_tuple_id(get());
  return manage(res);
}

boolean set::has_tuple_name() const
{
  auto res = isl_set_has_tuple_name(get());
  return manage(res);
}

map set::identity() const
{
  auto res = isl_set_identity(copy());
  return manage(res);
}

pw_aff set::indicator_function() const
{
  auto res = isl_set_indicator_function(copy());
  return manage(res);
}

set set::insert_dims(isl::dim type, unsigned int pos, unsigned int n) const
{
  auto res = isl_set_insert_dims(copy(), static_cast<enum isl_dim_type>(type), pos, n);
  return manage(res);
}

map set::insert_domain(space domain) const
{
  auto res = isl_set_insert_domain(copy(), domain.release());
  return manage(res);
}

set set::intersect(set set2) const
{
  auto res = isl_set_intersect(copy(), set2.release());
  return manage(res);
}

set set::intersect_factor_domain(set domain) const
{
  auto res = isl_set_intersect_factor_domain(copy(), domain.release());
  return manage(res);
}

set set::intersect_factor_range(set range) const
{
  auto res = isl_set_intersect_factor_range(copy(), range.release());
  return manage(res);
}

set set::intersect_params(set params) const
{
  auto res = isl_set_intersect_params(copy(), params.release());
  return manage(res);
}

boolean set::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_set_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean set::involves_locals() const
{
  auto res = isl_set_involves_locals(get());
  return manage(res);
}

boolean set::is_bounded() const
{
  auto res = isl_set_is_bounded(get());
  return manage(res);
}

boolean set::is_box() const
{
  auto res = isl_set_is_box(get());
  return manage(res);
}

boolean set::is_disjoint(const set &set2) const
{
  auto res = isl_set_is_disjoint(get(), set2.get());
  return manage(res);
}

boolean set::is_empty() const
{
  auto res = isl_set_is_empty(get());
  return manage(res);
}

boolean set::is_equal(const set &set2) const
{
  auto res = isl_set_is_equal(get(), set2.get());
  return manage(res);
}

boolean set::is_params() const
{
  auto res = isl_set_is_params(get());
  return manage(res);
}

boolean set::is_singleton() const
{
  auto res = isl_set_is_singleton(get());
  return manage(res);
}

boolean set::is_strict_subset(const set &set2) const
{
  auto res = isl_set_is_strict_subset(get(), set2.get());
  return manage(res);
}

boolean set::is_subset(const set &set2) const
{
  auto res = isl_set_is_subset(get(), set2.get());
  return manage(res);
}

boolean set::is_wrapping() const
{
  auto res = isl_set_is_wrapping(get());
  return manage(res);
}

map set::lex_ge_set(set set2) const
{
  auto res = isl_set_lex_ge_set(copy(), set2.release());
  return manage(res);
}

map set::lex_gt_set(set set2) const
{
  auto res = isl_set_lex_gt_set(copy(), set2.release());
  return manage(res);
}

map set::lex_le_set(set set2) const
{
  auto res = isl_set_lex_le_set(copy(), set2.release());
  return manage(res);
}

map set::lex_lt_set(set set2) const
{
  auto res = isl_set_lex_lt_set(copy(), set2.release());
  return manage(res);
}

set set::lexmax() const
{
  auto res = isl_set_lexmax(copy());
  return manage(res);
}

pw_multi_aff set::lexmax_pw_multi_aff() const
{
  auto res = isl_set_lexmax_pw_multi_aff(copy());
  return manage(res);
}

set set::lexmin() const
{
  auto res = isl_set_lexmin(copy());
  return manage(res);
}

pw_multi_aff set::lexmin_pw_multi_aff() const
{
  auto res = isl_set_lexmin_pw_multi_aff(copy());
  return manage(res);
}

set set::lower_bound(multi_pw_aff lower) const
{
  auto res = isl_set_lower_bound_multi_pw_aff(copy(), lower.release());
  return manage(res);
}

set set::lower_bound(multi_val lower) const
{
  auto res = isl_set_lower_bound_multi_val(copy(), lower.release());
  return manage(res);
}

set set::lower_bound_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_set_lower_bound_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

set set::lower_bound_val(isl::dim type, unsigned int pos, val value) const
{
  auto res = isl_set_lower_bound_val(copy(), static_cast<enum isl_dim_type>(type), pos, value.release());
  return manage(res);
}

multi_pw_aff set::max_multi_pw_aff() const
{
  auto res = isl_set_max_multi_pw_aff(copy());
  return manage(res);
}

val set::max_val(const aff &obj) const
{
  auto res = isl_set_max_val(get(), obj.get());
  return manage(res);
}

multi_pw_aff set::min_multi_pw_aff() const
{
  auto res = isl_set_min_multi_pw_aff(copy());
  return manage(res);
}

val set::min_val(const aff &obj) const
{
  auto res = isl_set_min_val(get(), obj.get());
  return manage(res);
}

set set::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_set_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

isl_size set::n_basic_set() const
{
  auto res = isl_set_n_basic_set(get());
  return res;
}

isl_size set::n_dim() const
{
  auto res = isl_set_n_dim(get());
  return res;
}

set set::nat_universe(space space)
{
  auto res = isl_set_nat_universe(space.release());
  return manage(res);
}

set set::neg() const
{
  auto res = isl_set_neg(copy());
  return manage(res);
}

set set::params() const
{
  auto res = isl_set_params(copy());
  return manage(res);
}

int set::plain_cmp(const set &set2) const
{
  auto res = isl_set_plain_cmp(get(), set2.get());
  return res;
}

val set::plain_get_val_if_fixed(isl::dim type, unsigned int pos) const
{
  auto res = isl_set_plain_get_val_if_fixed(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean set::plain_is_disjoint(const set &set2) const
{
  auto res = isl_set_plain_is_disjoint(get(), set2.get());
  return manage(res);
}

boolean set::plain_is_empty() const
{
  auto res = isl_set_plain_is_empty(get());
  return manage(res);
}

boolean set::plain_is_equal(const set &set2) const
{
  auto res = isl_set_plain_is_equal(get(), set2.get());
  return manage(res);
}

boolean set::plain_is_universe() const
{
  auto res = isl_set_plain_is_universe(get());
  return manage(res);
}

basic_set set::plain_unshifted_simple_hull() const
{
  auto res = isl_set_plain_unshifted_simple_hull(copy());
  return manage(res);
}

basic_set set::polyhedral_hull() const
{
  auto res = isl_set_polyhedral_hull(copy());
  return manage(res);
}

set set::preimage(multi_aff ma) const
{
  auto res = isl_set_preimage_multi_aff(copy(), ma.release());
  return manage(res);
}

set set::preimage(multi_pw_aff mpa) const
{
  auto res = isl_set_preimage_multi_pw_aff(copy(), mpa.release());
  return manage(res);
}

set set::preimage(pw_multi_aff pma) const
{
  auto res = isl_set_preimage_pw_multi_aff(copy(), pma.release());
  return manage(res);
}

set set::product(set set2) const
{
  auto res = isl_set_product(copy(), set2.release());
  return manage(res);
}

map set::project_onto_map(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_set_project_onto_map(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

set set::project_out(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_set_project_out(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

set set::project_out_all_params() const
{
  auto res = isl_set_project_out_all_params(copy());
  return manage(res);
}

set set::project_out_param(id id) const
{
  auto res = isl_set_project_out_param_id(copy(), id.release());
  return manage(res);
}

set set::project_out_param(id_list list) const
{
  auto res = isl_set_project_out_param_id_list(copy(), list.release());
  return manage(res);
}

set set::remove_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_set_remove_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

set set::remove_divs() const
{
  auto res = isl_set_remove_divs(copy());
  return manage(res);
}

set set::remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_set_remove_divs_involving_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

set set::remove_redundancies() const
{
  auto res = isl_set_remove_redundancies(copy());
  return manage(res);
}

set set::remove_unknown_divs() const
{
  auto res = isl_set_remove_unknown_divs(copy());
  return manage(res);
}

set set::reset_space(space space) const
{
  auto res = isl_set_reset_space(copy(), space.release());
  return manage(res);
}

set set::reset_tuple_id() const
{
  auto res = isl_set_reset_tuple_id(copy());
  return manage(res);
}

set set::reset_user() const
{
  auto res = isl_set_reset_user(copy());
  return manage(res);
}

basic_set set::sample() const
{
  auto res = isl_set_sample(copy());
  return manage(res);
}

point set::sample_point() const
{
  auto res = isl_set_sample_point(copy());
  return manage(res);
}

set set::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_set_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

set set::set_tuple_id(id id) const
{
  auto res = isl_set_set_tuple_id(copy(), id.release());
  return manage(res);
}

set set::set_tuple_name(const std::string &s) const
{
  auto res = isl_set_set_tuple_name(copy(), s.c_str());
  return manage(res);
}

basic_set set::simple_hull() const
{
  auto res = isl_set_simple_hull(copy());
  return manage(res);
}

int set::size() const
{
  auto res = isl_set_size(get());
  return res;
}

basic_set set::solutions() const
{
  auto res = isl_set_solutions(copy());
  return manage(res);
}

set set::split_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_set_split_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

set set::subtract(set set2) const
{
  auto res = isl_set_subtract(copy(), set2.release());
  return manage(res);
}

set set::sum(set set2) const
{
  auto res = isl_set_sum(copy(), set2.release());
  return manage(res);
}

map set::translation() const
{
  auto res = isl_set_translation(copy());
  return manage(res);
}

isl_size set::tuple_dim() const
{
  auto res = isl_set_tuple_dim(get());
  return res;
}

set set::unbind_params(multi_id tuple) const
{
  auto res = isl_set_unbind_params(copy(), tuple.release());
  return manage(res);
}

map set::unbind_params_insert_domain(multi_id domain) const
{
  auto res = isl_set_unbind_params_insert_domain(copy(), domain.release());
  return manage(res);
}

set set::unite(set set2) const
{
  auto res = isl_set_union(copy(), set2.release());
  return manage(res);
}

set set::universe(space space)
{
  auto res = isl_set_universe(space.release());
  return manage(res);
}

basic_set set::unshifted_simple_hull() const
{
  auto res = isl_set_unshifted_simple_hull(copy());
  return manage(res);
}

basic_set set::unshifted_simple_hull_from_set_list(set_list list) const
{
  auto res = isl_set_unshifted_simple_hull_from_set_list(copy(), list.release());
  return manage(res);
}

map set::unwrap() const
{
  auto res = isl_set_unwrap(copy());
  return manage(res);
}

set set::upper_bound(multi_pw_aff upper) const
{
  auto res = isl_set_upper_bound_multi_pw_aff(copy(), upper.release());
  return manage(res);
}

set set::upper_bound(multi_val upper) const
{
  auto res = isl_set_upper_bound_multi_val(copy(), upper.release());
  return manage(res);
}

set set::upper_bound_si(isl::dim type, unsigned int pos, int value) const
{
  auto res = isl_set_upper_bound_si(copy(), static_cast<enum isl_dim_type>(type), pos, value);
  return manage(res);
}

set set::upper_bound_val(isl::dim type, unsigned int pos, val value) const
{
  auto res = isl_set_upper_bound_val(copy(), static_cast<enum isl_dim_type>(type), pos, value.release());
  return manage(res);
}

map set::wrapped_domain_map() const
{
  auto res = isl_set_wrapped_domain_map(copy());
  return manage(res);
}

// implementations for isl::set_list
set_list manage(__isl_take isl_set_list *ptr) {
  return set_list(ptr);
}
set_list manage_copy(__isl_keep isl_set_list *ptr) {
  ptr = isl_set_list_copy(ptr);
  return set_list(ptr);
}

set_list::set_list()
    : ptr(nullptr) {}

set_list::set_list(const set_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


set_list::set_list(__isl_take isl_set_list *ptr)
    : ptr(ptr) {}


set_list &set_list::operator=(set_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

set_list::~set_list() {
  if (ptr)
    isl_set_list_free(ptr);
}

__isl_give isl_set_list *set_list::copy() const & {
  return isl_set_list_copy(ptr);
}

__isl_keep isl_set_list *set_list::get() const {
  return ptr;
}

__isl_give isl_set_list *set_list::release() {
  isl_set_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool set_list::is_null() const {
  return ptr == nullptr;
}


ctx set_list::get_ctx() const {
  return ctx(isl_set_list_get_ctx(ptr));
}

void set_list::dump() const {
  isl_set_list_dump(get());
}


set_list set_list::add(set el) const
{
  auto res = isl_set_list_add(copy(), el.release());
  return manage(res);
}

set_list set_list::alloc(ctx ctx, int n)
{
  auto res = isl_set_list_alloc(ctx.release(), n);
  return manage(res);
}

set_list set_list::clear() const
{
  auto res = isl_set_list_clear(copy());
  return manage(res);
}

set_list set_list::concat(set_list list2) const
{
  auto res = isl_set_list_concat(copy(), list2.release());
  return manage(res);
}

set_list set_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_set_list_drop(copy(), first, n);
  return manage(res);
}

stat set_list::foreach(const std::function<stat(set)> &fn) const
{
  struct fn_data {
    const std::function<stat(set)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_set *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_set_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

set_list set_list::from_set(set el)
{
  auto res = isl_set_list_from_set(el.release());
  return manage(res);
}

set set_list::get_at(int index) const
{
  auto res = isl_set_list_get_at(get(), index);
  return manage(res);
}

set set_list::get_set(int index) const
{
  auto res = isl_set_list_get_set(get(), index);
  return manage(res);
}

set_list set_list::insert(unsigned int pos, set el) const
{
  auto res = isl_set_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size set_list::n_set() const
{
  auto res = isl_set_list_n_set(get());
  return res;
}

set_list set_list::reverse() const
{
  auto res = isl_set_list_reverse(copy());
  return manage(res);
}

set_list set_list::set_set(int index, set el) const
{
  auto res = isl_set_list_set_set(copy(), index, el.release());
  return manage(res);
}

isl_size set_list::size() const
{
  auto res = isl_set_list_size(get());
  return res;
}

set_list set_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_set_list_swap(copy(), pos1, pos2);
  return manage(res);
}

set set_list::unite() const
{
  auto res = isl_set_list_union(copy());
  return manage(res);
}

// implementations for isl::space
space manage(__isl_take isl_space *ptr) {
  return space(ptr);
}
space manage_copy(__isl_keep isl_space *ptr) {
  ptr = isl_space_copy(ptr);
  return space(ptr);
}

space::space()
    : ptr(nullptr) {}

space::space(const space &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


space::space(__isl_take isl_space *ptr)
    : ptr(ptr) {}

space::space(ctx ctx, unsigned int nparam, unsigned int n_in, unsigned int n_out)
{
  auto res = isl_space_alloc(ctx.release(), nparam, n_in, n_out);
  ptr = res;
}
space::space(ctx ctx, unsigned int nparam, unsigned int dim)
{
  auto res = isl_space_set_alloc(ctx.release(), nparam, dim);
  ptr = res;
}

space &space::operator=(space obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

space::~space() {
  if (ptr)
    isl_space_free(ptr);
}

__isl_give isl_space *space::copy() const & {
  return isl_space_copy(ptr);
}

__isl_keep isl_space *space::get() const {
  return ptr;
}

__isl_give isl_space *space::release() {
  isl_space *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool space::is_null() const {
  return ptr == nullptr;
}


ctx space::get_ctx() const {
  return ctx(isl_space_get_ctx(ptr));
}

void space::dump() const {
  isl_space_dump(get());
}


space space::add_dims(isl::dim type, unsigned int n) const
{
  auto res = isl_space_add_dims(copy(), static_cast<enum isl_dim_type>(type), n);
  return manage(res);
}

space space::add_named_tuple(id tuple_id, unsigned int dim) const
{
  auto res = isl_space_add_named_tuple_id_ui(copy(), tuple_id.release(), dim);
  return manage(res);
}

space space::add_param_id(id id) const
{
  auto res = isl_space_add_param_id(copy(), id.release());
  return manage(res);
}

space space::add_unnamed_tuple(unsigned int dim) const
{
  auto res = isl_space_add_unnamed_tuple_ui(copy(), dim);
  return manage(res);
}

space space::align_params(space space2) const
{
  auto res = isl_space_align_params(copy(), space2.release());
  return manage(res);
}

boolean space::can_curry() const
{
  auto res = isl_space_can_curry(get());
  return manage(res);
}

boolean space::can_range_curry() const
{
  auto res = isl_space_can_range_curry(get());
  return manage(res);
}

boolean space::can_uncurry() const
{
  auto res = isl_space_can_uncurry(get());
  return manage(res);
}

boolean space::can_zip() const
{
  auto res = isl_space_can_zip(get());
  return manage(res);
}

space space::curry() const
{
  auto res = isl_space_curry(copy());
  return manage(res);
}

isl_size space::dim(isl::dim type) const
{
  auto res = isl_space_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

space space::domain() const
{
  auto res = isl_space_domain(copy());
  return manage(res);
}

space space::domain_factor_domain() const
{
  auto res = isl_space_domain_factor_domain(copy());
  return manage(res);
}

space space::domain_factor_range() const
{
  auto res = isl_space_domain_factor_range(copy());
  return manage(res);
}

boolean space::domain_is_wrapping() const
{
  auto res = isl_space_domain_is_wrapping(get());
  return manage(res);
}

space space::domain_map() const
{
  auto res = isl_space_domain_map(copy());
  return manage(res);
}

space space::domain_product(space right) const
{
  auto res = isl_space_domain_product(copy(), right.release());
  return manage(res);
}

space space::drop_all_params() const
{
  auto res = isl_space_drop_all_params(copy());
  return manage(res);
}

space space::drop_dims(isl::dim type, unsigned int first, unsigned int num) const
{
  auto res = isl_space_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, num);
  return manage(res);
}

space space::factor_domain() const
{
  auto res = isl_space_factor_domain(copy());
  return manage(res);
}

space space::factor_range() const
{
  auto res = isl_space_factor_range(copy());
  return manage(res);
}

int space::find_dim_by_id(isl::dim type, const id &id) const
{
  auto res = isl_space_find_dim_by_id(get(), static_cast<enum isl_dim_type>(type), id.get());
  return res;
}

int space::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_space_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

space space::flatten_domain() const
{
  auto res = isl_space_flatten_domain(copy());
  return manage(res);
}

space space::flatten_range() const
{
  auto res = isl_space_flatten_range(copy());
  return manage(res);
}

space space::from_domain() const
{
  auto res = isl_space_from_domain(copy());
  return manage(res);
}

space space::from_range() const
{
  auto res = isl_space_from_range(copy());
  return manage(res);
}

id space::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_space_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

std::string space::get_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_space_get_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  std::string tmp(res);
  return tmp;
}

id space::get_tuple_id(isl::dim type) const
{
  auto res = isl_space_get_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

std::string space::get_tuple_name(isl::dim type) const
{
  auto res = isl_space_get_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  std::string tmp(res);
  return tmp;
}

boolean space::has_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_space_has_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean space::has_dim_name(isl::dim type, unsigned int pos) const
{
  auto res = isl_space_has_dim_name(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

boolean space::has_equal_params(const space &space2) const
{
  auto res = isl_space_has_equal_params(get(), space2.get());
  return manage(res);
}

boolean space::has_equal_tuples(const space &space2) const
{
  auto res = isl_space_has_equal_tuples(get(), space2.get());
  return manage(res);
}

boolean space::has_tuple_id(isl::dim type) const
{
  auto res = isl_space_has_tuple_id(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

boolean space::has_tuple_name(isl::dim type) const
{
  auto res = isl_space_has_tuple_name(get(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

space space::insert_dims(isl::dim type, unsigned int pos, unsigned int n) const
{
  auto res = isl_space_insert_dims(copy(), static_cast<enum isl_dim_type>(type), pos, n);
  return manage(res);
}

boolean space::is_domain(const space &space2) const
{
  auto res = isl_space_is_domain(get(), space2.get());
  return manage(res);
}

boolean space::is_equal(const space &space2) const
{
  auto res = isl_space_is_equal(get(), space2.get());
  return manage(res);
}

boolean space::is_map() const
{
  auto res = isl_space_is_map(get());
  return manage(res);
}

boolean space::is_params() const
{
  auto res = isl_space_is_params(get());
  return manage(res);
}

boolean space::is_product() const
{
  auto res = isl_space_is_product(get());
  return manage(res);
}

boolean space::is_range(const space &space2) const
{
  auto res = isl_space_is_range(get(), space2.get());
  return manage(res);
}

boolean space::is_set() const
{
  auto res = isl_space_is_set(get());
  return manage(res);
}

boolean space::is_wrapping() const
{
  auto res = isl_space_is_wrapping(get());
  return manage(res);
}

space space::join(space right) const
{
  auto res = isl_space_join(copy(), right.release());
  return manage(res);
}

space space::map_from_domain_and_range(space range) const
{
  auto res = isl_space_map_from_domain_and_range(copy(), range.release());
  return manage(res);
}

space space::map_from_set() const
{
  auto res = isl_space_map_from_set(copy());
  return manage(res);
}

space space::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
{
  auto res = isl_space_move_dims(copy(), static_cast<enum isl_dim_type>(dst_type), dst_pos, static_cast<enum isl_dim_type>(src_type), src_pos, n);
  return manage(res);
}

space space::params() const
{
  auto res = isl_space_params(copy());
  return manage(res);
}

space space::params_alloc(ctx ctx, unsigned int nparam)
{
  auto res = isl_space_params_alloc(ctx.release(), nparam);
  return manage(res);
}

space space::product(space right) const
{
  auto res = isl_space_product(copy(), right.release());
  return manage(res);
}

space space::range() const
{
  auto res = isl_space_range(copy());
  return manage(res);
}

space space::range_curry() const
{
  auto res = isl_space_range_curry(copy());
  return manage(res);
}

space space::range_factor_domain() const
{
  auto res = isl_space_range_factor_domain(copy());
  return manage(res);
}

space space::range_factor_range() const
{
  auto res = isl_space_range_factor_range(copy());
  return manage(res);
}

boolean space::range_is_wrapping() const
{
  auto res = isl_space_range_is_wrapping(get());
  return manage(res);
}

space space::range_map() const
{
  auto res = isl_space_range_map(copy());
  return manage(res);
}

space space::range_product(space right) const
{
  auto res = isl_space_range_product(copy(), right.release());
  return manage(res);
}

space space::range_reverse() const
{
  auto res = isl_space_range_reverse(copy());
  return manage(res);
}

space space::reset_tuple_id(isl::dim type) const
{
  auto res = isl_space_reset_tuple_id(copy(), static_cast<enum isl_dim_type>(type));
  return manage(res);
}

space space::reset_user() const
{
  auto res = isl_space_reset_user(copy());
  return manage(res);
}

space space::reverse() const
{
  auto res = isl_space_reverse(copy());
  return manage(res);
}

space space::set_dim_id(isl::dim type, unsigned int pos, id id) const
{
  auto res = isl_space_set_dim_id(copy(), static_cast<enum isl_dim_type>(type), pos, id.release());
  return manage(res);
}

space space::set_from_params() const
{
  auto res = isl_space_set_from_params(copy());
  return manage(res);
}

space space::set_tuple_id(isl::dim type, id id) const
{
  auto res = isl_space_set_tuple_id(copy(), static_cast<enum isl_dim_type>(type), id.release());
  return manage(res);
}

space space::set_tuple_name(isl::dim type, const std::string &s) const
{
  auto res = isl_space_set_tuple_name(copy(), static_cast<enum isl_dim_type>(type), s.c_str());
  return manage(res);
}

boolean space::tuple_is_equal(isl::dim type1, const space &space2, isl::dim type2) const
{
  auto res = isl_space_tuple_is_equal(get(), static_cast<enum isl_dim_type>(type1), space2.get(), static_cast<enum isl_dim_type>(type2));
  return manage(res);
}

space space::uncurry() const
{
  auto res = isl_space_uncurry(copy());
  return manage(res);
}

space space::unit(ctx ctx)
{
  auto res = isl_space_unit(ctx.release());
  return manage(res);
}

space space::unwrap() const
{
  auto res = isl_space_unwrap(copy());
  return manage(res);
}

space space::wrap() const
{
  auto res = isl_space_wrap(copy());
  return manage(res);
}

space space::zip() const
{
  auto res = isl_space_zip(copy());
  return manage(res);
}

// implementations for isl::term
term manage(__isl_take isl_term *ptr) {
  return term(ptr);
}
term manage_copy(__isl_keep isl_term *ptr) {
  ptr = isl_term_copy(ptr);
  return term(ptr);
}

term::term()
    : ptr(nullptr) {}

term::term(const term &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


term::term(__isl_take isl_term *ptr)
    : ptr(ptr) {}


term &term::operator=(term obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

term::~term() {
  if (ptr)
    isl_term_free(ptr);
}

__isl_give isl_term *term::copy() const & {
  return isl_term_copy(ptr);
}

__isl_keep isl_term *term::get() const {
  return ptr;
}

__isl_give isl_term *term::release() {
  isl_term *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool term::is_null() const {
  return ptr == nullptr;
}


ctx term::get_ctx() const {
  return ctx(isl_term_get_ctx(ptr));
}


isl_size term::dim(isl::dim type) const
{
  auto res = isl_term_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

val term::get_coefficient_val() const
{
  auto res = isl_term_get_coefficient_val(get());
  return manage(res);
}

aff term::get_div(unsigned int pos) const
{
  auto res = isl_term_get_div(get(), pos);
  return manage(res);
}

isl_size term::get_exp(isl::dim type, unsigned int pos) const
{
  auto res = isl_term_get_exp(get(), static_cast<enum isl_dim_type>(type), pos);
  return res;
}

// implementations for isl::union_access_info
union_access_info manage(__isl_take isl_union_access_info *ptr) {
  return union_access_info(ptr);
}
union_access_info manage_copy(__isl_keep isl_union_access_info *ptr) {
  ptr = isl_union_access_info_copy(ptr);
  return union_access_info(ptr);
}

union_access_info::union_access_info()
    : ptr(nullptr) {}

union_access_info::union_access_info(const union_access_info &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_access_info::union_access_info(__isl_take isl_union_access_info *ptr)
    : ptr(ptr) {}

union_access_info::union_access_info(union_map sink)
{
  auto res = isl_union_access_info_from_sink(sink.release());
  ptr = res;
}

union_access_info &union_access_info::operator=(union_access_info obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_access_info::~union_access_info() {
  if (ptr)
    isl_union_access_info_free(ptr);
}

__isl_give isl_union_access_info *union_access_info::copy() const & {
  return isl_union_access_info_copy(ptr);
}

__isl_keep isl_union_access_info *union_access_info::get() const {
  return ptr;
}

__isl_give isl_union_access_info *union_access_info::release() {
  isl_union_access_info *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_access_info::is_null() const {
  return ptr == nullptr;
}


ctx union_access_info::get_ctx() const {
  return ctx(isl_union_access_info_get_ctx(ptr));
}


union_flow union_access_info::compute_flow() const
{
  auto res = isl_union_access_info_compute_flow(copy());
  return manage(res);
}

union_access_info union_access_info::set_kill(union_map kill) const
{
  auto res = isl_union_access_info_set_kill(copy(), kill.release());
  return manage(res);
}

union_access_info union_access_info::set_may_source(union_map may_source) const
{
  auto res = isl_union_access_info_set_may_source(copy(), may_source.release());
  return manage(res);
}

union_access_info union_access_info::set_must_source(union_map must_source) const
{
  auto res = isl_union_access_info_set_must_source(copy(), must_source.release());
  return manage(res);
}

union_access_info union_access_info::set_schedule(schedule schedule) const
{
  auto res = isl_union_access_info_set_schedule(copy(), schedule.release());
  return manage(res);
}

union_access_info union_access_info::set_schedule_map(union_map schedule_map) const
{
  auto res = isl_union_access_info_set_schedule_map(copy(), schedule_map.release());
  return manage(res);
}

// implementations for isl::union_flow
union_flow manage(__isl_take isl_union_flow *ptr) {
  return union_flow(ptr);
}
union_flow manage_copy(__isl_keep isl_union_flow *ptr) {
  ptr = isl_union_flow_copy(ptr);
  return union_flow(ptr);
}

union_flow::union_flow()
    : ptr(nullptr) {}

union_flow::union_flow(const union_flow &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_flow::union_flow(__isl_take isl_union_flow *ptr)
    : ptr(ptr) {}


union_flow &union_flow::operator=(union_flow obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_flow::~union_flow() {
  if (ptr)
    isl_union_flow_free(ptr);
}

__isl_give isl_union_flow *union_flow::copy() const & {
  return isl_union_flow_copy(ptr);
}

__isl_keep isl_union_flow *union_flow::get() const {
  return ptr;
}

__isl_give isl_union_flow *union_flow::release() {
  isl_union_flow *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_flow::is_null() const {
  return ptr == nullptr;
}


ctx union_flow::get_ctx() const {
  return ctx(isl_union_flow_get_ctx(ptr));
}


union_map union_flow::get_full_may_dependence() const
{
  auto res = isl_union_flow_get_full_may_dependence(get());
  return manage(res);
}

union_map union_flow::get_full_must_dependence() const
{
  auto res = isl_union_flow_get_full_must_dependence(get());
  return manage(res);
}

union_map union_flow::get_may_dependence() const
{
  auto res = isl_union_flow_get_may_dependence(get());
  return manage(res);
}

union_map union_flow::get_may_no_source() const
{
  auto res = isl_union_flow_get_may_no_source(get());
  return manage(res);
}

union_map union_flow::get_must_dependence() const
{
  auto res = isl_union_flow_get_must_dependence(get());
  return manage(res);
}

union_map union_flow::get_must_no_source() const
{
  auto res = isl_union_flow_get_must_no_source(get());
  return manage(res);
}

// implementations for isl::union_map
union_map manage(__isl_take isl_union_map *ptr) {
  return union_map(ptr);
}
union_map manage_copy(__isl_keep isl_union_map *ptr) {
  ptr = isl_union_map_copy(ptr);
  return union_map(ptr);
}

union_map::union_map()
    : ptr(nullptr) {}

union_map::union_map(const union_map &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_map::union_map(__isl_take isl_union_map *ptr)
    : ptr(ptr) {}

union_map::union_map(basic_map bmap)
{
  auto res = isl_union_map_from_basic_map(bmap.release());
  ptr = res;
}
union_map::union_map(map map)
{
  auto res = isl_union_map_from_map(map.release());
  ptr = res;
}
union_map::union_map(union_pw_multi_aff upma)
{
  auto res = isl_union_map_from_union_pw_multi_aff(upma.release());
  ptr = res;
}
union_map::union_map(ctx ctx, const std::string &str)
{
  auto res = isl_union_map_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

union_map &union_map::operator=(union_map obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_map::~union_map() {
  if (ptr)
    isl_union_map_free(ptr);
}

__isl_give isl_union_map *union_map::copy() const & {
  return isl_union_map_copy(ptr);
}

__isl_keep isl_union_map *union_map::get() const {
  return ptr;
}

__isl_give isl_union_map *union_map::release() {
  isl_union_map *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_map::is_null() const {
  return ptr == nullptr;
}


ctx union_map::get_ctx() const {
  return ctx(isl_union_map_get_ctx(ptr));
}

void union_map::dump() const {
  isl_union_map_dump(get());
}


union_map union_map::add_map(map map) const
{
  auto res = isl_union_map_add_map(copy(), map.release());
  return manage(res);
}

union_map union_map::affine_hull() const
{
  auto res = isl_union_map_affine_hull(copy());
  return manage(res);
}

union_map union_map::align_params(space model) const
{
  auto res = isl_union_map_align_params(copy(), model.release());
  return manage(res);
}

union_map union_map::apply_domain(union_map umap2) const
{
  auto res = isl_union_map_apply_domain(copy(), umap2.release());
  return manage(res);
}

union_map union_map::apply_range(union_map umap2) const
{
  auto res = isl_union_map_apply_range(copy(), umap2.release());
  return manage(res);
}

union_set union_map::bind_range(multi_id tuple) const
{
  auto res = isl_union_map_bind_range(copy(), tuple.release());
  return manage(res);
}

union_map union_map::coalesce() const
{
  auto res = isl_union_map_coalesce(copy());
  return manage(res);
}

boolean union_map::contains(const space &space) const
{
  auto res = isl_union_map_contains(get(), space.get());
  return manage(res);
}

union_map union_map::curry() const
{
  auto res = isl_union_map_curry(copy());
  return manage(res);
}

union_set union_map::deltas() const
{
  auto res = isl_union_map_deltas(copy());
  return manage(res);
}

union_map union_map::deltas_map() const
{
  auto res = isl_union_map_deltas_map(copy());
  return manage(res);
}

union_map union_map::detect_equalities() const
{
  auto res = isl_union_map_detect_equalities(copy());
  return manage(res);
}

isl_size union_map::dim(isl::dim type) const
{
  auto res = isl_union_map_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

union_set union_map::domain() const
{
  auto res = isl_union_map_domain(copy());
  return manage(res);
}

union_map union_map::domain_factor_domain() const
{
  auto res = isl_union_map_domain_factor_domain(copy());
  return manage(res);
}

union_map union_map::domain_factor_range() const
{
  auto res = isl_union_map_domain_factor_range(copy());
  return manage(res);
}

union_map union_map::domain_map() const
{
  auto res = isl_union_map_domain_map(copy());
  return manage(res);
}

union_pw_multi_aff union_map::domain_map_union_pw_multi_aff() const
{
  auto res = isl_union_map_domain_map_union_pw_multi_aff(copy());
  return manage(res);
}

union_map union_map::domain_product(union_map umap2) const
{
  auto res = isl_union_map_domain_product(copy(), umap2.release());
  return manage(res);
}

union_map union_map::empty(space space)
{
  auto res = isl_union_map_empty(space.release());
  return manage(res);
}

union_map union_map::empty(ctx ctx)
{
  auto res = isl_union_map_empty_ctx(ctx.release());
  return manage(res);
}

union_map union_map::empty_space(space space)
{
  auto res = isl_union_map_empty_space(space.release());
  return manage(res);
}

union_map union_map::eq_at(multi_union_pw_aff mupa) const
{
  auto res = isl_union_map_eq_at_multi_union_pw_aff(copy(), mupa.release());
  return manage(res);
}

map union_map::extract_map(space space) const
{
  auto res = isl_union_map_extract_map(get(), space.release());
  return manage(res);
}

union_map union_map::factor_domain() const
{
  auto res = isl_union_map_factor_domain(copy());
  return manage(res);
}

union_map union_map::factor_range() const
{
  auto res = isl_union_map_factor_range(copy());
  return manage(res);
}

int union_map::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_union_map_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

union_map union_map::fixed_power(val exp) const
{
  auto res = isl_union_map_fixed_power_val(copy(), exp.release());
  return manage(res);
}

union_map union_map::flat_domain_product(union_map umap2) const
{
  auto res = isl_union_map_flat_domain_product(copy(), umap2.release());
  return manage(res);
}

union_map union_map::flat_range_product(union_map umap2) const
{
  auto res = isl_union_map_flat_range_product(copy(), umap2.release());
  return manage(res);
}

stat union_map::foreach_map(const std::function<stat(map)> &fn) const
{
  struct fn_data {
    const std::function<stat(map)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_map *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_union_map_foreach_map(get(), fn_lambda, &fn_data);
  return manage(res);
}

union_map union_map::from(multi_union_pw_aff mupa)
{
  auto res = isl_union_map_from_multi_union_pw_aff(mupa.release());
  return manage(res);
}

union_map union_map::from_domain(union_set uset)
{
  auto res = isl_union_map_from_domain(uset.release());
  return manage(res);
}

union_map union_map::from_domain_and_range(union_set domain, union_set range)
{
  auto res = isl_union_map_from_domain_and_range(domain.release(), range.release());
  return manage(res);
}

union_map union_map::from_range(union_set uset)
{
  auto res = isl_union_map_from_range(uset.release());
  return manage(res);
}

union_map union_map::from_union_pw_aff(union_pw_aff upa)
{
  auto res = isl_union_map_from_union_pw_aff(upa.release());
  return manage(res);
}

id union_map::get_dim_id(isl::dim type, unsigned int pos) const
{
  auto res = isl_union_map_get_dim_id(get(), static_cast<enum isl_dim_type>(type), pos);
  return manage(res);
}

uint32_t union_map::get_hash() const
{
  auto res = isl_union_map_get_hash(get());
  return res;
}

map_list union_map::get_map_list() const
{
  auto res = isl_union_map_get_map_list(get());
  return manage(res);
}

space union_map::get_space() const
{
  auto res = isl_union_map_get_space(get());
  return manage(res);
}

union_map union_map::gist(union_map context) const
{
  auto res = isl_union_map_gist(copy(), context.release());
  return manage(res);
}

union_map union_map::gist_domain(union_set uset) const
{
  auto res = isl_union_map_gist_domain(copy(), uset.release());
  return manage(res);
}

union_map union_map::gist_params(set set) const
{
  auto res = isl_union_map_gist_params(copy(), set.release());
  return manage(res);
}

union_map union_map::gist_range(union_set uset) const
{
  auto res = isl_union_map_gist_range(copy(), uset.release());
  return manage(res);
}

union_map union_map::intersect(union_map umap2) const
{
  auto res = isl_union_map_intersect(copy(), umap2.release());
  return manage(res);
}

union_map union_map::intersect_domain(space space) const
{
  auto res = isl_union_map_intersect_domain_space(copy(), space.release());
  return manage(res);
}

union_map union_map::intersect_domain(union_set uset) const
{
  auto res = isl_union_map_intersect_domain_union_set(copy(), uset.release());
  return manage(res);
}

union_map union_map::intersect_domain_factor_domain(union_map factor) const
{
  auto res = isl_union_map_intersect_domain_factor_domain(copy(), factor.release());
  return manage(res);
}

union_map union_map::intersect_domain_factor_range(union_map factor) const
{
  auto res = isl_union_map_intersect_domain_factor_range(copy(), factor.release());
  return manage(res);
}

union_map union_map::intersect_params(set set) const
{
  auto res = isl_union_map_intersect_params(copy(), set.release());
  return manage(res);
}

union_map union_map::intersect_range(space space) const
{
  auto res = isl_union_map_intersect_range_space(copy(), space.release());
  return manage(res);
}

union_map union_map::intersect_range(union_set uset) const
{
  auto res = isl_union_map_intersect_range_union_set(copy(), uset.release());
  return manage(res);
}

union_map union_map::intersect_range_factor_domain(union_map factor) const
{
  auto res = isl_union_map_intersect_range_factor_domain(copy(), factor.release());
  return manage(res);
}

union_map union_map::intersect_range_factor_range(union_map factor) const
{
  auto res = isl_union_map_intersect_range_factor_range(copy(), factor.release());
  return manage(res);
}

boolean union_map::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_union_map_involves_dims(get(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

boolean union_map::is_bijective() const
{
  auto res = isl_union_map_is_bijective(get());
  return manage(res);
}

boolean union_map::is_disjoint(const union_map &umap2) const
{
  auto res = isl_union_map_is_disjoint(get(), umap2.get());
  return manage(res);
}

boolean union_map::is_empty() const
{
  auto res = isl_union_map_is_empty(get());
  return manage(res);
}

boolean union_map::is_equal(const union_map &umap2) const
{
  auto res = isl_union_map_is_equal(get(), umap2.get());
  return manage(res);
}

boolean union_map::is_identity() const
{
  auto res = isl_union_map_is_identity(get());
  return manage(res);
}

boolean union_map::is_injective() const
{
  auto res = isl_union_map_is_injective(get());
  return manage(res);
}

boolean union_map::is_single_valued() const
{
  auto res = isl_union_map_is_single_valued(get());
  return manage(res);
}

boolean union_map::is_strict_subset(const union_map &umap2) const
{
  auto res = isl_union_map_is_strict_subset(get(), umap2.get());
  return manage(res);
}

boolean union_map::is_subset(const union_map &umap2) const
{
  auto res = isl_union_map_is_subset(get(), umap2.get());
  return manage(res);
}

boolean union_map::isa_map() const
{
  auto res = isl_union_map_isa_map(get());
  return manage(res);
}

union_map union_map::lex_ge_at_multi_union_pw_aff(multi_union_pw_aff mupa) const
{
  auto res = isl_union_map_lex_ge_at_multi_union_pw_aff(copy(), mupa.release());
  return manage(res);
}

union_map union_map::lex_ge_union_map(union_map umap2) const
{
  auto res = isl_union_map_lex_ge_union_map(copy(), umap2.release());
  return manage(res);
}

union_map union_map::lex_gt_at_multi_union_pw_aff(multi_union_pw_aff mupa) const
{
  auto res = isl_union_map_lex_gt_at_multi_union_pw_aff(copy(), mupa.release());
  return manage(res);
}

union_map union_map::lex_gt_union_map(union_map umap2) const
{
  auto res = isl_union_map_lex_gt_union_map(copy(), umap2.release());
  return manage(res);
}

union_map union_map::lex_le_at_multi_union_pw_aff(multi_union_pw_aff mupa) const
{
  auto res = isl_union_map_lex_le_at_multi_union_pw_aff(copy(), mupa.release());
  return manage(res);
}

union_map union_map::lex_le_union_map(union_map umap2) const
{
  auto res = isl_union_map_lex_le_union_map(copy(), umap2.release());
  return manage(res);
}

union_map union_map::lex_lt_at_multi_union_pw_aff(multi_union_pw_aff mupa) const
{
  auto res = isl_union_map_lex_lt_at_multi_union_pw_aff(copy(), mupa.release());
  return manage(res);
}

union_map union_map::lex_lt_union_map(union_map umap2) const
{
  auto res = isl_union_map_lex_lt_union_map(copy(), umap2.release());
  return manage(res);
}

union_map union_map::lexmax() const
{
  auto res = isl_union_map_lexmax(copy());
  return manage(res);
}

union_map union_map::lexmin() const
{
  auto res = isl_union_map_lexmin(copy());
  return manage(res);
}

isl_size union_map::n_map() const
{
  auto res = isl_union_map_n_map(get());
  return res;
}

set union_map::params() const
{
  auto res = isl_union_map_params(copy());
  return manage(res);
}

boolean union_map::plain_is_empty() const
{
  auto res = isl_union_map_plain_is_empty(get());
  return manage(res);
}

boolean union_map::plain_is_injective() const
{
  auto res = isl_union_map_plain_is_injective(get());
  return manage(res);
}

union_map union_map::polyhedral_hull() const
{
  auto res = isl_union_map_polyhedral_hull(copy());
  return manage(res);
}

union_map union_map::preimage_domain(multi_aff ma) const
{
  auto res = isl_union_map_preimage_domain_multi_aff(copy(), ma.release());
  return manage(res);
}

union_map union_map::preimage_domain(multi_pw_aff mpa) const
{
  auto res = isl_union_map_preimage_domain_multi_pw_aff(copy(), mpa.release());
  return manage(res);
}

union_map union_map::preimage_domain(pw_multi_aff pma) const
{
  auto res = isl_union_map_preimage_domain_pw_multi_aff(copy(), pma.release());
  return manage(res);
}

union_map union_map::preimage_domain(union_pw_multi_aff upma) const
{
  auto res = isl_union_map_preimage_domain_union_pw_multi_aff(copy(), upma.release());
  return manage(res);
}

union_map union_map::preimage_range(multi_aff ma) const
{
  auto res = isl_union_map_preimage_range_multi_aff(copy(), ma.release());
  return manage(res);
}

union_map union_map::preimage_range(pw_multi_aff pma) const
{
  auto res = isl_union_map_preimage_range_pw_multi_aff(copy(), pma.release());
  return manage(res);
}

union_map union_map::preimage_range(union_pw_multi_aff upma) const
{
  auto res = isl_union_map_preimage_range_union_pw_multi_aff(copy(), upma.release());
  return manage(res);
}

union_map union_map::product(union_map umap2) const
{
  auto res = isl_union_map_product(copy(), umap2.release());
  return manage(res);
}

union_map union_map::project_out(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_union_map_project_out(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

union_map union_map::project_out_all_params() const
{
  auto res = isl_union_map_project_out_all_params(copy());
  return manage(res);
}

union_set union_map::range() const
{
  auto res = isl_union_map_range(copy());
  return manage(res);
}

union_map union_map::range_curry() const
{
  auto res = isl_union_map_range_curry(copy());
  return manage(res);
}

union_map union_map::range_factor_domain() const
{
  auto res = isl_union_map_range_factor_domain(copy());
  return manage(res);
}

union_map union_map::range_factor_range() const
{
  auto res = isl_union_map_range_factor_range(copy());
  return manage(res);
}

union_map union_map::range_map() const
{
  auto res = isl_union_map_range_map(copy());
  return manage(res);
}

union_map union_map::range_product(union_map umap2) const
{
  auto res = isl_union_map_range_product(copy(), umap2.release());
  return manage(res);
}

union_map union_map::range_reverse() const
{
  auto res = isl_union_map_range_reverse(copy());
  return manage(res);
}

union_map union_map::remove_divs() const
{
  auto res = isl_union_map_remove_divs(copy());
  return manage(res);
}

union_map union_map::remove_redundancies() const
{
  auto res = isl_union_map_remove_redundancies(copy());
  return manage(res);
}

union_map union_map::reset_user() const
{
  auto res = isl_union_map_reset_user(copy());
  return manage(res);
}

union_map union_map::reverse() const
{
  auto res = isl_union_map_reverse(copy());
  return manage(res);
}

basic_map union_map::sample() const
{
  auto res = isl_union_map_sample(copy());
  return manage(res);
}

union_map union_map::simple_hull() const
{
  auto res = isl_union_map_simple_hull(copy());
  return manage(res);
}

union_map union_map::subtract(union_map umap2) const
{
  auto res = isl_union_map_subtract(copy(), umap2.release());
  return manage(res);
}

union_map union_map::subtract_domain(union_set dom) const
{
  auto res = isl_union_map_subtract_domain(copy(), dom.release());
  return manage(res);
}

union_map union_map::subtract_range(union_set dom) const
{
  auto res = isl_union_map_subtract_range(copy(), dom.release());
  return manage(res);
}

union_map union_map::uncurry() const
{
  auto res = isl_union_map_uncurry(copy());
  return manage(res);
}

union_map union_map::unite(union_map umap2) const
{
  auto res = isl_union_map_union(copy(), umap2.release());
  return manage(res);
}

union_map union_map::universe() const
{
  auto res = isl_union_map_universe(copy());
  return manage(res);
}

union_set union_map::wrap() const
{
  auto res = isl_union_map_wrap(copy());
  return manage(res);
}

union_map union_map::zip() const
{
  auto res = isl_union_map_zip(copy());
  return manage(res);
}

// implementations for isl::union_map_list
union_map_list manage(__isl_take isl_union_map_list *ptr) {
  return union_map_list(ptr);
}
union_map_list manage_copy(__isl_keep isl_union_map_list *ptr) {
  ptr = isl_union_map_list_copy(ptr);
  return union_map_list(ptr);
}

union_map_list::union_map_list()
    : ptr(nullptr) {}

union_map_list::union_map_list(const union_map_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_map_list::union_map_list(__isl_take isl_union_map_list *ptr)
    : ptr(ptr) {}


union_map_list &union_map_list::operator=(union_map_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_map_list::~union_map_list() {
  if (ptr)
    isl_union_map_list_free(ptr);
}

__isl_give isl_union_map_list *union_map_list::copy() const & {
  return isl_union_map_list_copy(ptr);
}

__isl_keep isl_union_map_list *union_map_list::get() const {
  return ptr;
}

__isl_give isl_union_map_list *union_map_list::release() {
  isl_union_map_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_map_list::is_null() const {
  return ptr == nullptr;
}


ctx union_map_list::get_ctx() const {
  return ctx(isl_union_map_list_get_ctx(ptr));
}

void union_map_list::dump() const {
  isl_union_map_list_dump(get());
}


union_map_list union_map_list::add(union_map el) const
{
  auto res = isl_union_map_list_add(copy(), el.release());
  return manage(res);
}

union_map_list union_map_list::alloc(ctx ctx, int n)
{
  auto res = isl_union_map_list_alloc(ctx.release(), n);
  return manage(res);
}

union_map_list union_map_list::clear() const
{
  auto res = isl_union_map_list_clear(copy());
  return manage(res);
}

union_map_list union_map_list::concat(union_map_list list2) const
{
  auto res = isl_union_map_list_concat(copy(), list2.release());
  return manage(res);
}

union_map_list union_map_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_union_map_list_drop(copy(), first, n);
  return manage(res);
}

stat union_map_list::foreach(const std::function<stat(union_map)> &fn) const
{
  struct fn_data {
    const std::function<stat(union_map)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_union_map *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_union_map_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

union_map_list union_map_list::from_union_map(union_map el)
{
  auto res = isl_union_map_list_from_union_map(el.release());
  return manage(res);
}

union_map union_map_list::get_at(int index) const
{
  auto res = isl_union_map_list_get_at(get(), index);
  return manage(res);
}

union_map union_map_list::get_union_map(int index) const
{
  auto res = isl_union_map_list_get_union_map(get(), index);
  return manage(res);
}

union_map_list union_map_list::insert(unsigned int pos, union_map el) const
{
  auto res = isl_union_map_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size union_map_list::n_union_map() const
{
  auto res = isl_union_map_list_n_union_map(get());
  return res;
}

union_map_list union_map_list::reverse() const
{
  auto res = isl_union_map_list_reverse(copy());
  return manage(res);
}

union_map_list union_map_list::set_union_map(int index, union_map el) const
{
  auto res = isl_union_map_list_set_union_map(copy(), index, el.release());
  return manage(res);
}

isl_size union_map_list::size() const
{
  auto res = isl_union_map_list_size(get());
  return res;
}

union_map_list union_map_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_union_map_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::union_pw_aff
union_pw_aff manage(__isl_take isl_union_pw_aff *ptr) {
  return union_pw_aff(ptr);
}
union_pw_aff manage_copy(__isl_keep isl_union_pw_aff *ptr) {
  ptr = isl_union_pw_aff_copy(ptr);
  return union_pw_aff(ptr);
}

union_pw_aff::union_pw_aff()
    : ptr(nullptr) {}

union_pw_aff::union_pw_aff(const union_pw_aff &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_pw_aff::union_pw_aff(__isl_take isl_union_pw_aff *ptr)
    : ptr(ptr) {}

union_pw_aff::union_pw_aff(aff aff)
{
  auto res = isl_union_pw_aff_from_aff(aff.release());
  ptr = res;
}
union_pw_aff::union_pw_aff(pw_aff pa)
{
  auto res = isl_union_pw_aff_from_pw_aff(pa.release());
  ptr = res;
}
union_pw_aff::union_pw_aff(ctx ctx, const std::string &str)
{
  auto res = isl_union_pw_aff_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}
union_pw_aff::union_pw_aff(union_set domain, val v)
{
  auto res = isl_union_pw_aff_val_on_domain(domain.release(), v.release());
  ptr = res;
}

union_pw_aff &union_pw_aff::operator=(union_pw_aff obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_pw_aff::~union_pw_aff() {
  if (ptr)
    isl_union_pw_aff_free(ptr);
}

__isl_give isl_union_pw_aff *union_pw_aff::copy() const & {
  return isl_union_pw_aff_copy(ptr);
}

__isl_keep isl_union_pw_aff *union_pw_aff::get() const {
  return ptr;
}

__isl_give isl_union_pw_aff *union_pw_aff::release() {
  isl_union_pw_aff *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_pw_aff::is_null() const {
  return ptr == nullptr;
}


ctx union_pw_aff::get_ctx() const {
  return ctx(isl_union_pw_aff_get_ctx(ptr));
}

void union_pw_aff::dump() const {
  isl_union_pw_aff_dump(get());
}


union_pw_aff union_pw_aff::add(union_pw_aff upa2) const
{
  auto res = isl_union_pw_aff_add(copy(), upa2.release());
  return manage(res);
}

union_pw_aff union_pw_aff::add_pw_aff(pw_aff pa) const
{
  auto res = isl_union_pw_aff_add_pw_aff(copy(), pa.release());
  return manage(res);
}

union_pw_aff union_pw_aff::aff_on_domain(union_set domain, aff aff)
{
  auto res = isl_union_pw_aff_aff_on_domain(domain.release(), aff.release());
  return manage(res);
}

union_pw_aff union_pw_aff::align_params(space model) const
{
  auto res = isl_union_pw_aff_align_params(copy(), model.release());
  return manage(res);
}

union_set union_pw_aff::bind(id id) const
{
  auto res = isl_union_pw_aff_bind_id(copy(), id.release());
  return manage(res);
}

union_pw_aff union_pw_aff::coalesce() const
{
  auto res = isl_union_pw_aff_coalesce(copy());
  return manage(res);
}

isl_size union_pw_aff::dim(isl::dim type) const
{
  auto res = isl_union_pw_aff_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

union_set union_pw_aff::domain() const
{
  auto res = isl_union_pw_aff_domain(copy());
  return manage(res);
}

union_pw_aff union_pw_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_union_pw_aff_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

union_pw_aff union_pw_aff::empty(space space)
{
  auto res = isl_union_pw_aff_empty(space.release());
  return manage(res);
}

union_pw_aff union_pw_aff::empty_ctx(ctx ctx)
{
  auto res = isl_union_pw_aff_empty_ctx(ctx.release());
  return manage(res);
}

union_pw_aff union_pw_aff::empty_space(space space)
{
  auto res = isl_union_pw_aff_empty_space(space.release());
  return manage(res);
}

pw_aff union_pw_aff::extract_pw_aff(space space) const
{
  auto res = isl_union_pw_aff_extract_pw_aff(get(), space.release());
  return manage(res);
}

int union_pw_aff::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_union_pw_aff_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

union_pw_aff union_pw_aff::floor() const
{
  auto res = isl_union_pw_aff_floor(copy());
  return manage(res);
}

stat union_pw_aff::foreach_pw_aff(const std::function<stat(pw_aff)> &fn) const
{
  struct fn_data {
    const std::function<stat(pw_aff)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_pw_aff *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_union_pw_aff_foreach_pw_aff(get(), fn_lambda, &fn_data);
  return manage(res);
}

pw_aff_list union_pw_aff::get_pw_aff_list() const
{
  auto res = isl_union_pw_aff_get_pw_aff_list(get());
  return manage(res);
}

space union_pw_aff::get_space() const
{
  auto res = isl_union_pw_aff_get_space(get());
  return manage(res);
}

union_pw_aff union_pw_aff::gist(union_set context) const
{
  auto res = isl_union_pw_aff_gist(copy(), context.release());
  return manage(res);
}

union_pw_aff union_pw_aff::gist_params(set context) const
{
  auto res = isl_union_pw_aff_gist_params(copy(), context.release());
  return manage(res);
}

union_pw_aff union_pw_aff::intersect_domain(space space) const
{
  auto res = isl_union_pw_aff_intersect_domain_space(copy(), space.release());
  return manage(res);
}

union_pw_aff union_pw_aff::intersect_domain(union_set uset) const
{
  auto res = isl_union_pw_aff_intersect_domain_union_set(copy(), uset.release());
  return manage(res);
}

union_pw_aff union_pw_aff::intersect_domain_wrapped_domain(union_set uset) const
{
  auto res = isl_union_pw_aff_intersect_domain_wrapped_domain(copy(), uset.release());
  return manage(res);
}

union_pw_aff union_pw_aff::intersect_domain_wrapped_range(union_set uset) const
{
  auto res = isl_union_pw_aff_intersect_domain_wrapped_range(copy(), uset.release());
  return manage(res);
}

union_pw_aff union_pw_aff::intersect_params(set set) const
{
  auto res = isl_union_pw_aff_intersect_params(copy(), set.release());
  return manage(res);
}

boolean union_pw_aff::involves_nan() const
{
  auto res = isl_union_pw_aff_involves_nan(get());
  return manage(res);
}

val union_pw_aff::max_val() const
{
  auto res = isl_union_pw_aff_max_val(copy());
  return manage(res);
}

val union_pw_aff::min_val() const
{
  auto res = isl_union_pw_aff_min_val(copy());
  return manage(res);
}

union_pw_aff union_pw_aff::mod_val(val f) const
{
  auto res = isl_union_pw_aff_mod_val(copy(), f.release());
  return manage(res);
}

isl_size union_pw_aff::n_pw_aff() const
{
  auto res = isl_union_pw_aff_n_pw_aff(get());
  return res;
}

union_pw_aff union_pw_aff::neg() const
{
  auto res = isl_union_pw_aff_neg(copy());
  return manage(res);
}

union_pw_aff union_pw_aff::param_on_domain_id(union_set domain, id id)
{
  auto res = isl_union_pw_aff_param_on_domain_id(domain.release(), id.release());
  return manage(res);
}

boolean union_pw_aff::plain_is_equal(const union_pw_aff &upa2) const
{
  auto res = isl_union_pw_aff_plain_is_equal(get(), upa2.get());
  return manage(res);
}

union_pw_aff union_pw_aff::pullback(union_pw_multi_aff upma) const
{
  auto res = isl_union_pw_aff_pullback_union_pw_multi_aff(copy(), upma.release());
  return manage(res);
}

union_pw_aff union_pw_aff::pw_aff_on_domain(union_set domain, pw_aff pa)
{
  auto res = isl_union_pw_aff_pw_aff_on_domain(domain.release(), pa.release());
  return manage(res);
}

union_pw_aff union_pw_aff::reset_user() const
{
  auto res = isl_union_pw_aff_reset_user(copy());
  return manage(res);
}

union_pw_aff union_pw_aff::scale_down_val(val v) const
{
  auto res = isl_union_pw_aff_scale_down_val(copy(), v.release());
  return manage(res);
}

union_pw_aff union_pw_aff::scale_val(val v) const
{
  auto res = isl_union_pw_aff_scale_val(copy(), v.release());
  return manage(res);
}

union_pw_aff union_pw_aff::sub(union_pw_aff upa2) const
{
  auto res = isl_union_pw_aff_sub(copy(), upa2.release());
  return manage(res);
}

union_pw_aff union_pw_aff::subtract_domain(space space) const
{
  auto res = isl_union_pw_aff_subtract_domain_space(copy(), space.release());
  return manage(res);
}

union_pw_aff union_pw_aff::subtract_domain(union_set uset) const
{
  auto res = isl_union_pw_aff_subtract_domain_union_set(copy(), uset.release());
  return manage(res);
}

union_pw_aff union_pw_aff::union_add(union_pw_aff upa2) const
{
  auto res = isl_union_pw_aff_union_add(copy(), upa2.release());
  return manage(res);
}

union_set union_pw_aff::zero_union_set() const
{
  auto res = isl_union_pw_aff_zero_union_set(copy());
  return manage(res);
}

// implementations for isl::union_pw_aff_list
union_pw_aff_list manage(__isl_take isl_union_pw_aff_list *ptr) {
  return union_pw_aff_list(ptr);
}
union_pw_aff_list manage_copy(__isl_keep isl_union_pw_aff_list *ptr) {
  ptr = isl_union_pw_aff_list_copy(ptr);
  return union_pw_aff_list(ptr);
}

union_pw_aff_list::union_pw_aff_list()
    : ptr(nullptr) {}

union_pw_aff_list::union_pw_aff_list(const union_pw_aff_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_pw_aff_list::union_pw_aff_list(__isl_take isl_union_pw_aff_list *ptr)
    : ptr(ptr) {}


union_pw_aff_list &union_pw_aff_list::operator=(union_pw_aff_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_pw_aff_list::~union_pw_aff_list() {
  if (ptr)
    isl_union_pw_aff_list_free(ptr);
}

__isl_give isl_union_pw_aff_list *union_pw_aff_list::copy() const & {
  return isl_union_pw_aff_list_copy(ptr);
}

__isl_keep isl_union_pw_aff_list *union_pw_aff_list::get() const {
  return ptr;
}

__isl_give isl_union_pw_aff_list *union_pw_aff_list::release() {
  isl_union_pw_aff_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_pw_aff_list::is_null() const {
  return ptr == nullptr;
}


ctx union_pw_aff_list::get_ctx() const {
  return ctx(isl_union_pw_aff_list_get_ctx(ptr));
}

void union_pw_aff_list::dump() const {
  isl_union_pw_aff_list_dump(get());
}


union_pw_aff_list union_pw_aff_list::add(union_pw_aff el) const
{
  auto res = isl_union_pw_aff_list_add(copy(), el.release());
  return manage(res);
}

union_pw_aff_list union_pw_aff_list::alloc(ctx ctx, int n)
{
  auto res = isl_union_pw_aff_list_alloc(ctx.release(), n);
  return manage(res);
}

union_pw_aff_list union_pw_aff_list::clear() const
{
  auto res = isl_union_pw_aff_list_clear(copy());
  return manage(res);
}

union_pw_aff_list union_pw_aff_list::concat(union_pw_aff_list list2) const
{
  auto res = isl_union_pw_aff_list_concat(copy(), list2.release());
  return manage(res);
}

union_pw_aff_list union_pw_aff_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_union_pw_aff_list_drop(copy(), first, n);
  return manage(res);
}

stat union_pw_aff_list::foreach(const std::function<stat(union_pw_aff)> &fn) const
{
  struct fn_data {
    const std::function<stat(union_pw_aff)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_union_pw_aff *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_union_pw_aff_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

union_pw_aff_list union_pw_aff_list::from_union_pw_aff(union_pw_aff el)
{
  auto res = isl_union_pw_aff_list_from_union_pw_aff(el.release());
  return manage(res);
}

union_pw_aff union_pw_aff_list::get_at(int index) const
{
  auto res = isl_union_pw_aff_list_get_at(get(), index);
  return manage(res);
}

union_pw_aff union_pw_aff_list::get_union_pw_aff(int index) const
{
  auto res = isl_union_pw_aff_list_get_union_pw_aff(get(), index);
  return manage(res);
}

union_pw_aff_list union_pw_aff_list::insert(unsigned int pos, union_pw_aff el) const
{
  auto res = isl_union_pw_aff_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size union_pw_aff_list::n_union_pw_aff() const
{
  auto res = isl_union_pw_aff_list_n_union_pw_aff(get());
  return res;
}

union_pw_aff_list union_pw_aff_list::reverse() const
{
  auto res = isl_union_pw_aff_list_reverse(copy());
  return manage(res);
}

union_pw_aff_list union_pw_aff_list::set_union_pw_aff(int index, union_pw_aff el) const
{
  auto res = isl_union_pw_aff_list_set_union_pw_aff(copy(), index, el.release());
  return manage(res);
}

isl_size union_pw_aff_list::size() const
{
  auto res = isl_union_pw_aff_list_size(get());
  return res;
}

union_pw_aff_list union_pw_aff_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_union_pw_aff_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::union_pw_multi_aff
union_pw_multi_aff manage(__isl_take isl_union_pw_multi_aff *ptr) {
  return union_pw_multi_aff(ptr);
}
union_pw_multi_aff manage_copy(__isl_keep isl_union_pw_multi_aff *ptr) {
  ptr = isl_union_pw_multi_aff_copy(ptr);
  return union_pw_multi_aff(ptr);
}

union_pw_multi_aff::union_pw_multi_aff()
    : ptr(nullptr) {}

union_pw_multi_aff::union_pw_multi_aff(const union_pw_multi_aff &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_pw_multi_aff::union_pw_multi_aff(__isl_take isl_union_pw_multi_aff *ptr)
    : ptr(ptr) {}

union_pw_multi_aff::union_pw_multi_aff(aff aff)
{
  auto res = isl_union_pw_multi_aff_from_aff(aff.release());
  ptr = res;
}
union_pw_multi_aff::union_pw_multi_aff(union_set uset)
{
  auto res = isl_union_pw_multi_aff_from_domain(uset.release());
  ptr = res;
}
union_pw_multi_aff::union_pw_multi_aff(multi_aff ma)
{
  auto res = isl_union_pw_multi_aff_from_multi_aff(ma.release());
  ptr = res;
}
union_pw_multi_aff::union_pw_multi_aff(multi_union_pw_aff mupa)
{
  auto res = isl_union_pw_multi_aff_from_multi_union_pw_aff(mupa.release());
  ptr = res;
}
union_pw_multi_aff::union_pw_multi_aff(pw_multi_aff pma)
{
  auto res = isl_union_pw_multi_aff_from_pw_multi_aff(pma.release());
  ptr = res;
}
union_pw_multi_aff::union_pw_multi_aff(union_map umap)
{
  auto res = isl_union_pw_multi_aff_from_union_map(umap.release());
  ptr = res;
}
union_pw_multi_aff::union_pw_multi_aff(union_pw_aff upa)
{
  auto res = isl_union_pw_multi_aff_from_union_pw_aff(upa.release());
  ptr = res;
}
union_pw_multi_aff::union_pw_multi_aff(ctx ctx, const std::string &str)
{
  auto res = isl_union_pw_multi_aff_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

union_pw_multi_aff &union_pw_multi_aff::operator=(union_pw_multi_aff obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_pw_multi_aff::~union_pw_multi_aff() {
  if (ptr)
    isl_union_pw_multi_aff_free(ptr);
}

__isl_give isl_union_pw_multi_aff *union_pw_multi_aff::copy() const & {
  return isl_union_pw_multi_aff_copy(ptr);
}

__isl_keep isl_union_pw_multi_aff *union_pw_multi_aff::get() const {
  return ptr;
}

__isl_give isl_union_pw_multi_aff *union_pw_multi_aff::release() {
  isl_union_pw_multi_aff *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_pw_multi_aff::is_null() const {
  return ptr == nullptr;
}


ctx union_pw_multi_aff::get_ctx() const {
  return ctx(isl_union_pw_multi_aff_get_ctx(ptr));
}

void union_pw_multi_aff::dump() const {
  isl_union_pw_multi_aff_dump(get());
}


union_pw_multi_aff union_pw_multi_aff::add(union_pw_multi_aff upma2) const
{
  auto res = isl_union_pw_multi_aff_add(copy(), upma2.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::add_pw_multi_aff(pw_multi_aff pma) const
{
  auto res = isl_union_pw_multi_aff_add_pw_multi_aff(copy(), pma.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::align_params(space model) const
{
  auto res = isl_union_pw_multi_aff_align_params(copy(), model.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::apply(union_pw_multi_aff upma2) const
{
  auto res = isl_union_pw_multi_aff_apply_union_pw_multi_aff(copy(), upma2.release());
  return manage(res);
}

pw_multi_aff union_pw_multi_aff::as_pw_multi_aff() const
{
  auto res = isl_union_pw_multi_aff_as_pw_multi_aff(copy());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::coalesce() const
{
  auto res = isl_union_pw_multi_aff_coalesce(copy());
  return manage(res);
}

isl_size union_pw_multi_aff::dim(isl::dim type) const
{
  auto res = isl_union_pw_multi_aff_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

union_set union_pw_multi_aff::domain() const
{
  auto res = isl_union_pw_multi_aff_domain(copy());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_union_pw_multi_aff_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::empty(space space)
{
  auto res = isl_union_pw_multi_aff_empty(space.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::empty(ctx ctx)
{
  auto res = isl_union_pw_multi_aff_empty_ctx(ctx.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::empty_space(space space)
{
  auto res = isl_union_pw_multi_aff_empty_space(space.release());
  return manage(res);
}

pw_multi_aff union_pw_multi_aff::extract_pw_multi_aff(space space) const
{
  auto res = isl_union_pw_multi_aff_extract_pw_multi_aff(get(), space.release());
  return manage(res);
}

int union_pw_multi_aff::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_union_pw_multi_aff_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

union_pw_multi_aff union_pw_multi_aff::flat_range_product(union_pw_multi_aff upma2) const
{
  auto res = isl_union_pw_multi_aff_flat_range_product(copy(), upma2.release());
  return manage(res);
}

stat union_pw_multi_aff::foreach_pw_multi_aff(const std::function<stat(pw_multi_aff)> &fn) const
{
  struct fn_data {
    const std::function<stat(pw_multi_aff)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_pw_multi_aff *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_union_pw_multi_aff_foreach_pw_multi_aff(get(), fn_lambda, &fn_data);
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::from_union_set(union_set uset)
{
  auto res = isl_union_pw_multi_aff_from_union_set(uset.release());
  return manage(res);
}

pw_multi_aff_list union_pw_multi_aff::get_pw_multi_aff_list() const
{
  auto res = isl_union_pw_multi_aff_get_pw_multi_aff_list(get());
  return manage(res);
}

space union_pw_multi_aff::get_space() const
{
  auto res = isl_union_pw_multi_aff_get_space(get());
  return manage(res);
}

union_pw_aff union_pw_multi_aff::get_union_pw_aff(int pos) const
{
  auto res = isl_union_pw_multi_aff_get_union_pw_aff(get(), pos);
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::gist(union_set context) const
{
  auto res = isl_union_pw_multi_aff_gist(copy(), context.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::gist_params(set context) const
{
  auto res = isl_union_pw_multi_aff_gist_params(copy(), context.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::intersect_domain(space space) const
{
  auto res = isl_union_pw_multi_aff_intersect_domain_space(copy(), space.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::intersect_domain(union_set uset) const
{
  auto res = isl_union_pw_multi_aff_intersect_domain_union_set(copy(), uset.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::intersect_domain_wrapped_domain(union_set uset) const
{
  auto res = isl_union_pw_multi_aff_intersect_domain_wrapped_domain(copy(), uset.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::intersect_domain_wrapped_range(union_set uset) const
{
  auto res = isl_union_pw_multi_aff_intersect_domain_wrapped_range(copy(), uset.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::intersect_params(set set) const
{
  auto res = isl_union_pw_multi_aff_intersect_params(copy(), set.release());
  return manage(res);
}

boolean union_pw_multi_aff::involves_locals() const
{
  auto res = isl_union_pw_multi_aff_involves_locals(get());
  return manage(res);
}

boolean union_pw_multi_aff::involves_nan() const
{
  auto res = isl_union_pw_multi_aff_involves_nan(get());
  return manage(res);
}

boolean union_pw_multi_aff::isa_pw_multi_aff() const
{
  auto res = isl_union_pw_multi_aff_isa_pw_multi_aff(get());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::multi_val_on_domain(union_set domain, multi_val mv)
{
  auto res = isl_union_pw_multi_aff_multi_val_on_domain(domain.release(), mv.release());
  return manage(res);
}

isl_size union_pw_multi_aff::n_pw_multi_aff() const
{
  auto res = isl_union_pw_multi_aff_n_pw_multi_aff(get());
  return res;
}

union_pw_multi_aff union_pw_multi_aff::neg() const
{
  auto res = isl_union_pw_multi_aff_neg(copy());
  return manage(res);
}

boolean union_pw_multi_aff::plain_is_empty() const
{
  auto res = isl_union_pw_multi_aff_plain_is_empty(get());
  return manage(res);
}

boolean union_pw_multi_aff::plain_is_equal(const union_pw_multi_aff &upma2) const
{
  auto res = isl_union_pw_multi_aff_plain_is_equal(get(), upma2.get());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::preimage_domain_wrapped_domain(union_pw_multi_aff upma2) const
{
  auto res = isl_union_pw_multi_aff_preimage_domain_wrapped_domain_union_pw_multi_aff(copy(), upma2.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::pullback(union_pw_multi_aff upma2) const
{
  auto res = isl_union_pw_multi_aff_pullback_union_pw_multi_aff(copy(), upma2.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::range_factor_domain() const
{
  auto res = isl_union_pw_multi_aff_range_factor_domain(copy());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::range_factor_range() const
{
  auto res = isl_union_pw_multi_aff_range_factor_range(copy());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::range_product(union_pw_multi_aff upma2) const
{
  auto res = isl_union_pw_multi_aff_range_product(copy(), upma2.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::reset_user() const
{
  auto res = isl_union_pw_multi_aff_reset_user(copy());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::scale_down_val(val val) const
{
  auto res = isl_union_pw_multi_aff_scale_down_val(copy(), val.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::scale_multi_val(multi_val mv) const
{
  auto res = isl_union_pw_multi_aff_scale_multi_val(copy(), mv.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::scale_val(val val) const
{
  auto res = isl_union_pw_multi_aff_scale_val(copy(), val.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::sub(union_pw_multi_aff upma2) const
{
  auto res = isl_union_pw_multi_aff_sub(copy(), upma2.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::subtract_domain(space space) const
{
  auto res = isl_union_pw_multi_aff_subtract_domain_space(copy(), space.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::subtract_domain(union_set uset) const
{
  auto res = isl_union_pw_multi_aff_subtract_domain_union_set(copy(), uset.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff::union_add(union_pw_multi_aff upma2) const
{
  auto res = isl_union_pw_multi_aff_union_add(copy(), upma2.release());
  return manage(res);
}

// implementations for isl::union_pw_multi_aff_list
union_pw_multi_aff_list manage(__isl_take isl_union_pw_multi_aff_list *ptr) {
  return union_pw_multi_aff_list(ptr);
}
union_pw_multi_aff_list manage_copy(__isl_keep isl_union_pw_multi_aff_list *ptr) {
  ptr = isl_union_pw_multi_aff_list_copy(ptr);
  return union_pw_multi_aff_list(ptr);
}

union_pw_multi_aff_list::union_pw_multi_aff_list()
    : ptr(nullptr) {}

union_pw_multi_aff_list::union_pw_multi_aff_list(const union_pw_multi_aff_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_pw_multi_aff_list::union_pw_multi_aff_list(__isl_take isl_union_pw_multi_aff_list *ptr)
    : ptr(ptr) {}


union_pw_multi_aff_list &union_pw_multi_aff_list::operator=(union_pw_multi_aff_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_pw_multi_aff_list::~union_pw_multi_aff_list() {
  if (ptr)
    isl_union_pw_multi_aff_list_free(ptr);
}

__isl_give isl_union_pw_multi_aff_list *union_pw_multi_aff_list::copy() const & {
  return isl_union_pw_multi_aff_list_copy(ptr);
}

__isl_keep isl_union_pw_multi_aff_list *union_pw_multi_aff_list::get() const {
  return ptr;
}

__isl_give isl_union_pw_multi_aff_list *union_pw_multi_aff_list::release() {
  isl_union_pw_multi_aff_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_pw_multi_aff_list::is_null() const {
  return ptr == nullptr;
}


ctx union_pw_multi_aff_list::get_ctx() const {
  return ctx(isl_union_pw_multi_aff_list_get_ctx(ptr));
}

void union_pw_multi_aff_list::dump() const {
  isl_union_pw_multi_aff_list_dump(get());
}


union_pw_multi_aff_list union_pw_multi_aff_list::add(union_pw_multi_aff el) const
{
  auto res = isl_union_pw_multi_aff_list_add(copy(), el.release());
  return manage(res);
}

union_pw_multi_aff_list union_pw_multi_aff_list::alloc(ctx ctx, int n)
{
  auto res = isl_union_pw_multi_aff_list_alloc(ctx.release(), n);
  return manage(res);
}

union_pw_multi_aff_list union_pw_multi_aff_list::clear() const
{
  auto res = isl_union_pw_multi_aff_list_clear(copy());
  return manage(res);
}

union_pw_multi_aff_list union_pw_multi_aff_list::concat(union_pw_multi_aff_list list2) const
{
  auto res = isl_union_pw_multi_aff_list_concat(copy(), list2.release());
  return manage(res);
}

union_pw_multi_aff_list union_pw_multi_aff_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_union_pw_multi_aff_list_drop(copy(), first, n);
  return manage(res);
}

stat union_pw_multi_aff_list::foreach(const std::function<stat(union_pw_multi_aff)> &fn) const
{
  struct fn_data {
    const std::function<stat(union_pw_multi_aff)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_union_pw_multi_aff *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_union_pw_multi_aff_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

union_pw_multi_aff_list union_pw_multi_aff_list::from_union_pw_multi_aff(union_pw_multi_aff el)
{
  auto res = isl_union_pw_multi_aff_list_from_union_pw_multi_aff(el.release());
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff_list::get_at(int index) const
{
  auto res = isl_union_pw_multi_aff_list_get_at(get(), index);
  return manage(res);
}

union_pw_multi_aff union_pw_multi_aff_list::get_union_pw_multi_aff(int index) const
{
  auto res = isl_union_pw_multi_aff_list_get_union_pw_multi_aff(get(), index);
  return manage(res);
}

union_pw_multi_aff_list union_pw_multi_aff_list::insert(unsigned int pos, union_pw_multi_aff el) const
{
  auto res = isl_union_pw_multi_aff_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size union_pw_multi_aff_list::n_union_pw_multi_aff() const
{
  auto res = isl_union_pw_multi_aff_list_n_union_pw_multi_aff(get());
  return res;
}

union_pw_multi_aff_list union_pw_multi_aff_list::reverse() const
{
  auto res = isl_union_pw_multi_aff_list_reverse(copy());
  return manage(res);
}

union_pw_multi_aff_list union_pw_multi_aff_list::set_union_pw_multi_aff(int index, union_pw_multi_aff el) const
{
  auto res = isl_union_pw_multi_aff_list_set_union_pw_multi_aff(copy(), index, el.release());
  return manage(res);
}

isl_size union_pw_multi_aff_list::size() const
{
  auto res = isl_union_pw_multi_aff_list_size(get());
  return res;
}

union_pw_multi_aff_list union_pw_multi_aff_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_union_pw_multi_aff_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::union_pw_qpolynomial
union_pw_qpolynomial manage(__isl_take isl_union_pw_qpolynomial *ptr) {
  return union_pw_qpolynomial(ptr);
}
union_pw_qpolynomial manage_copy(__isl_keep isl_union_pw_qpolynomial *ptr) {
  ptr = isl_union_pw_qpolynomial_copy(ptr);
  return union_pw_qpolynomial(ptr);
}

union_pw_qpolynomial::union_pw_qpolynomial()
    : ptr(nullptr) {}

union_pw_qpolynomial::union_pw_qpolynomial(const union_pw_qpolynomial &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_pw_qpolynomial::union_pw_qpolynomial(__isl_take isl_union_pw_qpolynomial *ptr)
    : ptr(ptr) {}

union_pw_qpolynomial::union_pw_qpolynomial(ctx ctx, const std::string &str)
{
  auto res = isl_union_pw_qpolynomial_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

union_pw_qpolynomial &union_pw_qpolynomial::operator=(union_pw_qpolynomial obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_pw_qpolynomial::~union_pw_qpolynomial() {
  if (ptr)
    isl_union_pw_qpolynomial_free(ptr);
}

__isl_give isl_union_pw_qpolynomial *union_pw_qpolynomial::copy() const & {
  return isl_union_pw_qpolynomial_copy(ptr);
}

__isl_keep isl_union_pw_qpolynomial *union_pw_qpolynomial::get() const {
  return ptr;
}

__isl_give isl_union_pw_qpolynomial *union_pw_qpolynomial::release() {
  isl_union_pw_qpolynomial *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_pw_qpolynomial::is_null() const {
  return ptr == nullptr;
}


ctx union_pw_qpolynomial::get_ctx() const {
  return ctx(isl_union_pw_qpolynomial_get_ctx(ptr));
}


union_pw_qpolynomial union_pw_qpolynomial::add(union_pw_qpolynomial upwqp2) const
{
  auto res = isl_union_pw_qpolynomial_add(copy(), upwqp2.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::add_pw_qpolynomial(pw_qpolynomial pwqp) const
{
  auto res = isl_union_pw_qpolynomial_add_pw_qpolynomial(copy(), pwqp.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::align_params(space model) const
{
  auto res = isl_union_pw_qpolynomial_align_params(copy(), model.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::coalesce() const
{
  auto res = isl_union_pw_qpolynomial_coalesce(copy());
  return manage(res);
}

isl_size union_pw_qpolynomial::dim(isl::dim type) const
{
  auto res = isl_union_pw_qpolynomial_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

union_set union_pw_qpolynomial::domain() const
{
  auto res = isl_union_pw_qpolynomial_domain(copy());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_union_pw_qpolynomial_drop_dims(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

val union_pw_qpolynomial::eval(point pnt) const
{
  auto res = isl_union_pw_qpolynomial_eval(copy(), pnt.release());
  return manage(res);
}

pw_qpolynomial union_pw_qpolynomial::extract_pw_qpolynomial(space space) const
{
  auto res = isl_union_pw_qpolynomial_extract_pw_qpolynomial(get(), space.release());
  return manage(res);
}

int union_pw_qpolynomial::find_dim_by_name(isl::dim type, const std::string &name) const
{
  auto res = isl_union_pw_qpolynomial_find_dim_by_name(get(), static_cast<enum isl_dim_type>(type), name.c_str());
  return res;
}

stat union_pw_qpolynomial::foreach_pw_qpolynomial(const std::function<stat(pw_qpolynomial)> &fn) const
{
  struct fn_data {
    const std::function<stat(pw_qpolynomial)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_pw_qpolynomial *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_union_pw_qpolynomial_foreach_pw_qpolynomial(get(), fn_lambda, &fn_data);
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::from_pw_qpolynomial(pw_qpolynomial pwqp)
{
  auto res = isl_union_pw_qpolynomial_from_pw_qpolynomial(pwqp.release());
  return manage(res);
}

pw_qpolynomial_list union_pw_qpolynomial::get_pw_qpolynomial_list() const
{
  auto res = isl_union_pw_qpolynomial_get_pw_qpolynomial_list(get());
  return manage(res);
}

space union_pw_qpolynomial::get_space() const
{
  auto res = isl_union_pw_qpolynomial_get_space(get());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::gist(union_set context) const
{
  auto res = isl_union_pw_qpolynomial_gist(copy(), context.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::gist_params(set context) const
{
  auto res = isl_union_pw_qpolynomial_gist_params(copy(), context.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::intersect_domain(union_set uset) const
{
  auto res = isl_union_pw_qpolynomial_intersect_domain(copy(), uset.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::intersect_domain_space(space space) const
{
  auto res = isl_union_pw_qpolynomial_intersect_domain_space(copy(), space.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::intersect_domain_union_set(union_set uset) const
{
  auto res = isl_union_pw_qpolynomial_intersect_domain_union_set(copy(), uset.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::intersect_domain_wrapped_domain(union_set uset) const
{
  auto res = isl_union_pw_qpolynomial_intersect_domain_wrapped_domain(copy(), uset.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::intersect_domain_wrapped_range(union_set uset) const
{
  auto res = isl_union_pw_qpolynomial_intersect_domain_wrapped_range(copy(), uset.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::intersect_params(set set) const
{
  auto res = isl_union_pw_qpolynomial_intersect_params(copy(), set.release());
  return manage(res);
}

boolean union_pw_qpolynomial::involves_nan() const
{
  auto res = isl_union_pw_qpolynomial_involves_nan(get());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::mul(union_pw_qpolynomial upwqp2) const
{
  auto res = isl_union_pw_qpolynomial_mul(copy(), upwqp2.release());
  return manage(res);
}

isl_size union_pw_qpolynomial::n_pw_qpolynomial() const
{
  auto res = isl_union_pw_qpolynomial_n_pw_qpolynomial(get());
  return res;
}

union_pw_qpolynomial union_pw_qpolynomial::neg() const
{
  auto res = isl_union_pw_qpolynomial_neg(copy());
  return manage(res);
}

boolean union_pw_qpolynomial::plain_is_equal(const union_pw_qpolynomial &upwqp2) const
{
  auto res = isl_union_pw_qpolynomial_plain_is_equal(get(), upwqp2.get());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::reset_user() const
{
  auto res = isl_union_pw_qpolynomial_reset_user(copy());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::scale_down_val(val v) const
{
  auto res = isl_union_pw_qpolynomial_scale_down_val(copy(), v.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::scale_val(val v) const
{
  auto res = isl_union_pw_qpolynomial_scale_val(copy(), v.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::sub(union_pw_qpolynomial upwqp2) const
{
  auto res = isl_union_pw_qpolynomial_sub(copy(), upwqp2.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::subtract_domain(union_set uset) const
{
  auto res = isl_union_pw_qpolynomial_subtract_domain(copy(), uset.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::subtract_domain_space(space space) const
{
  auto res = isl_union_pw_qpolynomial_subtract_domain_space(copy(), space.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::subtract_domain_union_set(union_set uset) const
{
  auto res = isl_union_pw_qpolynomial_subtract_domain_union_set(copy(), uset.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::to_polynomial(int sign) const
{
  auto res = isl_union_pw_qpolynomial_to_polynomial(copy(), sign);
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::zero(space space)
{
  auto res = isl_union_pw_qpolynomial_zero(space.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::zero_ctx(ctx ctx)
{
  auto res = isl_union_pw_qpolynomial_zero_ctx(ctx.release());
  return manage(res);
}

union_pw_qpolynomial union_pw_qpolynomial::zero_space(space space)
{
  auto res = isl_union_pw_qpolynomial_zero_space(space.release());
  return manage(res);
}

// implementations for isl::union_set
union_set manage(__isl_take isl_union_set *ptr) {
  return union_set(ptr);
}
union_set manage_copy(__isl_keep isl_union_set *ptr) {
  ptr = isl_union_set_copy(ptr);
  return union_set(ptr);
}

union_set::union_set()
    : ptr(nullptr) {}

union_set::union_set(const union_set &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_set::union_set(__isl_take isl_union_set *ptr)
    : ptr(ptr) {}

union_set::union_set(basic_set bset)
{
  auto res = isl_union_set_from_basic_set(bset.release());
  ptr = res;
}
union_set::union_set(point pnt)
{
  auto res = isl_union_set_from_point(pnt.release());
  ptr = res;
}
union_set::union_set(set set)
{
  auto res = isl_union_set_from_set(set.release());
  ptr = res;
}
union_set::union_set(ctx ctx, const std::string &str)
{
  auto res = isl_union_set_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

union_set &union_set::operator=(union_set obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_set::~union_set() {
  if (ptr)
    isl_union_set_free(ptr);
}

__isl_give isl_union_set *union_set::copy() const & {
  return isl_union_set_copy(ptr);
}

__isl_keep isl_union_set *union_set::get() const {
  return ptr;
}

__isl_give isl_union_set *union_set::release() {
  isl_union_set *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_set::is_null() const {
  return ptr == nullptr;
}


ctx union_set::get_ctx() const {
  return ctx(isl_union_set_get_ctx(ptr));
}

void union_set::dump() const {
  isl_union_set_dump(get());
}


union_set union_set::add_set(set set) const
{
  auto res = isl_union_set_add_set(copy(), set.release());
  return manage(res);
}

union_set union_set::affine_hull() const
{
  auto res = isl_union_set_affine_hull(copy());
  return manage(res);
}

union_set union_set::align_params(space model) const
{
  auto res = isl_union_set_align_params(copy(), model.release());
  return manage(res);
}

union_set union_set::apply(union_map umap) const
{
  auto res = isl_union_set_apply(copy(), umap.release());
  return manage(res);
}

union_set union_set::coalesce() const
{
  auto res = isl_union_set_coalesce(copy());
  return manage(res);
}

union_set union_set::coefficients() const
{
  auto res = isl_union_set_coefficients(copy());
  return manage(res);
}

schedule union_set::compute_schedule(union_map validity, union_map proximity) const
{
  auto res = isl_union_set_compute_schedule(copy(), validity.release(), proximity.release());
  return manage(res);
}

boolean union_set::contains(const space &space) const
{
  auto res = isl_union_set_contains(get(), space.get());
  return manage(res);
}

union_set union_set::detect_equalities() const
{
  auto res = isl_union_set_detect_equalities(copy());
  return manage(res);
}

isl_size union_set::dim(isl::dim type) const
{
  auto res = isl_union_set_dim(get(), static_cast<enum isl_dim_type>(type));
  return res;
}

union_set union_set::empty(space space)
{
  auto res = isl_union_set_empty(space.release());
  return manage(res);
}

union_set union_set::empty(ctx ctx)
{
  auto res = isl_union_set_empty_ctx(ctx.release());
  return manage(res);
}

union_set union_set::empty_space(space space)
{
  auto res = isl_union_set_empty_space(space.release());
  return manage(res);
}

set union_set::extract_set(space space) const
{
  auto res = isl_union_set_extract_set(get(), space.release());
  return manage(res);
}

stat union_set::foreach_point(const std::function<stat(point)> &fn) const
{
  struct fn_data {
    const std::function<stat(point)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_point *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_union_set_foreach_point(get(), fn_lambda, &fn_data);
  return manage(res);
}

stat union_set::foreach_set(const std::function<stat(set)> &fn) const
{
  struct fn_data {
    const std::function<stat(set)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_set *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_union_set_foreach_set(get(), fn_lambda, &fn_data);
  return manage(res);
}

basic_set_list union_set::get_basic_set_list() const
{
  auto res = isl_union_set_get_basic_set_list(get());
  return manage(res);
}

uint32_t union_set::get_hash() const
{
  auto res = isl_union_set_get_hash(get());
  return res;
}

set_list union_set::get_set_list() const
{
  auto res = isl_union_set_get_set_list(get());
  return manage(res);
}

space union_set::get_space() const
{
  auto res = isl_union_set_get_space(get());
  return manage(res);
}

union_set union_set::gist(union_set context) const
{
  auto res = isl_union_set_gist(copy(), context.release());
  return manage(res);
}

union_set union_set::gist_params(set set) const
{
  auto res = isl_union_set_gist_params(copy(), set.release());
  return manage(res);
}

union_map union_set::identity() const
{
  auto res = isl_union_set_identity(copy());
  return manage(res);
}

union_pw_multi_aff union_set::identity_union_pw_multi_aff() const
{
  auto res = isl_union_set_identity_union_pw_multi_aff(copy());
  return manage(res);
}

union_set union_set::intersect(union_set uset2) const
{
  auto res = isl_union_set_intersect(copy(), uset2.release());
  return manage(res);
}

union_set union_set::intersect_params(set set) const
{
  auto res = isl_union_set_intersect_params(copy(), set.release());
  return manage(res);
}

boolean union_set::is_disjoint(const union_set &uset2) const
{
  auto res = isl_union_set_is_disjoint(get(), uset2.get());
  return manage(res);
}

boolean union_set::is_empty() const
{
  auto res = isl_union_set_is_empty(get());
  return manage(res);
}

boolean union_set::is_equal(const union_set &uset2) const
{
  auto res = isl_union_set_is_equal(get(), uset2.get());
  return manage(res);
}

boolean union_set::is_params() const
{
  auto res = isl_union_set_is_params(get());
  return manage(res);
}

boolean union_set::is_strict_subset(const union_set &uset2) const
{
  auto res = isl_union_set_is_strict_subset(get(), uset2.get());
  return manage(res);
}

boolean union_set::is_subset(const union_set &uset2) const
{
  auto res = isl_union_set_is_subset(get(), uset2.get());
  return manage(res);
}

boolean union_set::isa_set() const
{
  auto res = isl_union_set_isa_set(get());
  return manage(res);
}

union_map union_set::lex_ge_union_set(union_set uset2) const
{
  auto res = isl_union_set_lex_ge_union_set(copy(), uset2.release());
  return manage(res);
}

union_map union_set::lex_gt_union_set(union_set uset2) const
{
  auto res = isl_union_set_lex_gt_union_set(copy(), uset2.release());
  return manage(res);
}

union_map union_set::lex_le_union_set(union_set uset2) const
{
  auto res = isl_union_set_lex_le_union_set(copy(), uset2.release());
  return manage(res);
}

union_map union_set::lex_lt_union_set(union_set uset2) const
{
  auto res = isl_union_set_lex_lt_union_set(copy(), uset2.release());
  return manage(res);
}

union_set union_set::lexmax() const
{
  auto res = isl_union_set_lexmax(copy());
  return manage(res);
}

union_set union_set::lexmin() const
{
  auto res = isl_union_set_lexmin(copy());
  return manage(res);
}

multi_val union_set::min_multi_union_pw_aff(const multi_union_pw_aff &obj) const
{
  auto res = isl_union_set_min_multi_union_pw_aff(get(), obj.get());
  return manage(res);
}

isl_size union_set::n_set() const
{
  auto res = isl_union_set_n_set(get());
  return res;
}

set union_set::params() const
{
  auto res = isl_union_set_params(copy());
  return manage(res);
}

union_set union_set::polyhedral_hull() const
{
  auto res = isl_union_set_polyhedral_hull(copy());
  return manage(res);
}

union_set union_set::preimage(multi_aff ma) const
{
  auto res = isl_union_set_preimage_multi_aff(copy(), ma.release());
  return manage(res);
}

union_set union_set::preimage(pw_multi_aff pma) const
{
  auto res = isl_union_set_preimage_pw_multi_aff(copy(), pma.release());
  return manage(res);
}

union_set union_set::preimage(union_pw_multi_aff upma) const
{
  auto res = isl_union_set_preimage_union_pw_multi_aff(copy(), upma.release());
  return manage(res);
}

union_set union_set::product(union_set uset2) const
{
  auto res = isl_union_set_product(copy(), uset2.release());
  return manage(res);
}

union_set union_set::project_out(isl::dim type, unsigned int first, unsigned int n) const
{
  auto res = isl_union_set_project_out(copy(), static_cast<enum isl_dim_type>(type), first, n);
  return manage(res);
}

union_set union_set::project_out_all_params() const
{
  auto res = isl_union_set_project_out_all_params(copy());
  return manage(res);
}

union_set union_set::remove_divs() const
{
  auto res = isl_union_set_remove_divs(copy());
  return manage(res);
}

union_set union_set::remove_redundancies() const
{
  auto res = isl_union_set_remove_redundancies(copy());
  return manage(res);
}

union_set union_set::reset_user() const
{
  auto res = isl_union_set_reset_user(copy());
  return manage(res);
}

basic_set union_set::sample() const
{
  auto res = isl_union_set_sample(copy());
  return manage(res);
}

point union_set::sample_point() const
{
  auto res = isl_union_set_sample_point(copy());
  return manage(res);
}

union_set union_set::simple_hull() const
{
  auto res = isl_union_set_simple_hull(copy());
  return manage(res);
}

union_set union_set::solutions() const
{
  auto res = isl_union_set_solutions(copy());
  return manage(res);
}

union_set union_set::subtract(union_set uset2) const
{
  auto res = isl_union_set_subtract(copy(), uset2.release());
  return manage(res);
}

union_set union_set::unite(union_set uset2) const
{
  auto res = isl_union_set_union(copy(), uset2.release());
  return manage(res);
}

union_set union_set::universe() const
{
  auto res = isl_union_set_universe(copy());
  return manage(res);
}

union_map union_set::unwrap() const
{
  auto res = isl_union_set_unwrap(copy());
  return manage(res);
}

union_map union_set::wrapped_domain_map() const
{
  auto res = isl_union_set_wrapped_domain_map(copy());
  return manage(res);
}

// implementations for isl::union_set_list
union_set_list manage(__isl_take isl_union_set_list *ptr) {
  return union_set_list(ptr);
}
union_set_list manage_copy(__isl_keep isl_union_set_list *ptr) {
  ptr = isl_union_set_list_copy(ptr);
  return union_set_list(ptr);
}

union_set_list::union_set_list()
    : ptr(nullptr) {}

union_set_list::union_set_list(const union_set_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


union_set_list::union_set_list(__isl_take isl_union_set_list *ptr)
    : ptr(ptr) {}


union_set_list &union_set_list::operator=(union_set_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

union_set_list::~union_set_list() {
  if (ptr)
    isl_union_set_list_free(ptr);
}

__isl_give isl_union_set_list *union_set_list::copy() const & {
  return isl_union_set_list_copy(ptr);
}

__isl_keep isl_union_set_list *union_set_list::get() const {
  return ptr;
}

__isl_give isl_union_set_list *union_set_list::release() {
  isl_union_set_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool union_set_list::is_null() const {
  return ptr == nullptr;
}


ctx union_set_list::get_ctx() const {
  return ctx(isl_union_set_list_get_ctx(ptr));
}

void union_set_list::dump() const {
  isl_union_set_list_dump(get());
}


union_set_list union_set_list::add(union_set el) const
{
  auto res = isl_union_set_list_add(copy(), el.release());
  return manage(res);
}

union_set_list union_set_list::alloc(ctx ctx, int n)
{
  auto res = isl_union_set_list_alloc(ctx.release(), n);
  return manage(res);
}

union_set_list union_set_list::clear() const
{
  auto res = isl_union_set_list_clear(copy());
  return manage(res);
}

union_set_list union_set_list::concat(union_set_list list2) const
{
  auto res = isl_union_set_list_concat(copy(), list2.release());
  return manage(res);
}

union_set_list union_set_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_union_set_list_drop(copy(), first, n);
  return manage(res);
}

stat union_set_list::foreach(const std::function<stat(union_set)> &fn) const
{
  struct fn_data {
    const std::function<stat(union_set)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_union_set *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_union_set_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

union_set_list union_set_list::from_union_set(union_set el)
{
  auto res = isl_union_set_list_from_union_set(el.release());
  return manage(res);
}

union_set union_set_list::get_at(int index) const
{
  auto res = isl_union_set_list_get_at(get(), index);
  return manage(res);
}

union_set union_set_list::get_union_set(int index) const
{
  auto res = isl_union_set_list_get_union_set(get(), index);
  return manage(res);
}

union_set_list union_set_list::insert(unsigned int pos, union_set el) const
{
  auto res = isl_union_set_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size union_set_list::n_union_set() const
{
  auto res = isl_union_set_list_n_union_set(get());
  return res;
}

union_set_list union_set_list::reverse() const
{
  auto res = isl_union_set_list_reverse(copy());
  return manage(res);
}

union_set_list union_set_list::set_union_set(int index, union_set el) const
{
  auto res = isl_union_set_list_set_union_set(copy(), index, el.release());
  return manage(res);
}

isl_size union_set_list::size() const
{
  auto res = isl_union_set_list_size(get());
  return res;
}

union_set_list union_set_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_union_set_list_swap(copy(), pos1, pos2);
  return manage(res);
}

union_set union_set_list::unite() const
{
  auto res = isl_union_set_list_union(copy());
  return manage(res);
}

// implementations for isl::val
val manage(__isl_take isl_val *ptr) {
  return val(ptr);
}
val manage_copy(__isl_keep isl_val *ptr) {
  ptr = isl_val_copy(ptr);
  return val(ptr);
}

val::val()
    : ptr(nullptr) {}

val::val(const val &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


val::val(__isl_take isl_val *ptr)
    : ptr(ptr) {}

val::val(ctx ctx, long i)
{
  auto res = isl_val_int_from_si(ctx.release(), i);
  ptr = res;
}
val::val(ctx ctx, const std::string &str)
{
  auto res = isl_val_read_from_str(ctx.release(), str.c_str());
  ptr = res;
}

val &val::operator=(val obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

val::~val() {
  if (ptr)
    isl_val_free(ptr);
}

__isl_give isl_val *val::copy() const & {
  return isl_val_copy(ptr);
}

__isl_keep isl_val *val::get() const {
  return ptr;
}

__isl_give isl_val *val::release() {
  isl_val *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool val::is_null() const {
  return ptr == nullptr;
}


ctx val::get_ctx() const {
  return ctx(isl_val_get_ctx(ptr));
}

void val::dump() const {
  isl_val_dump(get());
}


val val::abs() const
{
  auto res = isl_val_abs(copy());
  return manage(res);
}

boolean val::abs_eq(const val &v2) const
{
  auto res = isl_val_abs_eq(get(), v2.get());
  return manage(res);
}

val val::add(val v2) const
{
  auto res = isl_val_add(copy(), v2.release());
  return manage(res);
}

val val::add_ui(unsigned long v2) const
{
  auto res = isl_val_add_ui(copy(), v2);
  return manage(res);
}

val val::ceil() const
{
  auto res = isl_val_ceil(copy());
  return manage(res);
}

int val::cmp_si(long i) const
{
  auto res = isl_val_cmp_si(get(), i);
  return res;
}

val val::div(val v2) const
{
  auto res = isl_val_div(copy(), v2.release());
  return manage(res);
}

val val::div_ui(unsigned long v2) const
{
  auto res = isl_val_div_ui(copy(), v2);
  return manage(res);
}

boolean val::eq(const val &v2) const
{
  auto res = isl_val_eq(get(), v2.get());
  return manage(res);
}

boolean val::eq_si(long i) const
{
  auto res = isl_val_eq_si(get(), i);
  return manage(res);
}

val val::floor() const
{
  auto res = isl_val_floor(copy());
  return manage(res);
}

val val::gcd(val v2) const
{
  auto res = isl_val_gcd(copy(), v2.release());
  return manage(res);
}

boolean val::ge(const val &v2) const
{
  auto res = isl_val_ge(get(), v2.get());
  return manage(res);
}

uint32_t val::get_hash() const
{
  auto res = isl_val_get_hash(get());
  return res;
}

long val::get_num_si() const
{
  auto res = isl_val_get_num_si(get());
  return res;
}

boolean val::gt(const val &v2) const
{
  auto res = isl_val_gt(get(), v2.get());
  return manage(res);
}

boolean val::gt_si(long i) const
{
  auto res = isl_val_gt_si(get(), i);
  return manage(res);
}

val val::infty(ctx ctx)
{
  auto res = isl_val_infty(ctx.release());
  return manage(res);
}

val val::int_from_ui(ctx ctx, unsigned long u)
{
  auto res = isl_val_int_from_ui(ctx.release(), u);
  return manage(res);
}

val val::inv() const
{
  auto res = isl_val_inv(copy());
  return manage(res);
}

boolean val::is_divisible_by(const val &v2) const
{
  auto res = isl_val_is_divisible_by(get(), v2.get());
  return manage(res);
}

boolean val::is_infty() const
{
  auto res = isl_val_is_infty(get());
  return manage(res);
}

boolean val::is_int() const
{
  auto res = isl_val_is_int(get());
  return manage(res);
}

boolean val::is_nan() const
{
  auto res = isl_val_is_nan(get());
  return manage(res);
}

boolean val::is_neg() const
{
  auto res = isl_val_is_neg(get());
  return manage(res);
}

boolean val::is_neginfty() const
{
  auto res = isl_val_is_neginfty(get());
  return manage(res);
}

boolean val::is_negone() const
{
  auto res = isl_val_is_negone(get());
  return manage(res);
}

boolean val::is_nonneg() const
{
  auto res = isl_val_is_nonneg(get());
  return manage(res);
}

boolean val::is_nonpos() const
{
  auto res = isl_val_is_nonpos(get());
  return manage(res);
}

boolean val::is_one() const
{
  auto res = isl_val_is_one(get());
  return manage(res);
}

boolean val::is_pos() const
{
  auto res = isl_val_is_pos(get());
  return manage(res);
}

boolean val::is_rat() const
{
  auto res = isl_val_is_rat(get());
  return manage(res);
}

boolean val::is_zero() const
{
  auto res = isl_val_is_zero(get());
  return manage(res);
}

boolean val::le(const val &v2) const
{
  auto res = isl_val_le(get(), v2.get());
  return manage(res);
}

boolean val::lt(const val &v2) const
{
  auto res = isl_val_lt(get(), v2.get());
  return manage(res);
}

val val::max(val v2) const
{
  auto res = isl_val_max(copy(), v2.release());
  return manage(res);
}

val val::min(val v2) const
{
  auto res = isl_val_min(copy(), v2.release());
  return manage(res);
}

val val::mod(val v2) const
{
  auto res = isl_val_mod(copy(), v2.release());
  return manage(res);
}

val val::mul(val v2) const
{
  auto res = isl_val_mul(copy(), v2.release());
  return manage(res);
}

val val::mul_ui(unsigned long v2) const
{
  auto res = isl_val_mul_ui(copy(), v2);
  return manage(res);
}

isl_size val::n_abs_num_chunks(size_t size) const
{
  auto res = isl_val_n_abs_num_chunks(get(), size);
  return res;
}

val val::nan(ctx ctx)
{
  auto res = isl_val_nan(ctx.release());
  return manage(res);
}

boolean val::ne(const val &v2) const
{
  auto res = isl_val_ne(get(), v2.get());
  return manage(res);
}

val val::neg() const
{
  auto res = isl_val_neg(copy());
  return manage(res);
}

val val::neginfty(ctx ctx)
{
  auto res = isl_val_neginfty(ctx.release());
  return manage(res);
}

val val::negone(ctx ctx)
{
  auto res = isl_val_negone(ctx.release());
  return manage(res);
}

val val::one(ctx ctx)
{
  auto res = isl_val_one(ctx.release());
  return manage(res);
}

val val::pow2() const
{
  auto res = isl_val_pow2(copy());
  return manage(res);
}

val val::set_si(long i) const
{
  auto res = isl_val_set_si(copy(), i);
  return manage(res);
}

int val::sgn() const
{
  auto res = isl_val_sgn(get());
  return res;
}

val val::sub(val v2) const
{
  auto res = isl_val_sub(copy(), v2.release());
  return manage(res);
}

val val::sub_ui(unsigned long v2) const
{
  auto res = isl_val_sub_ui(copy(), v2);
  return manage(res);
}

val val::trunc() const
{
  auto res = isl_val_trunc(copy());
  return manage(res);
}

val val::zero(ctx ctx)
{
  auto res = isl_val_zero(ctx.release());
  return manage(res);
}

// implementations for isl::val_list
val_list manage(__isl_take isl_val_list *ptr) {
  return val_list(ptr);
}
val_list manage_copy(__isl_keep isl_val_list *ptr) {
  ptr = isl_val_list_copy(ptr);
  return val_list(ptr);
}

val_list::val_list()
    : ptr(nullptr) {}

val_list::val_list(const val_list &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


val_list::val_list(__isl_take isl_val_list *ptr)
    : ptr(ptr) {}


val_list &val_list::operator=(val_list obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

val_list::~val_list() {
  if (ptr)
    isl_val_list_free(ptr);
}

__isl_give isl_val_list *val_list::copy() const & {
  return isl_val_list_copy(ptr);
}

__isl_keep isl_val_list *val_list::get() const {
  return ptr;
}

__isl_give isl_val_list *val_list::release() {
  isl_val_list *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool val_list::is_null() const {
  return ptr == nullptr;
}


ctx val_list::get_ctx() const {
  return ctx(isl_val_list_get_ctx(ptr));
}

void val_list::dump() const {
  isl_val_list_dump(get());
}


val_list val_list::add(val el) const
{
  auto res = isl_val_list_add(copy(), el.release());
  return manage(res);
}

val_list val_list::alloc(ctx ctx, int n)
{
  auto res = isl_val_list_alloc(ctx.release(), n);
  return manage(res);
}

val_list val_list::clear() const
{
  auto res = isl_val_list_clear(copy());
  return manage(res);
}

val_list val_list::concat(val_list list2) const
{
  auto res = isl_val_list_concat(copy(), list2.release());
  return manage(res);
}

val_list val_list::drop(unsigned int first, unsigned int n) const
{
  auto res = isl_val_list_drop(copy(), first, n);
  return manage(res);
}

stat val_list::foreach(const std::function<stat(val)> &fn) const
{
  struct fn_data {
    const std::function<stat(val)> *func;
  } fn_data = { &fn };
  auto fn_lambda = [](isl_val *arg_0, void *arg_1) -> isl_stat {
    auto *data = static_cast<struct fn_data *>(arg_1);
    stat ret = (*data->func)(manage(arg_0));
    return ret.release();
  };
  auto res = isl_val_list_foreach(get(), fn_lambda, &fn_data);
  return manage(res);
}

val_list val_list::from_val(val el)
{
  auto res = isl_val_list_from_val(el.release());
  return manage(res);
}

val val_list::get_at(int index) const
{
  auto res = isl_val_list_get_at(get(), index);
  return manage(res);
}

val val_list::get_val(int index) const
{
  auto res = isl_val_list_get_val(get(), index);
  return manage(res);
}

val_list val_list::insert(unsigned int pos, val el) const
{
  auto res = isl_val_list_insert(copy(), pos, el.release());
  return manage(res);
}

isl_size val_list::n_val() const
{
  auto res = isl_val_list_n_val(get());
  return res;
}

val_list val_list::reverse() const
{
  auto res = isl_val_list_reverse(copy());
  return manage(res);
}

val_list val_list::set_val(int index, val el) const
{
  auto res = isl_val_list_set_val(copy(), index, el.release());
  return manage(res);
}

isl_size val_list::size() const
{
  auto res = isl_val_list_size(get());
  return res;
}

val_list val_list::swap(unsigned int pos1, unsigned int pos2) const
{
  auto res = isl_val_list_swap(copy(), pos1, pos2);
  return manage(res);
}

// implementations for isl::vec
vec manage(__isl_take isl_vec *ptr) {
  return vec(ptr);
}
vec manage_copy(__isl_keep isl_vec *ptr) {
  ptr = isl_vec_copy(ptr);
  return vec(ptr);
}

vec::vec()
    : ptr(nullptr) {}

vec::vec(const vec &obj)
    : ptr(nullptr)
{
  ptr = obj.copy();
}


vec::vec(__isl_take isl_vec *ptr)
    : ptr(ptr) {}


vec &vec::operator=(vec obj) {
  std::swap(this->ptr, obj.ptr);
  return *this;
}

vec::~vec() {
  if (ptr)
    isl_vec_free(ptr);
}

__isl_give isl_vec *vec::copy() const & {
  return isl_vec_copy(ptr);
}

__isl_keep isl_vec *vec::get() const {
  return ptr;
}

__isl_give isl_vec *vec::release() {
  isl_vec *tmp = ptr;
  ptr = nullptr;
  return tmp;
}

bool vec::is_null() const {
  return ptr == nullptr;
}


ctx vec::get_ctx() const {
  return ctx(isl_vec_get_ctx(ptr));
}

void vec::dump() const {
  isl_vec_dump(get());
}


vec vec::add(vec vec2) const
{
  auto res = isl_vec_add(copy(), vec2.release());
  return manage(res);
}

vec vec::add_els(unsigned int n) const
{
  auto res = isl_vec_add_els(copy(), n);
  return manage(res);
}

vec vec::alloc(ctx ctx, unsigned int size)
{
  auto res = isl_vec_alloc(ctx.release(), size);
  return manage(res);
}

vec vec::ceil() const
{
  auto res = isl_vec_ceil(copy());
  return manage(res);
}

vec vec::clr() const
{
  auto res = isl_vec_clr(copy());
  return manage(res);
}

int vec::cmp_element(const vec &vec2, int pos) const
{
  auto res = isl_vec_cmp_element(get(), vec2.get(), pos);
  return res;
}

vec vec::concat(vec vec2) const
{
  auto res = isl_vec_concat(copy(), vec2.release());
  return manage(res);
}

vec vec::drop_els(unsigned int pos, unsigned int n) const
{
  auto res = isl_vec_drop_els(copy(), pos, n);
  return manage(res);
}

vec vec::extend(unsigned int size) const
{
  auto res = isl_vec_extend(copy(), size);
  return manage(res);
}

val vec::get_element_val(int pos) const
{
  auto res = isl_vec_get_element_val(get(), pos);
  return manage(res);
}

vec vec::insert_els(unsigned int pos, unsigned int n) const
{
  auto res = isl_vec_insert_els(copy(), pos, n);
  return manage(res);
}

vec vec::insert_zero_els(unsigned int pos, unsigned int n) const
{
  auto res = isl_vec_insert_zero_els(copy(), pos, n);
  return manage(res);
}

boolean vec::is_equal(const vec &vec2) const
{
  auto res = isl_vec_is_equal(get(), vec2.get());
  return manage(res);
}

vec vec::mat_product(mat mat) const
{
  auto res = isl_vec_mat_product(copy(), mat.release());
  return manage(res);
}

vec vec::move_els(unsigned int dst_col, unsigned int src_col, unsigned int n) const
{
  auto res = isl_vec_move_els(copy(), dst_col, src_col, n);
  return manage(res);
}

vec vec::neg() const
{
  auto res = isl_vec_neg(copy());
  return manage(res);
}

vec vec::set_element_si(int pos, int v) const
{
  auto res = isl_vec_set_element_si(copy(), pos, v);
  return manage(res);
}

vec vec::set_element_val(int pos, val v) const
{
  auto res = isl_vec_set_element_val(copy(), pos, v.release());
  return manage(res);
}

vec vec::set_si(int v) const
{
  auto res = isl_vec_set_si(copy(), v);
  return manage(res);
}

vec vec::set_val(val v) const
{
  auto res = isl_vec_set_val(copy(), v.release());
  return manage(res);
}

isl_size vec::size() const
{
  auto res = isl_vec_size(get());
  return res;
}

vec vec::sort() const
{
  auto res = isl_vec_sort(copy());
  return manage(res);
}

vec vec::zero(ctx ctx, unsigned int size)
{
  auto res = isl_vec_zero(ctx.release(), size);
  return manage(res);
}

vec vec::zero_extend(unsigned int size) const
{
  auto res = isl_vec_zero_extend(copy(), size);
  return manage(res);
}
} // namespace noexceptions 
} // namespace isl

#endif /* ISL_CPP_CHECKED */
