/// 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 /* implicit */ aff(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ aff_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ ast_build(std::nullptr_t);
  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 explicit operator bool() 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 /* implicit */ ast_expr(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ ast_expr_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ ast_node(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ ast_node_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ basic_map(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ basic_map_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ basic_set_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ constraint(std::nullptr_t);
  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 explicit operator bool() 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 /* implicit */ constraint_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ fixed_box(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ id(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ id_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ id_to_ast_expr(std::nullptr_t);
  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 explicit operator bool() 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 /* implicit */ local_space(std::nullptr_t);
  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 explicit operator bool() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 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 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 /* implicit */ map_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ mat(std::nullptr_t);
  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 explicit operator bool() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ multi_id(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ multi_val(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ point(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ pw_aff_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ pw_multi_aff_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ pw_qpolynomial(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ pw_qpolynomial_fold_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ pw_qpolynomial_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ qpolynomial(std::nullptr_t);
  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 explicit operator bool() 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 /* implicit */ qpolynomial_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ schedule(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ schedule_constraints(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ schedule_node(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 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 /* implicit */ set_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ space(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ term(std::nullptr_t);
  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 explicit operator bool() 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 /* implicit */ union_access_info(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ union_flow(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ union_map_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ union_pw_aff_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ union_pw_multi_aff_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ union_pw_qpolynomial(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ union_set_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ val(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ val_list(std::nullptr_t);
  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 explicit operator bool() const;
  inline ctx get_ctx() const;
  inline std::string to_str() 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 /* implicit */ vec(std::nullptr_t);
  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 explicit operator bool() 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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
aff::operator bool() const {
  return !is_null();
}


ctx aff::get_ctx() const {
  return ctx(isl_aff_get_ctx(ptr));
}
std::string aff::to_str() const {
  char *Tmp = isl_aff_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
aff_list::operator bool() const {
  return !is_null();
}


ctx aff_list::get_ctx() const {
  return ctx(isl_aff_list_get_ctx(ptr));
}
std::string aff_list::to_str() const {
  char *Tmp = isl_aff_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
ast_build::operator bool() const {
  return !is_null();
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
ast_expr::operator bool() const {
  return !is_null();
}


ctx ast_expr::get_ctx() const {
  return ctx(isl_ast_expr_get_ctx(ptr));
}
std::string ast_expr::to_str() const {
  char *Tmp = isl_ast_expr_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
ast_expr_list::operator bool() const {
  return !is_null();
}


ctx ast_expr_list::get_ctx() const {
  return ctx(isl_ast_expr_list_get_ctx(ptr));
}
std::string ast_expr_list::to_str() const {
  char *Tmp = isl_ast_expr_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
ast_node::operator bool() const {
  return !is_null();
}


ctx ast_node::get_ctx() const {
  return ctx(isl_ast_node_get_ctx(ptr));
}
std::string ast_node::to_str() const {
  char *Tmp = isl_ast_node_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
ast_node_list::operator bool() const {
  return !is_null();
}


ctx ast_node_list::get_ctx() const {
  return ctx(isl_ast_node_list_get_ctx(ptr));
}
std::string ast_node_list::to_str() const {
  char *Tmp = isl_ast_node_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
basic_map::operator bool() const {
  return !is_null();
}


ctx basic_map::get_ctx() const {
  return ctx(isl_basic_map_get_ctx(ptr));
}
std::string basic_map::to_str() const {
  char *Tmp = isl_basic_map_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
basic_map_list::operator bool() const {
  return !is_null();
}


ctx basic_map_list::get_ctx() const {
  return ctx(isl_basic_map_list_get_ctx(ptr));
}
std::string basic_map_list::to_str() const {
  char *Tmp = isl_basic_map_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
basic_set::operator bool() const {
  return !is_null();
}


ctx basic_set::get_ctx() const {
  return ctx(isl_basic_set_get_ctx(ptr));
}
std::string basic_set::to_str() const {
  char *Tmp = isl_basic_set_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
basic_set_list::operator bool() const {
  return !is_null();
}


ctx basic_set_list::get_ctx() const {
  return ctx(isl_basic_set_list_get_ctx(ptr));
}
std::string basic_set_list::to_str() const {
  char *Tmp = isl_basic_set_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
constraint::operator bool() const {
  return !is_null();
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
constraint_list::operator bool() const {
  return !is_null();
}


ctx constraint_list::get_ctx() const {
  return ctx(isl_constraint_list_get_ctx(ptr));
}
std::string constraint_list::to_str() const {
  char *Tmp = isl_constraint_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
fixed_box::operator bool() const {
  return !is_null();
}


ctx fixed_box::get_ctx() const {
  return ctx(isl_fixed_box_get_ctx(ptr));
}
std::string fixed_box::to_str() const {
  char *Tmp = isl_fixed_box_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
id::operator bool() const {
  return !is_null();
}


ctx id::get_ctx() const {
  return ctx(isl_id_get_ctx(ptr));
}
std::string id::to_str() const {
  char *Tmp = isl_id_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
id_list::operator bool() const {
  return !is_null();
}


ctx id_list::get_ctx() const {
  return ctx(isl_id_list_get_ctx(ptr));
}
std::string id_list::to_str() const {
  char *Tmp = isl_id_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
id_to_ast_expr::operator bool() const {
  return !is_null();
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
local_space::operator bool() const {
  return !is_null();
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
map::operator bool() const {
  return !is_null();
}


ctx map::get_ctx() const {
  return ctx(isl_map_get_ctx(ptr));
}
std::string map::to_str() const {
  char *Tmp = isl_map_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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);
}

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);
}

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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
map_list::operator bool() const {
  return !is_null();
}


ctx map_list::get_ctx() const {
  return ctx(isl_map_list_get_ctx(ptr));
}
std::string map_list::to_str() const {
  char *Tmp = isl_map_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
mat::operator bool() const {
  return !is_null();
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
multi_aff::operator bool() const {
  return !is_null();
}


ctx multi_aff::get_ctx() const {
  return ctx(isl_multi_aff_get_ctx(ptr));
}
std::string multi_aff::to_str() const {
  char *Tmp = isl_multi_aff_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
multi_id::operator bool() const {
  return !is_null();
}


ctx multi_id::get_ctx() const {
  return ctx(isl_multi_id_get_ctx(ptr));
}
std::string multi_id::to_str() const {
  char *Tmp = isl_multi_id_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
multi_pw_aff::operator bool() const {
  return !is_null();
}


ctx multi_pw_aff::get_ctx() const {
  return ctx(isl_multi_pw_aff_get_ctx(ptr));
}
std::string multi_pw_aff::to_str() const {
  char *Tmp = isl_multi_pw_aff_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
multi_union_pw_aff::operator bool() const {
  return !is_null();
}


ctx multi_union_pw_aff::get_ctx() const {
  return ctx(isl_multi_union_pw_aff_get_ctx(ptr));
}
std::string multi_union_pw_aff::to_str() const {
  char *Tmp = isl_multi_union_pw_aff_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
multi_val::operator bool() const {
  return !is_null();
}


ctx multi_val::get_ctx() const {
  return ctx(isl_multi_val_get_ctx(ptr));
}
std::string multi_val::to_str() const {
  char *Tmp = isl_multi_val_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
point::operator bool() const {
  return !is_null();
}


ctx point::get_ctx() const {
  return ctx(isl_point_get_ctx(ptr));
}
std::string point::to_str() const {
  char *Tmp = isl_point_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
pw_aff::operator bool() const {
  return !is_null();
}


ctx pw_aff::get_ctx() const {
  return ctx(isl_pw_aff_get_ctx(ptr));
}
std::string pw_aff::to_str() const {
  char *Tmp = isl_pw_aff_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
pw_aff_list::operator bool() const {
  return !is_null();
}


ctx pw_aff_list::get_ctx() const {
  return ctx(isl_pw_aff_list_get_ctx(ptr));
}
std::string pw_aff_list::to_str() const {
  char *Tmp = isl_pw_aff_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
pw_multi_aff::operator bool() const {
  return !is_null();
}


ctx pw_multi_aff::get_ctx() const {
  return ctx(isl_pw_multi_aff_get_ctx(ptr));
}
std::string pw_multi_aff::to_str() const {
  char *Tmp = isl_pw_multi_aff_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
pw_multi_aff_list::operator bool() const {
  return !is_null();
}


ctx pw_multi_aff_list::get_ctx() const {
  return ctx(isl_pw_multi_aff_list_get_ctx(ptr));
}
std::string pw_multi_aff_list::to_str() const {
  char *Tmp = isl_pw_multi_aff_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
pw_qpolynomial::operator bool() const {
  return !is_null();
}


ctx pw_qpolynomial::get_ctx() const {
  return ctx(isl_pw_qpolynomial_get_ctx(ptr));
}
std::string pw_qpolynomial::to_str() const {
  char *Tmp = isl_pw_qpolynomial_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
pw_qpolynomial_fold_list::operator bool() const {
  return !is_null();
}


ctx pw_qpolynomial_fold_list::get_ctx() const {
  return ctx(isl_pw_qpolynomial_fold_list_get_ctx(ptr));
}
std::string pw_qpolynomial_fold_list::to_str() const {
  char *Tmp = isl_pw_qpolynomial_fold_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
pw_qpolynomial_list::operator bool() const {
  return !is_null();
}


ctx pw_qpolynomial_list::get_ctx() const {
  return ctx(isl_pw_qpolynomial_list_get_ctx(ptr));
}
std::string pw_qpolynomial_list::to_str() const {
  char *Tmp = isl_pw_qpolynomial_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
qpolynomial::operator bool() const {
  return !is_null();
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
qpolynomial_list::operator bool() const {
  return !is_null();
}


ctx qpolynomial_list::get_ctx() const {
  return ctx(isl_qpolynomial_list_get_ctx(ptr));
}
std::string qpolynomial_list::to_str() const {
  char *Tmp = isl_qpolynomial_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
schedule::operator bool() const {
  return !is_null();
}


ctx schedule::get_ctx() const {
  return ctx(isl_schedule_get_ctx(ptr));
}
std::string schedule::to_str() const {
  char *Tmp = isl_schedule_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
schedule_constraints::operator bool() const {
  return !is_null();
}


ctx schedule_constraints::get_ctx() const {
  return ctx(isl_schedule_constraints_get_ctx(ptr));
}
std::string schedule_constraints::to_str() const {
  char *Tmp = isl_schedule_constraints_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
schedule_node::operator bool() const {
  return !is_null();
}


ctx schedule_node::get_ctx() const {
  return ctx(isl_schedule_node_get_ctx(ptr));
}
std::string schedule_node::to_str() const {
  char *Tmp = isl_schedule_node_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
set::operator bool() const {
  return !is_null();
}


ctx set::get_ctx() const {
  return ctx(isl_set_get_ctx(ptr));
}
std::string set::to_str() const {
  char *Tmp = isl_set_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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);
}

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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
set_list::operator bool() const {
  return !is_null();
}


ctx set_list::get_ctx() const {
  return ctx(isl_set_list_get_ctx(ptr));
}
std::string set_list::to_str() const {
  char *Tmp = isl_set_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
space::operator bool() const {
  return !is_null();
}


ctx space::get_ctx() const {
  return ctx(isl_space_get_ctx(ptr));
}
std::string space::to_str() const {
  char *Tmp = isl_space_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
term::operator bool() const {
  return !is_null();
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_access_info::operator bool() const {
  return !is_null();
}


ctx union_access_info::get_ctx() const {
  return ctx(isl_union_access_info_get_ctx(ptr));
}
std::string union_access_info::to_str() const {
  char *Tmp = isl_union_access_info_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}



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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_flow::operator bool() const {
  return !is_null();
}


ctx union_flow::get_ctx() const {
  return ctx(isl_union_flow_get_ctx(ptr));
}
std::string union_flow::to_str() const {
  char *Tmp = isl_union_flow_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}



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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_map::operator bool() const {
  return !is_null();
}


ctx union_map::get_ctx() const {
  return ctx(isl_union_map_get_ctx(ptr));
}
std::string union_map::to_str() const {
  char *Tmp = isl_union_map_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_map_list::operator bool() const {
  return !is_null();
}


ctx union_map_list::get_ctx() const {
  return ctx(isl_union_map_list_get_ctx(ptr));
}
std::string union_map_list::to_str() const {
  char *Tmp = isl_union_map_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_pw_aff::operator bool() const {
  return !is_null();
}


ctx union_pw_aff::get_ctx() const {
  return ctx(isl_union_pw_aff_get_ctx(ptr));
}
std::string union_pw_aff::to_str() const {
  char *Tmp = isl_union_pw_aff_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_pw_aff_list::operator bool() const {
  return !is_null();
}


ctx union_pw_aff_list::get_ctx() const {
  return ctx(isl_union_pw_aff_list_get_ctx(ptr));
}
std::string union_pw_aff_list::to_str() const {
  char *Tmp = isl_union_pw_aff_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_pw_multi_aff::operator bool() const {
  return !is_null();
}


ctx union_pw_multi_aff::get_ctx() const {
  return ctx(isl_union_pw_multi_aff_get_ctx(ptr));
}
std::string union_pw_multi_aff::to_str() const {
  char *Tmp = isl_union_pw_multi_aff_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_pw_multi_aff_list::operator bool() const {
  return !is_null();
}


ctx union_pw_multi_aff_list::get_ctx() const {
  return ctx(isl_union_pw_multi_aff_list_get_ctx(ptr));
}
std::string union_pw_multi_aff_list::to_str() const {
  char *Tmp = isl_union_pw_multi_aff_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_pw_qpolynomial::operator bool() const {
  return !is_null();
}


ctx union_pw_qpolynomial::get_ctx() const {
  return ctx(isl_union_pw_qpolynomial_get_ctx(ptr));
}
std::string union_pw_qpolynomial::to_str() const {
  char *Tmp = isl_union_pw_qpolynomial_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}



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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_set::operator bool() const {
  return !is_null();
}


ctx union_set::get_ctx() const {
  return ctx(isl_union_set_get_ctx(ptr));
}
std::string union_set::to_str() const {
  char *Tmp = isl_union_set_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
union_set_list::operator bool() const {
  return !is_null();
}


ctx union_set_list::get_ctx() const {
  return ctx(isl_union_set_list_get_ctx(ptr));
}
std::string union_set_list::to_str() const {
  char *Tmp = isl_union_set_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
val::operator bool() const {
  return !is_null();
}


ctx val::get_ctx() const {
  return ctx(isl_val_get_ctx(ptr));
}
std::string val::to_str() const {
  char *Tmp = isl_val_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
val_list::operator bool() const {
  return !is_null();
}


ctx val_list::get_ctx() const {
  return ctx(isl_val_list_get_ctx(ptr));
}
std::string val_list::to_str() const {
  char *Tmp = isl_val_list_to_str(get());
  if (!Tmp)
    return "";
  std::string S(Tmp);
  free(Tmp);
  return S;
}


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(std::nullptr_t)
    : ptr(nullptr) {}


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;
}
vec::operator bool() const {
  return !is_null();
}


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 */
