diff --git a/lib/External/isl/include/isl/isl-noexceptions.h b/lib/External/isl/include/isl/isl-noexceptions.h
index 8e3610d..a66d539 100644
--- a/lib/External/isl/include/isl/isl-noexceptions.h
+++ b/lib/External/isl/include/isl/isl-noexceptions.h
@@ -54,7 +54,7 @@
   mutable bool checked = false;
   isl_bool val;
 
-  friend isl::boolean manage(isl_bool val);
+  friend boolean manage(isl_bool val);
   boolean(isl_bool val): val(val) {}
 public:
   boolean()
@@ -83,8 +83,8 @@
   }
 };
 
-inline isl::boolean manage(isl_bool val) {
-  return isl::boolean(val);
+inline boolean manage(isl_bool val) {
+  return boolean(val);
 }
 
 class ctx {
@@ -219,12 +219,12 @@
 class vec;
 
 // declarations for isl::aff
-inline isl::aff manage(__isl_take isl_aff *ptr);
-inline isl::aff manage_copy(__isl_keep isl_aff *ptr);
+inline aff manage(__isl_take isl_aff *ptr);
+inline aff manage_copy(__isl_keep isl_aff *ptr);
 
 class aff {
-  friend inline isl::aff manage(__isl_take isl_aff *ptr);
-  friend inline isl::aff manage_copy(__isl_keep isl_aff *ptr);
+  friend inline aff manage(__isl_take isl_aff *ptr);
+  friend inline aff manage_copy(__isl_keep isl_aff *ptr);
 
   isl_aff *ptr = nullptr;
 
@@ -232,12 +232,12 @@
 
 public:
   inline /* implicit */ aff();
-  inline /* implicit */ aff(const isl::aff &obj);
+  inline /* implicit */ aff(const aff &obj);
   inline /* implicit */ aff(std::nullptr_t);
-  inline explicit aff(isl::local_space ls);
-  inline explicit aff(isl::local_space ls, isl::val val);
-  inline explicit aff(isl::ctx ctx, const std::string &str);
-  inline isl::aff &operator=(isl::aff obj);
+  inline explicit aff(local_space ls);
+  inline explicit aff(local_space ls, val val);
+  inline explicit aff(ctx ctx, const std::string &str);
+  inline aff &operator=(aff obj);
   inline ~aff();
   inline __isl_give isl_aff *copy() const &;
   inline __isl_give isl_aff *copy() && = delete;
@@ -245,87 +245,87 @@
   inline __isl_give isl_aff *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::aff add(isl::aff aff2) const;
-  inline isl::aff add_coefficient_si(isl::dim type, int pos, int v) const;
-  inline isl::aff add_coefficient_val(isl::dim type, int pos, isl::val v) const;
-  inline isl::aff add_constant_num_si(int v) const;
-  inline isl::aff add_constant_si(int v) const;
-  inline isl::aff add_constant_val(isl::val v) const;
-  inline isl::aff add_dims(isl::dim type, unsigned int n) const;
-  inline isl::aff align_params(isl::space model) const;
-  inline isl::aff ceil() 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_num_si(int v) const;
+  inline aff add_constant_si(int v) const;
+  inline aff add_constant_val(val v) const;
+  inline aff add_dims(isl::dim type, unsigned int n) const;
+  inline aff align_params(space model) const;
+  inline aff ceil() const;
   inline int coefficient_sgn(isl::dim type, int pos) const;
   inline int dim(isl::dim type) const;
-  inline isl::aff div(isl::aff aff2) const;
-  inline isl::aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::basic_set eq_basic_set(isl::aff aff2) const;
-  inline isl::set eq_set(isl::aff aff2) const;
-  inline isl::val eval(isl::point pnt) 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 isl::aff floor() const;
-  inline isl::aff from_range() const;
-  inline isl::basic_set ge_basic_set(isl::aff aff2) const;
-  inline isl::set ge_set(isl::aff aff2) const;
-  inline isl::val get_coefficient_val(isl::dim type, int pos) const;
-  inline isl::val get_constant_val() const;
-  inline isl::val get_denominator_val() 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 isl::aff get_div(int pos) const;
-  inline isl::local_space get_domain_local_space() const;
-  inline isl::space get_domain_space() 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 isl::local_space get_local_space() const;
-  inline isl::space get_space() const;
-  inline isl::aff gist(isl::set context) const;
-  inline isl::aff gist_params(isl::set context) const;
-  inline isl::basic_set gt_basic_set(isl::aff aff2) const;
-  inline isl::set gt_set(isl::aff aff2) const;
-  inline isl::aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean is_cst() const;
-  inline isl::boolean is_nan() const;
-  inline isl::basic_set le_basic_set(isl::aff aff2) const;
-  inline isl::set le_set(isl::aff aff2) const;
-  inline isl::basic_set lt_basic_set(isl::aff aff2) const;
-  inline isl::set lt_set(isl::aff aff2) const;
-  inline isl::aff mod(isl::val mod) const;
-  inline isl::aff move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
-  inline isl::aff mul(isl::aff aff2) const;
-  static inline isl::aff nan_on_domain(isl::local_space ls);
-  inline isl::set ne_set(isl::aff aff2) const;
-  inline isl::aff neg() const;
-  inline isl::basic_set neg_basic_set() const;
-  static inline isl::aff param_on_domain_space_id(isl::space space, isl::id id);
-  inline isl::boolean plain_is_equal(const isl::aff &aff2) const;
-  inline isl::boolean plain_is_zero() const;
-  inline isl::aff project_domain_on_params() const;
-  inline isl::aff pullback(isl::multi_aff ma) const;
-  inline isl::aff pullback_aff(isl::aff aff2) const;
-  inline isl::aff scale(isl::val v) const;
-  inline isl::aff scale_down(isl::val v) const;
-  inline isl::aff scale_down_ui(unsigned int f) const;
-  inline isl::aff set_coefficient_si(isl::dim type, int pos, int v) const;
-  inline isl::aff set_coefficient_val(isl::dim type, int pos, isl::val v) const;
-  inline isl::aff set_constant_si(int v) const;
-  inline isl::aff set_constant_val(isl::val v) const;
-  inline isl::aff set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::aff set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::aff sub(isl::aff aff2) const;
-  static inline isl::aff var_on_domain(isl::local_space ls, isl::dim type, unsigned int pos);
-  inline isl::basic_set zero_basic_set() 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 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);
+  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;
+  static inline aff var_on_domain(local_space ls, isl::dim type, unsigned int pos);
+  inline basic_set zero_basic_set() const;
 };
 
 // declarations for isl::aff_list
-inline isl::aff_list manage(__isl_take isl_aff_list *ptr);
-inline isl::aff_list manage_copy(__isl_keep isl_aff_list *ptr);
+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 isl::aff_list manage(__isl_take isl_aff_list *ptr);
-  friend inline isl::aff_list manage_copy(__isl_keep isl_aff_list *ptr);
+  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;
 
@@ -333,9 +333,9 @@
 
 public:
   inline /* implicit */ aff_list();
-  inline /* implicit */ aff_list(const isl::aff_list &obj);
+  inline /* implicit */ aff_list(const aff_list &obj);
   inline /* implicit */ aff_list(std::nullptr_t);
-  inline isl::aff_list &operator=(isl::aff_list obj);
+  inline aff_list &operator=(aff_list obj);
   inline ~aff_list();
   inline __isl_give isl_aff_list *copy() const &;
   inline __isl_give isl_aff_list *copy() && = delete;
@@ -343,32 +343,32 @@
   inline __isl_give isl_aff_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::aff_list add(isl::aff el) const;
-  static inline isl::aff_list alloc(isl::ctx ctx, int n);
-  inline isl::aff_list concat(isl::aff_list list2) const;
-  inline isl::aff_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::aff)> &fn) const;
-  static inline isl::aff_list from_aff(isl::aff el);
-  inline isl::aff get_aff(int index) const;
-  inline isl::aff get_at(int index) const;
-  inline isl::aff_list insert(unsigned int pos, isl::aff el) const;
+  inline aff_list add(aff el) const;
+  static inline aff_list alloc(ctx ctx, int n);
+  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 int n_aff() const;
-  inline isl::aff_list reverse() const;
-  inline isl::aff_list set_aff(int index, isl::aff el) const;
+  inline aff_list reverse() const;
+  inline aff_list set_aff(int index, aff el) const;
   inline int size() const;
-  inline isl::aff_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline aff_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::ast_build
-inline isl::ast_build manage(__isl_take isl_ast_build *ptr);
-inline isl::ast_build manage_copy(__isl_keep isl_ast_build *ptr);
+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 isl::ast_build manage(__isl_take isl_ast_build *ptr);
-  friend inline isl::ast_build manage_copy(__isl_keep isl_ast_build *ptr);
+  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;
 
@@ -376,10 +376,10 @@
 
 public:
   inline /* implicit */ ast_build();
-  inline /* implicit */ ast_build(const isl::ast_build &obj);
+  inline /* implicit */ ast_build(const ast_build &obj);
   inline /* implicit */ ast_build(std::nullptr_t);
-  inline explicit ast_build(isl::ctx ctx);
-  inline isl::ast_build &operator=(isl::ast_build obj);
+  inline explicit ast_build(ctx ctx);
+  inline ast_build &operator=(ast_build obj);
   inline ~ast_build();
   inline __isl_give isl_ast_build *copy() const &;
   inline __isl_give isl_ast_build *copy() && = delete;
@@ -387,30 +387,30 @@
   inline __isl_give isl_ast_build *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
 
-  inline isl::ast_expr access_from(isl::pw_multi_aff pma) const;
-  inline isl::ast_expr access_from(isl::multi_pw_aff mpa) const;
-  inline isl::ast_node ast_from_schedule(isl::union_map schedule) const;
-  inline isl::ast_expr call_from(isl::pw_multi_aff pma) const;
-  inline isl::ast_expr call_from(isl::multi_pw_aff mpa) const;
-  inline isl::ast_expr expr_from(isl::set set) const;
-  inline isl::ast_expr expr_from(isl::pw_aff pa) const;
-  static inline isl::ast_build from_context(isl::set set);
-  inline isl::union_map get_schedule() const;
-  inline isl::space get_schedule_space() const;
-  inline isl::ast_node node_from_schedule(isl::schedule schedule) const;
-  inline isl::ast_node node_from_schedule_map(isl::union_map schedule) const;
-  inline isl::ast_build restrict(isl::set set) const;
+  inline ast_expr access_from(pw_multi_aff pma) const;
+  inline ast_expr access_from(multi_pw_aff mpa) const;
+  inline ast_node ast_from_schedule(union_map schedule) const;
+  inline ast_expr call_from(pw_multi_aff pma) const;
+  inline ast_expr call_from(multi_pw_aff mpa) const;
+  inline ast_expr expr_from(set set) const;
+  inline ast_expr expr_from(pw_aff pa) 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 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 isl::ast_expr manage(__isl_take isl_ast_expr *ptr);
-inline isl::ast_expr manage_copy(__isl_keep isl_ast_expr *ptr);
+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 isl::ast_expr manage(__isl_take isl_ast_expr *ptr);
-  friend inline isl::ast_expr manage_copy(__isl_keep isl_ast_expr *ptr);
+  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;
 
@@ -418,9 +418,9 @@
 
 public:
   inline /* implicit */ ast_expr();
-  inline /* implicit */ ast_expr(const isl::ast_expr &obj);
+  inline /* implicit */ ast_expr(const ast_expr &obj);
   inline /* implicit */ ast_expr(std::nullptr_t);
-  inline isl::ast_expr &operator=(isl::ast_expr obj);
+  inline ast_expr &operator=(ast_expr obj);
   inline ~ast_expr();
   inline __isl_give isl_ast_expr *copy() const &;
   inline __isl_give isl_ast_expr *copy() && = delete;
@@ -428,44 +428,44 @@
   inline __isl_give isl_ast_expr *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::ast_expr access(isl::ast_expr_list indices) const;
-  inline isl::ast_expr add(isl::ast_expr expr2) const;
-  inline isl::ast_expr address_of() const;
-  inline isl::ast_expr call(isl::ast_expr_list arguments) const;
-  inline isl::ast_expr div(isl::ast_expr expr2) const;
-  inline isl::ast_expr eq(isl::ast_expr expr2) const;
-  static inline isl::ast_expr from_id(isl::id id);
-  static inline isl::ast_expr from_val(isl::val v);
-  inline isl::ast_expr ge(isl::ast_expr expr2) const;
-  inline isl::id get_id() const;
-  inline isl::ast_expr get_op_arg(int pos) 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 int get_op_n_arg() const;
-  inline isl::val get_val() const;
-  inline isl::ast_expr gt(isl::ast_expr expr2) const;
-  inline isl::boolean is_equal(const isl::ast_expr &expr2) const;
-  inline isl::ast_expr le(isl::ast_expr expr2) const;
-  inline isl::ast_expr lt(isl::ast_expr expr2) const;
-  inline isl::ast_expr mul(isl::ast_expr expr2) const;
-  inline isl::ast_expr neg() const;
-  inline isl::ast_expr pdiv_q(isl::ast_expr expr2) const;
-  inline isl::ast_expr pdiv_r(isl::ast_expr expr2) const;
-  inline isl::ast_expr set_op_arg(int pos, isl::ast_expr arg) const;
-  inline isl::ast_expr sub(isl::ast_expr expr2) const;
-  inline isl::ast_expr substitute_ids(isl::id_to_ast_expr id2expr) const;
+  inline val get_val() const;
+  inline ast_expr gt(ast_expr expr2) 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 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 isl::ast_expr_list manage(__isl_take isl_ast_expr_list *ptr);
-inline isl::ast_expr_list manage_copy(__isl_keep isl_ast_expr_list *ptr);
+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 isl::ast_expr_list manage(__isl_take isl_ast_expr_list *ptr);
-  friend inline isl::ast_expr_list manage_copy(__isl_keep isl_ast_expr_list *ptr);
+  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;
 
@@ -473,9 +473,9 @@
 
 public:
   inline /* implicit */ ast_expr_list();
-  inline /* implicit */ ast_expr_list(const isl::ast_expr_list &obj);
+  inline /* implicit */ ast_expr_list(const ast_expr_list &obj);
   inline /* implicit */ ast_expr_list(std::nullptr_t);
-  inline isl::ast_expr_list &operator=(isl::ast_expr_list obj);
+  inline ast_expr_list &operator=(ast_expr_list obj);
   inline ~ast_expr_list();
   inline __isl_give isl_ast_expr_list *copy() const &;
   inline __isl_give isl_ast_expr_list *copy() && = delete;
@@ -483,32 +483,32 @@
   inline __isl_give isl_ast_expr_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::ast_expr_list add(isl::ast_expr el) const;
-  static inline isl::ast_expr_list alloc(isl::ctx ctx, int n);
-  inline isl::ast_expr_list concat(isl::ast_expr_list list2) const;
-  inline isl::ast_expr_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::ast_expr)> &fn) const;
-  static inline isl::ast_expr_list from_ast_expr(isl::ast_expr el);
-  inline isl::ast_expr get_ast_expr(int index) const;
-  inline isl::ast_expr get_at(int index) const;
-  inline isl::ast_expr_list insert(unsigned int pos, isl::ast_expr el) const;
+  inline ast_expr_list add(ast_expr el) const;
+  static inline ast_expr_list alloc(ctx ctx, int n);
+  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 int n_ast_expr() const;
-  inline isl::ast_expr_list reverse() const;
-  inline isl::ast_expr_list set_ast_expr(int index, isl::ast_expr el) const;
+  inline ast_expr_list reverse() const;
+  inline ast_expr_list set_ast_expr(int index, ast_expr el) const;
   inline int size() const;
-  inline isl::ast_expr_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline ast_expr_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::ast_node
-inline isl::ast_node manage(__isl_take isl_ast_node *ptr);
-inline isl::ast_node manage_copy(__isl_keep isl_ast_node *ptr);
+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 isl::ast_node manage(__isl_take isl_ast_node *ptr);
-  friend inline isl::ast_node manage_copy(__isl_keep isl_ast_node *ptr);
+  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;
 
@@ -516,9 +516,9 @@
 
 public:
   inline /* implicit */ ast_node();
-  inline /* implicit */ ast_node(const isl::ast_node &obj);
+  inline /* implicit */ ast_node(const ast_node &obj);
   inline /* implicit */ ast_node(std::nullptr_t);
-  inline isl::ast_node &operator=(isl::ast_node obj);
+  inline ast_node &operator=(ast_node obj);
   inline ~ast_node();
   inline __isl_give isl_ast_node *copy() const &;
   inline __isl_give isl_ast_node *copy() && = delete;
@@ -526,37 +526,37 @@
   inline __isl_give isl_ast_node *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  static inline isl::ast_node alloc_user(isl::ast_expr expr);
-  inline isl::ast_node_list block_get_children() const;
-  inline isl::ast_node for_get_body() const;
-  inline isl::ast_expr for_get_cond() const;
-  inline isl::ast_expr for_get_inc() const;
-  inline isl::ast_expr for_get_init() const;
-  inline isl::ast_expr for_get_iterator() const;
-  inline isl::boolean for_is_degenerate() const;
-  inline isl::id get_annotation() const;
-  inline isl::ast_expr if_get_cond() const;
-  inline isl::ast_node if_get_else() const;
-  inline isl::ast_node if_get_then() const;
-  inline isl::boolean if_has_else() const;
-  inline isl::id mark_get_id() const;
-  inline isl::ast_node mark_get_node() const;
-  inline isl::ast_node set_annotation(isl::id annotation) 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_then() const;
+  inline boolean if_has_else() 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 isl::ast_expr user_get_expr() const;
+  inline ast_expr user_get_expr() const;
 };
 
 // declarations for isl::ast_node_list
-inline isl::ast_node_list manage(__isl_take isl_ast_node_list *ptr);
-inline isl::ast_node_list manage_copy(__isl_keep isl_ast_node_list *ptr);
+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 isl::ast_node_list manage(__isl_take isl_ast_node_list *ptr);
-  friend inline isl::ast_node_list manage_copy(__isl_keep isl_ast_node_list *ptr);
+  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;
 
@@ -564,9 +564,9 @@
 
 public:
   inline /* implicit */ ast_node_list();
-  inline /* implicit */ ast_node_list(const isl::ast_node_list &obj);
+  inline /* implicit */ ast_node_list(const ast_node_list &obj);
   inline /* implicit */ ast_node_list(std::nullptr_t);
-  inline isl::ast_node_list &operator=(isl::ast_node_list obj);
+  inline ast_node_list &operator=(ast_node_list obj);
   inline ~ast_node_list();
   inline __isl_give isl_ast_node_list *copy() const &;
   inline __isl_give isl_ast_node_list *copy() && = delete;
@@ -574,32 +574,32 @@
   inline __isl_give isl_ast_node_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::ast_node_list add(isl::ast_node el) const;
-  static inline isl::ast_node_list alloc(isl::ctx ctx, int n);
-  inline isl::ast_node_list concat(isl::ast_node_list list2) const;
-  inline isl::ast_node_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::ast_node)> &fn) const;
-  static inline isl::ast_node_list from_ast_node(isl::ast_node el);
-  inline isl::ast_node get_ast_node(int index) const;
-  inline isl::ast_node get_at(int index) const;
-  inline isl::ast_node_list insert(unsigned int pos, isl::ast_node el) const;
+  inline ast_node_list add(ast_node el) const;
+  static inline ast_node_list alloc(ctx ctx, int n);
+  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 int n_ast_node() const;
-  inline isl::ast_node_list reverse() const;
-  inline isl::ast_node_list set_ast_node(int index, isl::ast_node el) const;
+  inline ast_node_list reverse() const;
+  inline ast_node_list set_ast_node(int index, ast_node el) const;
   inline int size() const;
-  inline isl::ast_node_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline ast_node_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::basic_map
-inline isl::basic_map manage(__isl_take isl_basic_map *ptr);
-inline isl::basic_map manage_copy(__isl_keep isl_basic_map *ptr);
+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 isl::basic_map manage(__isl_take isl_basic_map *ptr);
-  friend inline isl::basic_map manage_copy(__isl_keep isl_basic_map *ptr);
+  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;
 
@@ -607,10 +607,10 @@
 
 public:
   inline /* implicit */ basic_map();
-  inline /* implicit */ basic_map(const isl::basic_map &obj);
+  inline /* implicit */ basic_map(const basic_map &obj);
   inline /* implicit */ basic_map(std::nullptr_t);
-  inline explicit basic_map(isl::ctx ctx, const std::string &str);
-  inline isl::basic_map &operator=(isl::basic_map obj);
+  inline explicit basic_map(ctx ctx, const std::string &str);
+  inline basic_map &operator=(basic_map obj);
   inline ~basic_map();
   inline __isl_give isl_basic_map *copy() const &;
   inline __isl_give isl_basic_map *copy() && = delete;
@@ -618,123 +618,123 @@
   inline __isl_give isl_basic_map *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::basic_map add_constraint(isl::constraint constraint) const;
-  inline isl::basic_map add_dims(isl::dim type, unsigned int n) const;
-  inline isl::basic_map affine_hull() const;
-  inline isl::basic_map align_params(isl::space model) const;
-  inline isl::basic_map apply_domain(isl::basic_map bmap2) const;
-  inline isl::basic_map apply_range(isl::basic_map bmap2) const;
-  inline isl::boolean can_curry() const;
-  inline isl::boolean can_uncurry() const;
-  inline isl::boolean can_zip() const;
-  inline isl::basic_map curry() const;
-  inline isl::basic_set deltas() const;
-  inline isl::basic_map deltas_map() const;
-  inline isl::basic_map detect_equalities() 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 unsigned int dim(isl::dim type) const;
-  inline isl::basic_set domain() const;
-  inline isl::basic_map domain_map() const;
-  inline isl::basic_map domain_product(isl::basic_map bmap2) const;
-  inline isl::basic_map drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::basic_map drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::basic_map drop_unused_params() const;
-  inline isl::basic_map eliminate(isl::dim type, unsigned int first, unsigned int n) const;
-  static inline isl::basic_map empty(isl::space space);
-  static inline isl::basic_map equal(isl::space dim, unsigned int n_equal);
-  inline isl::mat equalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4, isl::dim c5) const;
-  inline isl::basic_map equate(isl::dim type1, int pos1, isl::dim type2, int pos2) 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 dim, 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 isl::basic_map fix_si(isl::dim type, unsigned int pos, int value) const;
-  inline isl::basic_map fix_val(isl::dim type, unsigned int pos, isl::val v) const;
-  inline isl::basic_map flat_product(isl::basic_map bmap2) const;
-  inline isl::basic_map flat_range_product(isl::basic_map bmap2) const;
-  inline isl::basic_map flatten() const;
-  inline isl::basic_map flatten_domain() const;
-  inline isl::basic_map flatten_range() const;
-  inline isl::stat foreach_constraint(const std::function<isl::stat(isl::constraint)> &fn) const;
-  static inline isl::basic_map from_aff(isl::aff aff);
-  static inline isl::basic_map from_aff_list(isl::space domain_space, isl::aff_list list);
-  static inline isl::basic_map from_constraint(isl::constraint constraint);
-  static inline isl::basic_map from_domain(isl::basic_set bset);
-  static inline isl::basic_map from_domain_and_range(isl::basic_set domain, isl::basic_set range);
-  static inline isl::basic_map from_multi_aff(isl::multi_aff maff);
-  static inline isl::basic_map from_qpolynomial(isl::qpolynomial qp);
-  static inline isl::basic_map from_range(isl::basic_set bset);
-  inline isl::constraint_list get_constraint_list() 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 isl::aff get_div(int pos) const;
-  inline isl::local_space get_local_space() const;
-  inline isl::space get_space() 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 isl::basic_map gist(isl::basic_map context) const;
-  inline isl::basic_map gist_domain(isl::basic_set context) const;
-  inline isl::boolean has_dim_id(isl::dim type, unsigned int pos) const;
-  static inline isl::basic_map identity(isl::space dim);
-  inline isl::boolean image_is_bounded() const;
-  inline isl::mat inequalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4, isl::dim c5) const;
-  inline isl::basic_map insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
-  inline isl::basic_map intersect(isl::basic_map bmap2) const;
-  inline isl::basic_map intersect_domain(isl::basic_set bset) const;
-  inline isl::basic_map intersect_range(isl::basic_set bset) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean is_disjoint(const isl::basic_map &bmap2) const;
-  inline isl::boolean is_empty() const;
-  inline isl::boolean is_equal(const isl::basic_map &bmap2) const;
-  inline isl::boolean is_rational() const;
-  inline isl::boolean is_single_valued() const;
-  inline isl::boolean is_strict_subset(const isl::basic_map &bmap2) const;
-  inline isl::boolean is_subset(const isl::basic_map &bmap2) const;
-  inline isl::boolean is_universe() const;
-  static inline isl::basic_map less_at(isl::space dim, unsigned int pos);
-  inline isl::map lexmax() const;
-  inline isl::map lexmin() const;
-  inline isl::pw_multi_aff lexmin_pw_multi_aff() const;
-  inline isl::basic_map lower_bound_si(isl::dim type, unsigned int pos, int value) const;
-  static inline isl::basic_map more_at(isl::space dim, unsigned int pos);
-  inline isl::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 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 dim);
+  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 dim, 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 dim, 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 int n_constraint() const;
-  static inline isl::basic_map nat_universe(isl::space dim);
-  inline isl::basic_map neg() const;
-  inline isl::basic_map order_ge(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
-  inline isl::basic_map order_gt(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
-  inline isl::val plain_get_val_if_fixed(isl::dim type, unsigned int pos) const;
-  inline isl::boolean plain_is_empty() const;
-  inline isl::boolean plain_is_universe() const;
-  inline isl::basic_map preimage_domain_multi_aff(isl::multi_aff ma) const;
-  inline isl::basic_map preimage_range_multi_aff(isl::multi_aff ma) const;
-  inline isl::basic_map product(isl::basic_map bmap2) const;
-  inline isl::basic_map project_out(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::basic_set range() const;
-  inline isl::basic_map range_map() const;
-  inline isl::basic_map range_product(isl::basic_map bmap2) const;
-  inline isl::basic_map remove_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::basic_map remove_divs() const;
-  inline isl::basic_map remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::basic_map remove_redundancies() const;
-  inline isl::basic_map reverse() const;
-  inline isl::basic_map sample() const;
-  inline isl::basic_map set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::basic_map set_tuple_name(isl::dim type, const std::string &s) const;
-  inline isl::basic_map sum(isl::basic_map bmap2) const;
-  inline isl::basic_map uncurry() const;
-  inline isl::map unite(isl::basic_map bmap2) const;
-  static inline isl::basic_map universe(isl::space space);
-  inline isl::basic_map upper_bound_si(isl::dim type, unsigned int pos, int value) const;
-  inline isl::basic_set wrap() const;
-  inline isl::basic_map zip() const;
+  static inline basic_map nat_universe(space dim);
+  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 isl::basic_map_list manage(__isl_take isl_basic_map_list *ptr);
-inline isl::basic_map_list manage_copy(__isl_keep isl_basic_map_list *ptr);
+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 isl::basic_map_list manage(__isl_take isl_basic_map_list *ptr);
-  friend inline isl::basic_map_list manage_copy(__isl_keep isl_basic_map_list *ptr);
+  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;
 
@@ -742,9 +742,9 @@
 
 public:
   inline /* implicit */ basic_map_list();
-  inline /* implicit */ basic_map_list(const isl::basic_map_list &obj);
+  inline /* implicit */ basic_map_list(const basic_map_list &obj);
   inline /* implicit */ basic_map_list(std::nullptr_t);
-  inline isl::basic_map_list &operator=(isl::basic_map_list obj);
+  inline basic_map_list &operator=(basic_map_list obj);
   inline ~basic_map_list();
   inline __isl_give isl_basic_map_list *copy() const &;
   inline __isl_give isl_basic_map_list *copy() && = delete;
@@ -752,32 +752,32 @@
   inline __isl_give isl_basic_map_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::basic_map_list add(isl::basic_map el) const;
-  static inline isl::basic_map_list alloc(isl::ctx ctx, int n);
-  inline isl::basic_map_list concat(isl::basic_map_list list2) const;
-  inline isl::basic_map_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::basic_map)> &fn) const;
-  static inline isl::basic_map_list from_basic_map(isl::basic_map el);
-  inline isl::basic_map get_at(int index) const;
-  inline isl::basic_map get_basic_map(int index) const;
-  inline isl::basic_map_list insert(unsigned int pos, isl::basic_map el) const;
+  inline basic_map_list add(basic_map el) const;
+  static inline basic_map_list alloc(ctx ctx, int n);
+  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 int n_basic_map() const;
-  inline isl::basic_map_list reverse() const;
-  inline isl::basic_map_list set_basic_map(int index, isl::basic_map el) const;
+  inline basic_map_list reverse() const;
+  inline basic_map_list set_basic_map(int index, basic_map el) const;
   inline int size() const;
-  inline isl::basic_map_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline basic_map_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::basic_set
-inline isl::basic_set manage(__isl_take isl_basic_set *ptr);
-inline isl::basic_set manage_copy(__isl_keep isl_basic_set *ptr);
+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 isl::basic_set manage(__isl_take isl_basic_set *ptr);
-  friend inline isl::basic_set manage_copy(__isl_keep isl_basic_set *ptr);
+  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;
 
@@ -785,11 +785,11 @@
 
 public:
   inline /* implicit */ basic_set();
-  inline /* implicit */ basic_set(const isl::basic_set &obj);
+  inline /* implicit */ basic_set(const basic_set &obj);
   inline /* implicit */ basic_set(std::nullptr_t);
-  inline explicit basic_set(isl::ctx ctx, const std::string &str);
-  inline /* implicit */ basic_set(isl::point pnt);
-  inline isl::basic_set &operator=(isl::basic_set obj);
+  inline explicit basic_set(ctx ctx, const std::string &str);
+  inline /* implicit */ basic_set(point pnt);
+  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;
@@ -797,94 +797,94 @@
   inline __isl_give isl_basic_set *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::basic_set affine_hull() const;
-  inline isl::basic_set align_params(isl::space model) const;
-  inline isl::basic_set apply(isl::basic_map bmap) const;
-  static inline isl::basic_set box_from_points(isl::point pnt1, isl::point pnt2);
-  inline isl::basic_set coefficients() const;
-  inline isl::basic_set detect_equalities() 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 unsigned int dim(isl::dim type) const;
-  inline isl::val dim_max_val(int pos) const;
-  inline isl::basic_set drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::basic_set drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::basic_set drop_unused_params() const;
-  inline isl::basic_set eliminate(isl::dim type, unsigned int first, unsigned int n) const;
-  static inline isl::basic_set empty(isl::space space);
-  inline isl::mat equalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4) const;
-  inline isl::basic_set fix_si(isl::dim type, unsigned int pos, int value) const;
-  inline isl::basic_set fix_val(isl::dim type, unsigned int pos, isl::val v) const;
-  inline isl::basic_set flat_product(isl::basic_set bset2) const;
-  inline isl::basic_set flatten() const;
-  inline isl::stat foreach_bound_pair(isl::dim type, unsigned int pos, const std::function<isl::stat(isl::constraint, isl::constraint, isl::basic_set)> &fn) const;
-  inline isl::stat foreach_constraint(const std::function<isl::stat(isl::constraint)> &fn) const;
-  static inline isl::basic_set from_constraint(isl::constraint constraint);
-  static inline isl::basic_set from_multi_aff(isl::multi_aff ma);
-  inline isl::basic_set from_params() const;
-  inline isl::constraint_list get_constraint_list() const;
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) 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 isl::aff get_div(int pos) const;
-  inline isl::local_space get_local_space() const;
-  inline isl::space get_space() 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 isl::basic_set gist(isl::basic_set context) const;
-  inline isl::mat inequalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4) const;
-  inline isl::basic_set insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
-  inline isl::basic_set intersect(isl::basic_set bset2) const;
-  inline isl::basic_set intersect_params(isl::basic_set bset2) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean is_bounded() const;
-  inline isl::boolean is_disjoint(const isl::basic_set &bset2) const;
-  inline isl::boolean is_empty() const;
-  inline isl::boolean is_equal(const isl::basic_set &bset2) 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 isl::boolean is_subset(const isl::basic_set &bset2) const;
-  inline isl::boolean is_universe() const;
-  inline isl::boolean is_wrapping() const;
-  inline isl::set lexmax() const;
-  inline isl::set lexmin() const;
-  inline isl::basic_set lower_bound_val(isl::dim type, unsigned int pos, isl::val value) const;
-  inline isl::val max_val(const isl::aff &obj) const;
-  inline isl::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 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 int n_constraint() const;
   inline unsigned int n_dim() const;
-  static inline isl::basic_set nat_universe(isl::space dim);
-  inline isl::basic_set neg() const;
-  inline isl::basic_set params() const;
-  inline isl::boolean plain_is_empty() const;
-  inline isl::boolean plain_is_equal(const isl::basic_set &bset2) const;
-  inline isl::boolean plain_is_universe() const;
-  static inline isl::basic_set positive_orthant(isl::space space);
-  inline isl::basic_set preimage_multi_aff(isl::multi_aff ma) const;
-  inline isl::basic_set project_out(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::mat reduced_basis() const;
-  inline isl::basic_set remove_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::basic_set remove_divs() const;
-  inline isl::basic_set remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::basic_set remove_redundancies() const;
-  inline isl::basic_set remove_unknown_divs() const;
-  inline isl::basic_set sample() const;
-  inline isl::point sample_point() const;
-  inline isl::basic_set set_tuple_id(isl::id id) const;
-  inline isl::basic_set set_tuple_name(const std::string &s) const;
-  inline isl::basic_set solutions() const;
-  inline isl::set unite(isl::basic_set bset2) const;
-  static inline isl::basic_set universe(isl::space space);
-  inline isl::basic_map unwrap() const;
-  inline isl::basic_set upper_bound_val(isl::dim type, unsigned int pos, isl::val value) const;
+  static inline basic_set nat_universe(space dim);
+  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 isl::basic_set_list manage(__isl_take isl_basic_set_list *ptr);
-inline isl::basic_set_list manage_copy(__isl_keep isl_basic_set_list *ptr);
+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 isl::basic_set_list manage(__isl_take isl_basic_set_list *ptr);
-  friend inline isl::basic_set_list manage_copy(__isl_keep isl_basic_set_list *ptr);
+  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;
 
@@ -892,9 +892,9 @@
 
 public:
   inline /* implicit */ basic_set_list();
-  inline /* implicit */ basic_set_list(const isl::basic_set_list &obj);
+  inline /* implicit */ basic_set_list(const basic_set_list &obj);
   inline /* implicit */ basic_set_list(std::nullptr_t);
-  inline isl::basic_set_list &operator=(isl::basic_set_list obj);
+  inline basic_set_list &operator=(basic_set_list obj);
   inline ~basic_set_list();
   inline __isl_give isl_basic_set_list *copy() const &;
   inline __isl_give isl_basic_set_list *copy() && = delete;
@@ -902,33 +902,33 @@
   inline __isl_give isl_basic_set_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::basic_set_list add(isl::basic_set el) const;
-  static inline isl::basic_set_list alloc(isl::ctx ctx, int n);
-  inline isl::basic_set_list coefficients() const;
-  inline isl::basic_set_list concat(isl::basic_set_list list2) const;
-  inline isl::basic_set_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::basic_set)> &fn) const;
-  static inline isl::basic_set_list from_basic_set(isl::basic_set el);
-  inline isl::basic_set get_at(int index) const;
-  inline isl::basic_set get_basic_set(int index) const;
-  inline isl::basic_set_list insert(unsigned int pos, isl::basic_set el) const;
+  inline basic_set_list add(basic_set el) const;
+  static inline basic_set_list alloc(ctx ctx, int n);
+  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 int n_basic_set() const;
-  inline isl::basic_set_list reverse() const;
-  inline isl::basic_set_list set_basic_set(int index, isl::basic_set el) const;
+  inline basic_set_list reverse() const;
+  inline basic_set_list set_basic_set(int index, basic_set el) const;
   inline int size() const;
-  inline isl::basic_set_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline basic_set_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::constraint
-inline isl::constraint manage(__isl_take isl_constraint *ptr);
-inline isl::constraint manage_copy(__isl_keep isl_constraint *ptr);
+inline constraint manage(__isl_take isl_constraint *ptr);
+inline constraint manage_copy(__isl_keep isl_constraint *ptr);
 
 class constraint {
-  friend inline isl::constraint manage(__isl_take isl_constraint *ptr);
-  friend inline isl::constraint manage_copy(__isl_keep isl_constraint *ptr);
+  friend inline constraint manage(__isl_take isl_constraint *ptr);
+  friend inline constraint manage_copy(__isl_keep isl_constraint *ptr);
 
   isl_constraint *ptr = nullptr;
 
@@ -936,9 +936,9 @@
 
 public:
   inline /* implicit */ constraint();
-  inline /* implicit */ constraint(const isl::constraint &obj);
+  inline /* implicit */ constraint(const constraint &obj);
   inline /* implicit */ constraint(std::nullptr_t);
-  inline isl::constraint &operator=(isl::constraint obj);
+  inline constraint &operator=(constraint obj);
   inline ~constraint();
   inline __isl_give isl_constraint *copy() const &;
   inline __isl_give isl_constraint *copy() && = delete;
@@ -946,38 +946,38 @@
   inline __isl_give isl_constraint *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  static inline isl::constraint alloc_equality(isl::local_space ls);
-  static inline isl::constraint alloc_inequality(isl::local_space ls);
-  inline int cmp_last_non_zero(const isl::constraint &c2) const;
-  inline isl::aff get_aff() const;
-  inline isl::aff get_bound(isl::dim type, int pos) const;
-  inline isl::val get_coefficient_val(isl::dim type, int pos) const;
-  inline isl::val get_constant_val() 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 isl::aff get_div(int pos) const;
-  inline isl::local_space get_local_space() const;
-  inline isl::space get_space() const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) 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 int is_div_constraint() const;
-  inline isl::boolean is_lower_bound(isl::dim type, unsigned int pos) const;
-  inline isl::boolean is_upper_bound(isl::dim type, unsigned int pos) const;
-  inline int plain_cmp(const isl::constraint &c2) const;
-  inline isl::constraint set_coefficient_si(isl::dim type, int pos, int v) const;
-  inline isl::constraint set_coefficient_val(isl::dim type, int pos, isl::val v) const;
-  inline isl::constraint set_constant_si(int v) const;
-  inline isl::constraint set_constant_val(isl::val v) 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 isl::constraint_list manage(__isl_take isl_constraint_list *ptr);
-inline isl::constraint_list manage_copy(__isl_keep isl_constraint_list *ptr);
+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 isl::constraint_list manage(__isl_take isl_constraint_list *ptr);
-  friend inline isl::constraint_list manage_copy(__isl_keep isl_constraint_list *ptr);
+  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;
 
@@ -985,9 +985,9 @@
 
 public:
   inline /* implicit */ constraint_list();
-  inline /* implicit */ constraint_list(const isl::constraint_list &obj);
+  inline /* implicit */ constraint_list(const constraint_list &obj);
   inline /* implicit */ constraint_list(std::nullptr_t);
-  inline isl::constraint_list &operator=(isl::constraint_list obj);
+  inline constraint_list &operator=(constraint_list obj);
   inline ~constraint_list();
   inline __isl_give isl_constraint_list *copy() const &;
   inline __isl_give isl_constraint_list *copy() && = delete;
@@ -995,32 +995,32 @@
   inline __isl_give isl_constraint_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::constraint_list add(isl::constraint el) const;
-  static inline isl::constraint_list alloc(isl::ctx ctx, int n);
-  inline isl::constraint_list concat(isl::constraint_list list2) const;
-  inline isl::constraint_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::constraint)> &fn) const;
-  static inline isl::constraint_list from_constraint(isl::constraint el);
-  inline isl::constraint get_at(int index) const;
-  inline isl::constraint get_constraint(int index) const;
-  inline isl::constraint_list insert(unsigned int pos, isl::constraint el) const;
+  inline constraint_list add(constraint el) const;
+  static inline constraint_list alloc(ctx ctx, int n);
+  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 int n_constraint() const;
-  inline isl::constraint_list reverse() const;
-  inline isl::constraint_list set_constraint(int index, isl::constraint el) const;
+  inline constraint_list reverse() const;
+  inline constraint_list set_constraint(int index, constraint el) const;
   inline int size() const;
-  inline isl::constraint_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline constraint_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::fixed_box
-inline isl::fixed_box manage(__isl_take isl_fixed_box *ptr);
-inline isl::fixed_box manage_copy(__isl_keep isl_fixed_box *ptr);
+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 isl::fixed_box manage(__isl_take isl_fixed_box *ptr);
-  friend inline isl::fixed_box manage_copy(__isl_keep isl_fixed_box *ptr);
+  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;
 
@@ -1028,9 +1028,9 @@
 
 public:
   inline /* implicit */ fixed_box();
-  inline /* implicit */ fixed_box(const isl::fixed_box &obj);
+  inline /* implicit */ fixed_box(const fixed_box &obj);
   inline /* implicit */ fixed_box(std::nullptr_t);
-  inline isl::fixed_box &operator=(isl::fixed_box obj);
+  inline fixed_box &operator=(fixed_box obj);
   inline ~fixed_box();
   inline __isl_give isl_fixed_box *copy() const &;
   inline __isl_give isl_fixed_box *copy() && = delete;
@@ -1038,21 +1038,21 @@
   inline __isl_give isl_fixed_box *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
 
-  inline isl::multi_aff get_offset() const;
-  inline isl::multi_val get_size() const;
-  inline isl::space get_space() const;
-  inline isl::boolean is_valid() 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 isl::id manage(__isl_take isl_id *ptr);
-inline isl::id manage_copy(__isl_keep isl_id *ptr);
+inline id manage(__isl_take isl_id *ptr);
+inline id manage_copy(__isl_keep isl_id *ptr);
 
 class id {
-  friend inline isl::id manage(__isl_take isl_id *ptr);
-  friend inline isl::id manage_copy(__isl_keep isl_id *ptr);
+  friend inline id manage(__isl_take isl_id *ptr);
+  friend inline id manage_copy(__isl_keep isl_id *ptr);
 
   isl_id *ptr = nullptr;
 
@@ -1060,9 +1060,9 @@
 
 public:
   inline /* implicit */ id();
-  inline /* implicit */ id(const isl::id &obj);
+  inline /* implicit */ id(const id &obj);
   inline /* implicit */ id(std::nullptr_t);
-  inline isl::id &operator=(isl::id obj);
+  inline id &operator=(id obj);
   inline ~id();
   inline __isl_give isl_id *copy() const &;
   inline __isl_give isl_id *copy() && = delete;
@@ -1070,23 +1070,23 @@
   inline __isl_give isl_id *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  static inline isl::id alloc(isl::ctx ctx, const std::string &name, void * user);
+  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 isl::id_list manage(__isl_take isl_id_list *ptr);
-inline isl::id_list manage_copy(__isl_keep isl_id_list *ptr);
+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 isl::id_list manage(__isl_take isl_id_list *ptr);
-  friend inline isl::id_list manage_copy(__isl_keep isl_id_list *ptr);
+  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;
 
@@ -1094,9 +1094,9 @@
 
 public:
   inline /* implicit */ id_list();
-  inline /* implicit */ id_list(const isl::id_list &obj);
+  inline /* implicit */ id_list(const id_list &obj);
   inline /* implicit */ id_list(std::nullptr_t);
-  inline isl::id_list &operator=(isl::id_list obj);
+  inline id_list &operator=(id_list obj);
   inline ~id_list();
   inline __isl_give isl_id_list *copy() const &;
   inline __isl_give isl_id_list *copy() && = delete;
@@ -1104,32 +1104,32 @@
   inline __isl_give isl_id_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::id_list add(isl::id el) const;
-  static inline isl::id_list alloc(isl::ctx ctx, int n);
-  inline isl::id_list concat(isl::id_list list2) const;
-  inline isl::id_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::id)> &fn) const;
-  static inline isl::id_list from_id(isl::id el);
-  inline isl::id get_at(int index) const;
-  inline isl::id get_id(int index) const;
-  inline isl::id_list insert(unsigned int pos, isl::id el) const;
+  inline id_list add(id el) const;
+  static inline id_list alloc(ctx ctx, int n);
+  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 int n_id() const;
-  inline isl::id_list reverse() const;
-  inline isl::id_list set_id(int index, isl::id el) const;
+  inline id_list reverse() const;
+  inline id_list set_id(int index, id el) const;
   inline int size() const;
-  inline isl::id_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline id_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::id_to_ast_expr
-inline isl::id_to_ast_expr manage(__isl_take isl_id_to_ast_expr *ptr);
-inline isl::id_to_ast_expr manage_copy(__isl_keep isl_id_to_ast_expr *ptr);
+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 isl::id_to_ast_expr manage(__isl_take isl_id_to_ast_expr *ptr);
-  friend inline isl::id_to_ast_expr manage_copy(__isl_keep isl_id_to_ast_expr *ptr);
+  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;
 
@@ -1137,9 +1137,9 @@
 
 public:
   inline /* implicit */ id_to_ast_expr();
-  inline /* implicit */ id_to_ast_expr(const isl::id_to_ast_expr &obj);
+  inline /* implicit */ id_to_ast_expr(const id_to_ast_expr &obj);
   inline /* implicit */ id_to_ast_expr(std::nullptr_t);
-  inline isl::id_to_ast_expr &operator=(isl::id_to_ast_expr obj);
+  inline id_to_ast_expr &operator=(id_to_ast_expr obj);
   inline ~id_to_ast_expr();
   inline __isl_give isl_id_to_ast_expr *copy() const &;
   inline __isl_give isl_id_to_ast_expr *copy() && = delete;
@@ -1147,24 +1147,24 @@
   inline __isl_give isl_id_to_ast_expr *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  static inline isl::id_to_ast_expr alloc(isl::ctx ctx, int min_size);
-  inline isl::id_to_ast_expr drop(isl::id key) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::id, isl::ast_expr)> &fn) const;
-  inline isl::ast_expr get(isl::id key) const;
-  inline isl::boolean has(const isl::id &key) const;
-  inline isl::id_to_ast_expr set(isl::id key, isl::ast_expr val) 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 isl::local_space manage(__isl_take isl_local_space *ptr);
-inline isl::local_space manage_copy(__isl_keep isl_local_space *ptr);
+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 isl::local_space manage(__isl_take isl_local_space *ptr);
-  friend inline isl::local_space manage_copy(__isl_keep isl_local_space *ptr);
+  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;
 
@@ -1172,10 +1172,10 @@
 
 public:
   inline /* implicit */ local_space();
-  inline /* implicit */ local_space(const isl::local_space &obj);
+  inline /* implicit */ local_space(const local_space &obj);
   inline /* implicit */ local_space(std::nullptr_t);
-  inline explicit local_space(isl::space dim);
-  inline isl::local_space &operator=(isl::local_space obj);
+  inline explicit local_space(space dim);
+  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;
@@ -1183,42 +1183,42 @@
   inline __isl_give isl_local_space *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::local_space add_dims(isl::dim type, unsigned int n) const;
+  inline local_space add_dims(isl::dim type, unsigned int n) const;
   inline int dim(isl::dim type) const;
-  inline isl::local_space domain() const;
-  inline isl::local_space drop_dims(isl::dim type, unsigned int first, unsigned int n) 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 isl::local_space flatten_domain() const;
-  inline isl::local_space flatten_range() const;
-  inline isl::local_space from_domain() const;
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) 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 isl::aff get_div(int pos) const;
-  inline isl::space get_space() const;
-  inline isl::boolean has_dim_id(isl::dim type, unsigned int pos) const;
-  inline isl::boolean has_dim_name(isl::dim type, unsigned int pos) const;
-  inline isl::local_space insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::local_space intersect(isl::local_space ls2) const;
-  inline isl::boolean is_equal(const isl::local_space &ls2) const;
-  inline isl::boolean is_params() const;
-  inline isl::boolean is_set() const;
-  inline isl::local_space range() const;
-  inline isl::local_space set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::local_space set_from_params() const;
-  inline isl::local_space set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::local_space wrap() 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 isl::map manage(__isl_take isl_map *ptr);
-inline isl::map manage_copy(__isl_keep isl_map *ptr);
+inline map manage(__isl_take isl_map *ptr);
+inline map manage_copy(__isl_keep isl_map *ptr);
 
 class map {
-  friend inline isl::map manage(__isl_take isl_map *ptr);
-  friend inline isl::map manage_copy(__isl_keep isl_map *ptr);
+  friend inline map manage(__isl_take isl_map *ptr);
+  friend inline map manage_copy(__isl_keep isl_map *ptr);
 
   isl_map *ptr = nullptr;
 
@@ -1226,11 +1226,11 @@
 
 public:
   inline /* implicit */ map();
-  inline /* implicit */ map(const isl::map &obj);
+  inline /* implicit */ map(const map &obj);
   inline /* implicit */ map(std::nullptr_t);
-  inline explicit map(isl::ctx ctx, const std::string &str);
-  inline /* implicit */ map(isl::basic_map bmap);
-  inline isl::map &operator=(isl::map obj);
+  inline explicit map(ctx ctx, const std::string &str);
+  inline /* implicit */ map(basic_map bmap);
+  inline map &operator=(map obj);
   inline ~map();
   inline __isl_give isl_map *copy() const &;
   inline __isl_give isl_map *copy() && = delete;
@@ -1238,187 +1238,187 @@
   inline __isl_give isl_map *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::map add_constraint(isl::constraint constraint) const;
-  inline isl::map add_dims(isl::dim type, unsigned int n) const;
-  inline isl::basic_map affine_hull() const;
-  inline isl::map align_params(isl::space model) const;
-  inline isl::map apply_domain(isl::map map2) const;
-  inline isl::map apply_range(isl::map map2) const;
-  inline isl::boolean can_curry() const;
-  inline isl::boolean can_range_curry() const;
-  inline isl::boolean can_uncurry() const;
-  inline isl::boolean can_zip() const;
-  inline isl::map coalesce() const;
-  inline isl::map complement() const;
-  inline isl::basic_map convex_hull() const;
-  inline isl::map curry() const;
-  inline isl::set deltas() const;
-  inline isl::map deltas_map() const;
-  inline isl::map detect_equalities() 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 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 unsigned int dim(isl::dim type) const;
-  inline isl::pw_aff dim_max(int pos) const;
-  inline isl::pw_aff dim_min(int pos) const;
-  inline isl::set domain() const;
-  inline isl::map domain_factor_domain() const;
-  inline isl::map domain_factor_range() const;
-  inline isl::boolean domain_is_wrapping() const;
-  inline isl::map domain_map() const;
-  inline isl::map domain_product(isl::map map2) const;
-  inline isl::map drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::map drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::map drop_unused_params() const;
-  inline isl::map eliminate(isl::dim type, unsigned int first, unsigned int n) const;
-  static inline isl::map empty(isl::space space);
-  inline isl::map equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
-  inline isl::map factor_domain() const;
-  inline isl::map factor_range() const;
-  inline int find_dim_by_id(isl::dim type, const isl::id &id) 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 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 isl::map fix_si(isl::dim type, unsigned int pos, int value) const;
-  inline isl::map fix_val(isl::dim type, unsigned int pos, isl::val v) const;
-  inline isl::map fixed_power_val(isl::val exp) const;
-  inline isl::map flat_domain_product(isl::map map2) const;
-  inline isl::map flat_product(isl::map map2) const;
-  inline isl::map flat_range_product(isl::map map2) const;
-  inline isl::map flatten() const;
-  inline isl::map flatten_domain() const;
-  inline isl::map flatten_range() const;
-  inline isl::map floordiv_val(isl::val d) const;
-  inline isl::stat foreach_basic_map(const std::function<isl::stat(isl::basic_map)> &fn) const;
-  static inline isl::map from_aff(isl::aff aff);
-  static inline isl::map from_domain(isl::set set);
-  static inline isl::map from_domain_and_range(isl::set domain, isl::set range);
-  static inline isl::map from_multi_aff(isl::multi_aff maff);
-  static inline isl::map from_multi_pw_aff(isl::multi_pw_aff mpa);
-  static inline isl::map from_pw_aff(isl::pw_aff pwaff);
-  static inline isl::map from_pw_multi_aff(isl::pw_multi_aff pma);
-  static inline isl::map from_range(isl::set set);
-  static inline isl::map from_union_map(isl::union_map umap);
-  inline isl::basic_map_list get_basic_map_list() const;
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) 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 isl::fixed_box get_range_simple_fixed_box_hull() const;
-  inline isl::space get_space() const;
-  inline isl::id get_tuple_id(isl::dim type) 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 isl::map gist(isl::map context) const;
-  inline isl::map gist_basic_map(isl::basic_map context) const;
-  inline isl::map gist_domain(isl::set context) const;
-  inline isl::map gist_params(isl::set context) const;
-  inline isl::map gist_range(isl::set context) const;
-  inline isl::boolean has_dim_id(isl::dim type, unsigned int pos) const;
-  inline isl::boolean has_dim_name(isl::dim type, unsigned int pos) const;
-  inline isl::boolean has_equal_space(const isl::map &map2) const;
-  inline isl::boolean has_tuple_id(isl::dim type) const;
-  inline isl::boolean has_tuple_name(isl::dim type) const;
-  static inline isl::map identity(isl::space dim);
-  inline isl::map insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
-  inline isl::map intersect(isl::map map2) const;
-  inline isl::map intersect_domain(isl::set set) const;
-  inline isl::map intersect_domain_factor_range(isl::map factor) const;
-  inline isl::map intersect_params(isl::set params) const;
-  inline isl::map intersect_range(isl::set set) const;
-  inline isl::map intersect_range_factor_range(isl::map factor) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean is_bijective() const;
-  inline isl::boolean is_disjoint(const isl::map &map2) const;
-  inline isl::boolean is_empty() const;
-  inline isl::boolean is_equal(const isl::map &map2) const;
-  inline isl::boolean is_identity() const;
-  inline isl::boolean is_injective() const;
-  inline isl::boolean is_product() const;
-  inline isl::boolean is_single_valued() const;
-  inline isl::boolean is_strict_subset(const isl::map &map2) const;
-  inline isl::boolean is_subset(const isl::map &map2) 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 dim);
+  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_range(map factor) const;
+  inline map intersect_params(set params) const;
+  inline map intersect_range(set set) 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 isl::map lex_ge(isl::space set_dim);
-  static inline isl::map lex_ge_first(isl::space dim, unsigned int n);
-  inline isl::map lex_ge_map(isl::map map2) const;
-  static inline isl::map lex_gt(isl::space set_dim);
-  static inline isl::map lex_gt_first(isl::space dim, unsigned int n);
-  inline isl::map lex_gt_map(isl::map map2) const;
-  static inline isl::map lex_le(isl::space set_dim);
-  static inline isl::map lex_le_first(isl::space dim, unsigned int n);
-  inline isl::map lex_le_map(isl::map map2) const;
-  static inline isl::map lex_lt(isl::space set_dim);
-  static inline isl::map lex_lt_first(isl::space dim, unsigned int n);
-  inline isl::map lex_lt_map(isl::map map2) const;
-  inline isl::map lexmax() const;
-  inline isl::pw_multi_aff lexmax_pw_multi_aff() const;
-  inline isl::map lexmin() const;
-  inline isl::pw_multi_aff lexmin_pw_multi_aff() const;
-  inline isl::map lower_bound_si(isl::dim type, unsigned int pos, int value) const;
-  inline isl::map move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
+  static inline map lex_ge(space set_dim);
+  static inline map lex_ge_first(space dim, unsigned int n);
+  inline map lex_ge_map(map map2) const;
+  static inline map lex_gt(space set_dim);
+  static inline map lex_gt_first(space dim, unsigned int n);
+  inline map lex_gt_map(map map2) const;
+  static inline map lex_le(space set_dim);
+  static inline map lex_le_first(space dim, unsigned int n);
+  inline map lex_le_map(map map2) const;
+  static inline map lex_lt(space set_dim);
+  static inline map lex_lt_first(space dim, 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_si(isl::dim type, unsigned int pos, int value) 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 int n_basic_map() const;
-  static inline isl::map nat_universe(isl::space dim);
-  inline isl::map neg() const;
-  inline isl::map oppose(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
-  inline isl::map order_ge(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
-  inline isl::map order_gt(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
-  inline isl::map order_le(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
-  inline isl::map order_lt(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
-  inline isl::set params() const;
-  inline isl::val plain_get_val_if_fixed(isl::dim type, unsigned int pos) const;
-  inline isl::boolean plain_is_empty() const;
-  inline isl::boolean plain_is_equal(const isl::map &map2) const;
-  inline isl::boolean plain_is_injective() const;
-  inline isl::boolean plain_is_single_valued() const;
-  inline isl::boolean plain_is_universe() const;
-  inline isl::basic_map plain_unshifted_simple_hull() const;
-  inline isl::basic_map polyhedral_hull() const;
-  inline isl::map preimage_domain_multi_aff(isl::multi_aff ma) const;
-  inline isl::map preimage_domain_multi_pw_aff(isl::multi_pw_aff mpa) const;
-  inline isl::map preimage_domain_pw_multi_aff(isl::pw_multi_aff pma) const;
-  inline isl::map preimage_range_multi_aff(isl::multi_aff ma) const;
-  inline isl::map preimage_range_pw_multi_aff(isl::pw_multi_aff pma) const;
-  inline isl::map product(isl::map map2) const;
-  inline isl::map project_out(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::set range() const;
-  inline isl::map range_curry() const;
-  inline isl::map range_factor_domain() const;
-  inline isl::map range_factor_range() const;
-  inline isl::boolean range_is_wrapping() const;
-  inline isl::map range_map() const;
-  inline isl::map range_product(isl::map map2) const;
-  inline isl::map remove_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::map remove_divs() const;
-  inline isl::map remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::map remove_redundancies() const;
-  inline isl::map remove_unknown_divs() const;
-  inline isl::map reset_tuple_id(isl::dim type) const;
-  inline isl::map reset_user() const;
-  inline isl::map reverse() const;
-  inline isl::basic_map sample() const;
-  inline isl::map set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::map set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::map set_tuple_name(isl::dim type, const std::string &s) const;
-  inline isl::basic_map simple_hull() const;
-  inline isl::map subtract(isl::map map2) const;
-  inline isl::map subtract_domain(isl::set dom) const;
-  inline isl::map subtract_range(isl::set dom) const;
-  inline isl::map sum(isl::map map2) const;
-  inline isl::map uncurry() const;
-  inline isl::map unite(isl::map map2) const;
-  static inline isl::map universe(isl::space space);
-  inline isl::basic_map unshifted_simple_hull() const;
-  inline isl::basic_map unshifted_simple_hull_from_map_list(isl::map_list list) const;
-  inline isl::map upper_bound_si(isl::dim type, unsigned int pos, int value) const;
-  inline isl::set wrap() const;
-  inline isl::map zip() const;
+  static inline map nat_universe(space dim);
+  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(multi_aff ma) const;
+  inline map preimage_domain_multi_pw_aff(multi_pw_aff mpa) const;
+  inline map preimage_domain_pw_multi_aff(pw_multi_aff pma) const;
+  inline map preimage_range_multi_aff(multi_aff ma) const;
+  inline map preimage_range_pw_multi_aff(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 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 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_si(isl::dim type, unsigned int pos, int value) const;
+  inline set wrap() const;
+  inline map zip() const;
 };
 
 // declarations for isl::map_list
-inline isl::map_list manage(__isl_take isl_map_list *ptr);
-inline isl::map_list manage_copy(__isl_keep isl_map_list *ptr);
+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 isl::map_list manage(__isl_take isl_map_list *ptr);
-  friend inline isl::map_list manage_copy(__isl_keep isl_map_list *ptr);
+  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;
 
@@ -1426,9 +1426,9 @@
 
 public:
   inline /* implicit */ map_list();
-  inline /* implicit */ map_list(const isl::map_list &obj);
+  inline /* implicit */ map_list(const map_list &obj);
   inline /* implicit */ map_list(std::nullptr_t);
-  inline isl::map_list &operator=(isl::map_list obj);
+  inline map_list &operator=(map_list obj);
   inline ~map_list();
   inline __isl_give isl_map_list *copy() const &;
   inline __isl_give isl_map_list *copy() && = delete;
@@ -1436,32 +1436,32 @@
   inline __isl_give isl_map_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::map_list add(isl::map el) const;
-  static inline isl::map_list alloc(isl::ctx ctx, int n);
-  inline isl::map_list concat(isl::map_list list2) const;
-  inline isl::map_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::map)> &fn) const;
-  static inline isl::map_list from_map(isl::map el);
-  inline isl::map get_at(int index) const;
-  inline isl::map get_map(int index) const;
-  inline isl::map_list insert(unsigned int pos, isl::map el) const;
+  inline map_list add(map el) const;
+  static inline map_list alloc(ctx ctx, int n);
+  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 int n_map() const;
-  inline isl::map_list reverse() const;
-  inline isl::map_list set_map(int index, isl::map el) const;
+  inline map_list reverse() const;
+  inline map_list set_map(int index, map el) const;
   inline int size() const;
-  inline isl::map_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline map_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::mat
-inline isl::mat manage(__isl_take isl_mat *ptr);
-inline isl::mat manage_copy(__isl_keep isl_mat *ptr);
+inline mat manage(__isl_take isl_mat *ptr);
+inline mat manage_copy(__isl_keep isl_mat *ptr);
 
 class mat {
-  friend inline isl::mat manage(__isl_take isl_mat *ptr);
-  friend inline isl::mat manage_copy(__isl_keep isl_mat *ptr);
+  friend inline mat manage(__isl_take isl_mat *ptr);
+  friend inline mat manage_copy(__isl_keep isl_mat *ptr);
 
   isl_mat *ptr = nullptr;
 
@@ -1469,9 +1469,9 @@
 
 public:
   inline /* implicit */ mat();
-  inline /* implicit */ mat(const isl::mat &obj);
+  inline /* implicit */ mat(const mat &obj);
   inline /* implicit */ mat(std::nullptr_t);
-  inline isl::mat &operator=(isl::mat obj);
+  inline mat &operator=(mat obj);
   inline ~mat();
   inline __isl_give isl_mat *copy() const &;
   inline __isl_give isl_mat *copy() && = delete;
@@ -1479,58 +1479,58 @@
   inline __isl_give isl_mat *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::mat add_rows(unsigned int n) const;
-  inline isl::mat add_zero_cols(unsigned int n) const;
-  inline isl::mat add_zero_rows(unsigned int n) const;
-  inline isl::mat aff_direct_sum(isl::mat right) const;
-  static inline isl::mat alloc(isl::ctx ctx, unsigned int n_row, unsigned int n_col);
+  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 int cols() const;
-  inline isl::mat concat(isl::mat bot) const;
-  inline isl::mat diagonal(isl::mat mat2) const;
-  inline isl::mat drop_cols(unsigned int col, unsigned int n) const;
-  inline isl::mat drop_rows(unsigned int row, unsigned int n) const;
-  static inline isl::mat from_row_vec(isl::vec vec);
-  inline isl::val get_element_val(int row, int col) const;
-  inline isl::boolean has_linearly_independent_rows(const isl::mat &mat2) 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 isl::mat insert_cols(unsigned int col, unsigned int n) const;
-  inline isl::mat insert_rows(unsigned int row, unsigned int n) const;
-  inline isl::mat insert_zero_cols(unsigned int first, unsigned int n) const;
-  inline isl::mat insert_zero_rows(unsigned int row, unsigned int n) const;
-  inline isl::mat inverse_product(isl::mat right) const;
-  inline isl::boolean is_equal(const isl::mat &mat2) const;
-  inline isl::mat lin_to_aff() const;
-  inline isl::mat move_cols(unsigned int dst_col, unsigned int src_col, unsigned int n) const;
-  inline isl::mat normalize() const;
-  inline isl::mat normalize_row(int row) const;
-  inline isl::mat product(isl::mat right) 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 int rank() const;
-  inline isl::mat right_inverse() const;
-  inline isl::mat right_kernel() const;
-  inline isl::mat row_basis() const;
-  inline isl::mat row_basis_extension(isl::mat mat2) 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 int rows() const;
-  inline isl::mat set_element_si(int row, int col, int v) const;
-  inline isl::mat set_element_val(int row, int col, isl::val v) const;
-  inline isl::mat swap_cols(unsigned int i, unsigned int j) const;
-  inline isl::mat swap_rows(unsigned int i, unsigned int j) const;
-  inline isl::mat transpose() const;
-  inline isl::mat unimodular_complete(int row) const;
-  inline isl::mat vec_concat(isl::vec bot) const;
-  inline isl::vec vec_inverse_product(isl::vec vec) const;
-  inline isl::vec vec_product(isl::vec vec) 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 isl::multi_aff manage(__isl_take isl_multi_aff *ptr);
-inline isl::multi_aff manage_copy(__isl_keep isl_multi_aff *ptr);
+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 isl::multi_aff manage(__isl_take isl_multi_aff *ptr);
-  friend inline isl::multi_aff manage_copy(__isl_keep isl_multi_aff *ptr);
+  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;
 
@@ -1538,11 +1538,11 @@
 
 public:
   inline /* implicit */ multi_aff();
-  inline /* implicit */ multi_aff(const isl::multi_aff &obj);
+  inline /* implicit */ multi_aff(const multi_aff &obj);
   inline /* implicit */ multi_aff(std::nullptr_t);
-  inline /* implicit */ multi_aff(isl::aff aff);
-  inline explicit multi_aff(isl::ctx ctx, const std::string &str);
-  inline isl::multi_aff &operator=(isl::multi_aff obj);
+  inline /* implicit */ multi_aff(aff aff);
+  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;
@@ -1550,80 +1550,80 @@
   inline __isl_give isl_multi_aff *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::multi_aff add(isl::multi_aff multi2) const;
-  inline isl::multi_aff add_dims(isl::dim type, unsigned int n) const;
-  inline isl::multi_aff align_params(isl::space model) const;
+  inline multi_aff add(multi_aff multi2) const;
+  inline multi_aff add_dims(isl::dim type, unsigned int n) const;
+  inline multi_aff align_params(space model) const;
   inline unsigned int dim(isl::dim type) const;
-  static inline isl::multi_aff domain_map(isl::space space);
-  inline isl::multi_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::multi_aff factor_range() const;
-  inline int find_dim_by_id(isl::dim type, const isl::id &id) 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 isl::multi_aff flat_range_product(isl::multi_aff multi2) const;
-  inline isl::multi_aff flatten_domain() const;
-  inline isl::multi_aff flatten_range() const;
-  inline isl::multi_aff floor() const;
-  static inline isl::multi_aff from_aff_list(isl::space space, isl::aff_list list);
-  inline isl::multi_aff from_range() const;
-  inline isl::aff get_aff(int pos) const;
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) const;
-  inline isl::space get_domain_space() const;
-  inline isl::space get_space() const;
-  inline isl::id get_tuple_id(isl::dim type) 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;
+  static inline multi_aff from_aff_list(space space, aff_list list);
+  inline multi_aff from_range() const;
+  inline aff get_aff(int pos) const;
+  inline id get_dim_id(isl::dim type, unsigned int pos) const;
+  inline space get_domain_space() 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 isl::multi_aff gist(isl::set context) const;
-  inline isl::multi_aff gist_params(isl::set context) const;
-  inline isl::boolean has_tuple_id(isl::dim type) const;
-  static inline isl::multi_aff identity(isl::space space);
-  inline isl::multi_aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean involves_nan() const;
-  inline isl::set lex_ge_set(isl::multi_aff ma2) const;
-  inline isl::set lex_gt_set(isl::multi_aff ma2) const;
-  inline isl::set lex_le_set(isl::multi_aff ma2) const;
-  inline isl::set lex_lt_set(isl::multi_aff ma2) const;
-  inline isl::multi_aff mod_multi_val(isl::multi_val mv) const;
-  inline isl::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 isl::multi_aff multi_val_on_space(isl::space space, isl::multi_val mv);
-  inline isl::multi_aff neg() const;
-  inline int plain_cmp(const isl::multi_aff &multi2) const;
-  inline isl::boolean plain_is_equal(const isl::multi_aff &multi2) const;
-  inline isl::multi_aff product(isl::multi_aff multi2) const;
-  inline isl::multi_aff project_domain_on_params() const;
-  static inline isl::multi_aff project_out_map(isl::space space, isl::dim type, unsigned int first, unsigned int n);
-  inline isl::multi_aff pullback(isl::multi_aff ma2) const;
-  inline isl::multi_aff range_factor_domain() const;
-  inline isl::multi_aff range_factor_range() const;
-  inline isl::boolean range_is_wrapping() const;
-  static inline isl::multi_aff range_map(isl::space space);
-  inline isl::multi_aff range_product(isl::multi_aff multi2) const;
-  inline isl::multi_aff range_splice(unsigned int pos, isl::multi_aff multi2) const;
-  inline isl::multi_aff reset_tuple_id(isl::dim type) const;
-  inline isl::multi_aff reset_user() const;
-  inline isl::multi_aff scale_down_multi_val(isl::multi_val mv) const;
-  inline isl::multi_aff scale_down_val(isl::val v) const;
-  inline isl::multi_aff scale_multi_val(isl::multi_val mv) const;
-  inline isl::multi_aff scale_val(isl::val v) const;
-  inline isl::multi_aff set_aff(int pos, isl::aff el) const;
-  inline isl::multi_aff set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::multi_aff set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::multi_aff set_tuple_name(isl::dim type, const std::string &s) const;
-  inline isl::multi_aff splice(unsigned int in_pos, unsigned int out_pos, isl::multi_aff multi2) const;
-  inline isl::multi_aff sub(isl::multi_aff multi2) const;
-  static inline isl::multi_aff zero(isl::space space);
+  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 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 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_down_multi_val(multi_val mv) const;
+  inline multi_aff scale_down_val(val v) const;
+  inline multi_aff scale_multi_val(multi_val mv) const;
+  inline multi_aff scale_val(val v) const;
+  inline multi_aff set_aff(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 multi_aff splice(unsigned int in_pos, unsigned int out_pos, multi_aff multi2) const;
+  inline multi_aff sub(multi_aff multi2) const;
+  static inline multi_aff zero(space space);
 };
 
 // declarations for isl::multi_pw_aff
-inline isl::multi_pw_aff manage(__isl_take isl_multi_pw_aff *ptr);
-inline isl::multi_pw_aff manage_copy(__isl_keep isl_multi_pw_aff *ptr);
+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 isl::multi_pw_aff manage(__isl_take isl_multi_pw_aff *ptr);
-  friend inline isl::multi_pw_aff manage_copy(__isl_keep isl_multi_pw_aff *ptr);
+  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;
 
@@ -1631,13 +1631,13 @@
 
 public:
   inline /* implicit */ multi_pw_aff();
-  inline /* implicit */ multi_pw_aff(const isl::multi_pw_aff &obj);
+  inline /* implicit */ multi_pw_aff(const multi_pw_aff &obj);
   inline /* implicit */ multi_pw_aff(std::nullptr_t);
-  inline /* implicit */ multi_pw_aff(isl::multi_aff ma);
-  inline /* implicit */ multi_pw_aff(isl::pw_aff pa);
-  inline /* implicit */ multi_pw_aff(isl::pw_multi_aff pma);
-  inline explicit multi_pw_aff(isl::ctx ctx, const std::string &str);
-  inline isl::multi_pw_aff &operator=(isl::multi_pw_aff obj);
+  inline /* implicit */ multi_pw_aff(multi_aff ma);
+  inline /* implicit */ multi_pw_aff(pw_aff pa);
+  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;
@@ -1645,81 +1645,81 @@
   inline __isl_give isl_multi_pw_aff *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::multi_pw_aff add(isl::multi_pw_aff multi2) const;
-  inline isl::multi_pw_aff add_dims(isl::dim type, unsigned int n) const;
-  inline isl::multi_pw_aff align_params(isl::space model) const;
-  inline isl::multi_pw_aff coalesce() const;
+  inline multi_pw_aff add(multi_pw_aff multi2) const;
+  inline multi_pw_aff add_dims(isl::dim type, unsigned int n) const;
+  inline multi_pw_aff align_params(space model) const;
+  inline multi_pw_aff coalesce() const;
   inline unsigned int dim(isl::dim type) const;
-  inline isl::set domain() const;
-  inline isl::multi_pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::map eq_map(isl::multi_pw_aff mpa2) const;
-  inline isl::multi_pw_aff factor_range() const;
-  inline int find_dim_by_id(isl::dim type, const isl::id &id) 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 isl::multi_pw_aff flat_range_product(isl::multi_pw_aff multi2) const;
-  inline isl::multi_pw_aff flatten_range() const;
-  static inline isl::multi_pw_aff from_pw_aff_list(isl::space space, isl::pw_aff_list list);
-  inline isl::multi_pw_aff from_range() const;
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) const;
-  inline isl::space get_domain_space() const;
+  inline multi_pw_aff flat_range_product(multi_pw_aff multi2) const;
+  inline multi_pw_aff flatten_range() const;
+  static inline multi_pw_aff from_pw_aff_list(space space, pw_aff_list list);
+  inline multi_pw_aff from_range() 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 isl::pw_aff get_pw_aff(int pos) const;
-  inline isl::space get_space() const;
-  inline isl::id get_tuple_id(isl::dim type) 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 isl::multi_pw_aff gist(isl::set set) const;
-  inline isl::multi_pw_aff gist_params(isl::set set) const;
-  inline isl::boolean has_tuple_id(isl::dim type) const;
-  static inline isl::multi_pw_aff identity(isl::space space);
-  inline isl::multi_pw_aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::multi_pw_aff intersect_domain(isl::set domain) const;
-  inline isl::multi_pw_aff intersect_params(isl::set set) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean involves_nan() const;
-  inline isl::boolean is_cst() const;
-  inline isl::boolean is_equal(const isl::multi_pw_aff &mpa2) const;
-  inline isl::map lex_gt_map(isl::multi_pw_aff mpa2) const;
-  inline isl::map lex_lt_map(isl::multi_pw_aff mpa2) const;
-  inline isl::multi_pw_aff mod_multi_val(isl::multi_val mv) const;
-  inline isl::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 isl::multi_pw_aff neg() const;
-  inline isl::boolean plain_is_equal(const isl::multi_pw_aff &multi2) const;
-  inline isl::multi_pw_aff product(isl::multi_pw_aff multi2) const;
-  inline isl::multi_pw_aff project_domain_on_params() const;
-  inline isl::multi_pw_aff pullback(isl::multi_aff ma) const;
-  inline isl::multi_pw_aff pullback(isl::pw_multi_aff pma) const;
-  inline isl::multi_pw_aff pullback(isl::multi_pw_aff mpa2) const;
-  inline isl::multi_pw_aff range_factor_domain() const;
-  inline isl::multi_pw_aff range_factor_range() const;
-  inline isl::boolean range_is_wrapping() const;
-  inline isl::multi_pw_aff range_product(isl::multi_pw_aff multi2) const;
-  inline isl::multi_pw_aff range_splice(unsigned int pos, isl::multi_pw_aff multi2) const;
-  inline isl::multi_pw_aff reset_tuple_id(isl::dim type) const;
-  inline isl::multi_pw_aff reset_user() const;
-  inline isl::multi_pw_aff scale_down_multi_val(isl::multi_val mv) const;
-  inline isl::multi_pw_aff scale_down_val(isl::val v) const;
-  inline isl::multi_pw_aff scale_multi_val(isl::multi_val mv) const;
-  inline isl::multi_pw_aff scale_val(isl::val v) const;
-  inline isl::multi_pw_aff set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::multi_pw_aff set_pw_aff(int pos, isl::pw_aff el) const;
-  inline isl::multi_pw_aff set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::multi_pw_aff set_tuple_name(isl::dim type, const std::string &s) const;
-  inline isl::multi_pw_aff splice(unsigned int in_pos, unsigned int out_pos, isl::multi_pw_aff multi2) const;
-  inline isl::multi_pw_aff sub(isl::multi_pw_aff multi2) const;
-  static inline isl::multi_pw_aff zero(isl::space space);
+  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 insert_dims(isl::dim type, unsigned int first, unsigned int n) 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 is_cst() const;
+  inline boolean is_equal(const multi_pw_aff &mpa2) const;
+  inline map lex_gt_map(multi_pw_aff mpa2) const;
+  inline map lex_lt_map(multi_pw_aff mpa2) 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(pw_multi_aff pma) const;
+  inline multi_pw_aff pullback(multi_pw_aff mpa2) 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_down_multi_val(multi_val mv) const;
+  inline multi_pw_aff scale_down_val(val v) const;
+  inline multi_pw_aff scale_multi_val(multi_val mv) const;
+  inline multi_pw_aff scale_val(val v) 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 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;
+  static inline multi_pw_aff zero(space space);
 };
 
 // declarations for isl::multi_union_pw_aff
-inline isl::multi_union_pw_aff manage(__isl_take isl_multi_union_pw_aff *ptr);
-inline isl::multi_union_pw_aff manage_copy(__isl_keep isl_multi_union_pw_aff *ptr);
+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 isl::multi_union_pw_aff manage(__isl_take isl_multi_union_pw_aff *ptr);
-  friend inline isl::multi_union_pw_aff manage_copy(__isl_keep isl_multi_union_pw_aff *ptr);
+  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;
 
@@ -1727,13 +1727,13 @@
 
 public:
   inline /* implicit */ multi_union_pw_aff();
-  inline /* implicit */ multi_union_pw_aff(const isl::multi_union_pw_aff &obj);
+  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(isl::union_pw_aff upa);
-  inline /* implicit */ multi_union_pw_aff(isl::multi_pw_aff mpa);
-  inline explicit multi_union_pw_aff(isl::union_pw_multi_aff upma);
-  inline explicit multi_union_pw_aff(isl::ctx ctx, const std::string &str);
-  inline isl::multi_union_pw_aff &operator=(isl::multi_union_pw_aff obj);
+  inline /* implicit */ multi_union_pw_aff(union_pw_aff upa);
+  inline /* implicit */ multi_union_pw_aff(multi_pw_aff mpa);
+  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;
@@ -1741,80 +1741,80 @@
   inline __isl_give isl_multi_union_pw_aff *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::multi_union_pw_aff add(isl::multi_union_pw_aff multi2) const;
-  inline isl::multi_union_pw_aff align_params(isl::space model) const;
-  inline isl::union_pw_aff apply_aff(isl::aff aff) const;
-  inline isl::union_pw_aff apply_pw_aff(isl::pw_aff pa) const;
-  inline isl::multi_union_pw_aff apply_pw_multi_aff(isl::pw_multi_aff pma) const;
-  inline isl::multi_union_pw_aff coalesce() 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 multi_union_pw_aff coalesce() const;
   inline unsigned int dim(isl::dim type) const;
-  inline isl::union_set domain() const;
-  inline isl::multi_union_pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::multi_pw_aff extract_multi_pw_aff(isl::space space) const;
-  inline isl::multi_union_pw_aff factor_range() const;
-  inline int find_dim_by_id(isl::dim type, const isl::id &id) 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 isl::multi_union_pw_aff flat_range_product(isl::multi_union_pw_aff multi2) const;
-  inline isl::multi_union_pw_aff flatten_range() const;
-  inline isl::multi_union_pw_aff floor() const;
-  static inline isl::multi_union_pw_aff from_multi_aff(isl::multi_aff ma);
-  inline isl::multi_union_pw_aff from_range() const;
-  static inline isl::multi_union_pw_aff from_union_map(isl::union_map umap);
-  static inline isl::multi_union_pw_aff from_union_pw_aff_list(isl::space space, isl::union_pw_aff_list list);
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) const;
-  inline isl::space get_domain_space() const;
-  inline isl::space get_space() const;
-  inline isl::id get_tuple_id(isl::dim type) 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);
+  static inline multi_union_pw_aff from_union_pw_aff_list(space space, union_pw_aff_list list);
+  inline id get_dim_id(isl::dim type, unsigned int pos) const;
+  inline space get_domain_space() 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 isl::union_pw_aff get_union_pw_aff(int pos) const;
-  inline isl::multi_union_pw_aff gist(isl::union_set context) const;
-  inline isl::multi_union_pw_aff gist_params(isl::set context) const;
-  inline isl::boolean has_tuple_id(isl::dim type) const;
-  inline isl::multi_union_pw_aff intersect_domain(isl::union_set uset) const;
-  inline isl::multi_union_pw_aff intersect_params(isl::set params) const;
-  inline isl::multi_union_pw_aff intersect_range(isl::set set) const;
-  inline isl::boolean involves_nan() const;
-  inline isl::multi_val max_multi_val() const;
-  inline isl::multi_val min_multi_val() const;
-  inline isl::multi_union_pw_aff mod_multi_val(isl::multi_val mv) const;
-  static inline isl::multi_union_pw_aff multi_aff_on_domain(isl::union_set domain, isl::multi_aff ma);
-  static inline isl::multi_union_pw_aff multi_val_on_domain(isl::union_set domain, isl::multi_val mv);
-  inline isl::multi_union_pw_aff neg() const;
-  inline isl::boolean plain_is_equal(const isl::multi_union_pw_aff &multi2) const;
-  inline isl::multi_union_pw_aff pullback(isl::union_pw_multi_aff upma) const;
-  static inline isl::multi_union_pw_aff pw_multi_aff_on_domain(isl::union_set domain, isl::pw_multi_aff pma);
-  inline isl::multi_union_pw_aff range_factor_domain() const;
-  inline isl::multi_union_pw_aff range_factor_range() const;
-  inline isl::boolean range_is_wrapping() const;
-  inline isl::multi_union_pw_aff range_product(isl::multi_union_pw_aff multi2) const;
-  inline isl::multi_union_pw_aff range_splice(unsigned int pos, isl::multi_union_pw_aff multi2) const;
-  inline isl::multi_union_pw_aff reset_tuple_id(isl::dim type) const;
-  inline isl::multi_union_pw_aff reset_user() const;
-  inline isl::multi_union_pw_aff scale_down_multi_val(isl::multi_val mv) const;
-  inline isl::multi_union_pw_aff scale_down_val(isl::val v) const;
-  inline isl::multi_union_pw_aff scale_multi_val(isl::multi_val mv) const;
-  inline isl::multi_union_pw_aff scale_val(isl::val v) const;
-  inline isl::multi_union_pw_aff set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::multi_union_pw_aff set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::multi_union_pw_aff set_tuple_name(isl::dim type, const std::string &s) const;
-  inline isl::multi_union_pw_aff set_union_pw_aff(int pos, isl::union_pw_aff el) const;
-  inline isl::multi_union_pw_aff sub(isl::multi_union_pw_aff multi2) const;
-  inline isl::multi_union_pw_aff union_add(isl::multi_union_pw_aff mupa2) const;
-  static inline isl::multi_union_pw_aff zero(isl::space space);
-  inline isl::union_set zero_union_set() 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_down_multi_val(multi_val mv) const;
+  inline multi_union_pw_aff scale_down_val(val v) const;
+  inline multi_union_pw_aff scale_multi_val(multi_val mv) const;
+  inline multi_union_pw_aff scale_val(val v) 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 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 isl::multi_val manage(__isl_take isl_multi_val *ptr);
-inline isl::multi_val manage_copy(__isl_keep isl_multi_val *ptr);
+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 isl::multi_val manage(__isl_take isl_multi_val *ptr);
-  friend inline isl::multi_val manage_copy(__isl_keep isl_multi_val *ptr);
+  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;
 
@@ -1822,9 +1822,9 @@
 
 public:
   inline /* implicit */ multi_val();
-  inline /* implicit */ multi_val(const isl::multi_val &obj);
+  inline /* implicit */ multi_val(const multi_val &obj);
   inline /* implicit */ multi_val(std::nullptr_t);
-  inline isl::multi_val &operator=(isl::multi_val obj);
+  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;
@@ -1832,67 +1832,67 @@
   inline __isl_give isl_multi_val *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::multi_val add(isl::multi_val multi2) const;
-  inline isl::multi_val add_dims(isl::dim type, unsigned int n) const;
-  inline isl::multi_val add_val(isl::val v) const;
-  inline isl::multi_val align_params(isl::space model) const;
+  inline multi_val add(multi_val multi2) const;
+  inline multi_val add_dims(isl::dim type, unsigned int n) const;
+  inline multi_val add_val(val v) const;
+  inline multi_val align_params(space model) const;
   inline unsigned int dim(isl::dim type) const;
-  inline isl::multi_val drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::multi_val factor_range() const;
-  inline int find_dim_by_id(isl::dim type, const isl::id &id) 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 isl::multi_val flat_range_product(isl::multi_val multi2) const;
-  inline isl::multi_val flatten_range() const;
-  inline isl::multi_val from_range() const;
-  static inline isl::multi_val from_val_list(isl::space space, isl::val_list list);
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) const;
-  inline isl::space get_domain_space() const;
-  inline isl::space get_space() const;
-  inline isl::id get_tuple_id(isl::dim type) const;
+  inline multi_val flat_range_product(multi_val multi2) const;
+  inline multi_val flatten_range() const;
+  inline multi_val from_range() const;
+  static inline multi_val from_val_list(space space, val_list list);
+  inline id get_dim_id(isl::dim type, unsigned int pos) const;
+  inline space get_domain_space() 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 isl::val get_val(int pos) const;
-  inline isl::boolean has_tuple_id(isl::dim type) const;
-  inline isl::multi_val insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean involves_nan() const;
-  inline isl::multi_val mod_multi_val(isl::multi_val mv) const;
-  inline isl::multi_val mod_val(isl::val v) const;
-  inline isl::multi_val neg() const;
-  inline isl::boolean plain_is_equal(const isl::multi_val &multi2) const;
-  inline isl::multi_val product(isl::multi_val multi2) const;
-  inline isl::multi_val project_domain_on_params() const;
-  inline isl::multi_val range_factor_domain() const;
-  inline isl::multi_val range_factor_range() const;
-  inline isl::boolean range_is_wrapping() const;
-  inline isl::multi_val range_product(isl::multi_val multi2) const;
-  inline isl::multi_val range_splice(unsigned int pos, isl::multi_val multi2) const;
-  static inline isl::multi_val read_from_str(isl::ctx ctx, const std::string &str);
-  inline isl::multi_val reset_tuple_id(isl::dim type) const;
-  inline isl::multi_val reset_user() const;
-  inline isl::multi_val scale_down_multi_val(isl::multi_val mv) const;
-  inline isl::multi_val scale_down_val(isl::val v) const;
-  inline isl::multi_val scale_multi_val(isl::multi_val mv) const;
-  inline isl::multi_val scale_val(isl::val v) const;
-  inline isl::multi_val set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::multi_val set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::multi_val set_tuple_name(isl::dim type, const std::string &s) const;
-  inline isl::multi_val set_val(int pos, isl::val el) const;
-  inline isl::multi_val splice(unsigned int in_pos, unsigned int out_pos, isl::multi_val multi2) const;
-  inline isl::multi_val sub(isl::multi_val multi2) const;
-  static inline isl::multi_val zero(isl::space space);
+  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 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;
+  static inline multi_val read_from_str(ctx ctx, const std::string &str);
+  inline multi_val reset_tuple_id(isl::dim type) const;
+  inline multi_val reset_user() const;
+  inline multi_val scale_down_multi_val(multi_val mv) const;
+  inline multi_val scale_down_val(val v) const;
+  inline multi_val scale_multi_val(multi_val mv) const;
+  inline multi_val scale_val(val v) 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 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 isl::point manage(__isl_take isl_point *ptr);
-inline isl::point manage_copy(__isl_keep isl_point *ptr);
+inline point manage(__isl_take isl_point *ptr);
+inline point manage_copy(__isl_keep isl_point *ptr);
 
 class point {
-  friend inline isl::point manage(__isl_take isl_point *ptr);
-  friend inline isl::point manage_copy(__isl_keep isl_point *ptr);
+  friend inline point manage(__isl_take isl_point *ptr);
+  friend inline point manage_copy(__isl_keep isl_point *ptr);
 
   isl_point *ptr = nullptr;
 
@@ -1900,10 +1900,10 @@
 
 public:
   inline /* implicit */ point();
-  inline /* implicit */ point(const isl::point &obj);
+  inline /* implicit */ point(const point &obj);
   inline /* implicit */ point(std::nullptr_t);
-  inline explicit point(isl::space dim);
-  inline isl::point &operator=(isl::point obj);
+  inline explicit point(space dim);
+  inline point &operator=(point obj);
   inline ~point();
   inline __isl_give isl_point *copy() const &;
   inline __isl_give isl_point *copy() && = delete;
@@ -1911,24 +1911,24 @@
   inline __isl_give isl_point *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::point add_ui(isl::dim type, int pos, unsigned int val) const;
-  inline isl::val get_coordinate_val(isl::dim type, int pos) const;
-  inline isl::space get_space() const;
-  inline isl::point set_coordinate_val(isl::dim type, int pos, isl::val v) const;
-  inline isl::point sub_ui(isl::dim type, int pos, unsigned int val) 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 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 isl::pw_aff manage(__isl_take isl_pw_aff *ptr);
-inline isl::pw_aff manage_copy(__isl_keep isl_pw_aff *ptr);
+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 isl::pw_aff manage(__isl_take isl_pw_aff *ptr);
-  friend inline isl::pw_aff manage_copy(__isl_keep isl_pw_aff *ptr);
+  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;
 
@@ -1936,13 +1936,13 @@
 
 public:
   inline /* implicit */ pw_aff();
-  inline /* implicit */ pw_aff(const isl::pw_aff &obj);
+  inline /* implicit */ pw_aff(const pw_aff &obj);
   inline /* implicit */ pw_aff(std::nullptr_t);
-  inline /* implicit */ pw_aff(isl::aff aff);
-  inline explicit pw_aff(isl::local_space ls);
-  inline explicit pw_aff(isl::set domain, isl::val v);
-  inline explicit pw_aff(isl::ctx ctx, const std::string &str);
-  inline isl::pw_aff &operator=(isl::pw_aff obj);
+  inline /* implicit */ pw_aff(aff aff);
+  inline explicit pw_aff(local_space ls);
+  inline explicit pw_aff(set domain, val v);
+  inline explicit pw_aff(ctx ctx, const std::string &str);
+  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;
@@ -1950,97 +1950,97 @@
   inline __isl_give isl_pw_aff *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::pw_aff add(isl::pw_aff pwaff2) const;
-  inline isl::pw_aff add_dims(isl::dim type, unsigned int n) const;
-  inline isl::pw_aff align_params(isl::space model) const;
-  static inline isl::pw_aff alloc(isl::set set, isl::aff aff);
-  inline isl::pw_aff ceil() const;
-  inline isl::pw_aff coalesce() const;
-  inline isl::pw_aff cond(isl::pw_aff pwaff_true, isl::pw_aff pwaff_false) const;
+  inline pw_aff add(pw_aff pwaff2) 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 pw_aff ceil() const;
+  inline pw_aff coalesce() const;
+  inline pw_aff cond(pw_aff pwaff_true, pw_aff pwaff_false) const;
   inline unsigned int dim(isl::dim type) const;
-  inline isl::pw_aff div(isl::pw_aff pa2) const;
-  inline isl::set domain() const;
-  inline isl::pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::pw_aff drop_unused_params() const;
-  static inline isl::pw_aff empty(isl::space dim);
-  inline isl::map eq_map(isl::pw_aff pa2) const;
-  inline isl::set eq_set(isl::pw_aff pwaff2) const;
-  inline isl::val eval(isl::point pnt) 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 dim);
+  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 isl::pw_aff floor() const;
-  inline isl::stat foreach_piece(const std::function<isl::stat(isl::set, isl::aff)> &fn) const;
-  inline isl::pw_aff from_range() const;
-  inline isl::set ge_set(isl::pw_aff pwaff2) const;
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) 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 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 isl::space get_domain_space() const;
+  inline space get_domain_space() const;
   inline uint32_t get_hash() const;
-  inline isl::space get_space() const;
-  inline isl::id get_tuple_id(isl::dim type) const;
-  inline isl::pw_aff gist(isl::set context) const;
-  inline isl::pw_aff gist_params(isl::set context) const;
-  inline isl::map gt_map(isl::pw_aff pa2) const;
-  inline isl::set gt_set(isl::pw_aff pwaff2) const;
-  inline isl::boolean has_dim_id(isl::dim type, unsigned int pos) const;
-  inline isl::boolean has_tuple_id(isl::dim type) const;
-  inline isl::pw_aff insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::pw_aff intersect_domain(isl::set set) const;
-  inline isl::pw_aff intersect_params(isl::set set) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean involves_nan() const;
-  inline isl::boolean is_cst() const;
-  inline isl::boolean is_empty() const;
-  inline isl::boolean is_equal(const isl::pw_aff &pa2) const;
-  inline isl::set le_set(isl::pw_aff pwaff2) const;
-  inline isl::map lt_map(isl::pw_aff pa2) const;
-  inline isl::set lt_set(isl::pw_aff pwaff2) const;
-  inline isl::pw_aff max(isl::pw_aff pwaff2) const;
-  inline isl::pw_aff min(isl::pw_aff pwaff2) const;
-  inline isl::pw_aff mod(isl::val mod) const;
-  inline isl::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 isl::pw_aff mul(isl::pw_aff pwaff2) 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 intersect_domain(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 is_cst() const;
+  inline boolean is_empty() const;
+  inline boolean is_equal(const 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 int n_piece() const;
-  static inline isl::pw_aff nan_on_domain(isl::local_space ls);
-  inline isl::set ne_set(isl::pw_aff pwaff2) const;
-  inline isl::pw_aff neg() const;
-  inline isl::set non_zero_set() const;
-  inline isl::set nonneg_set() const;
-  inline isl::set params() const;
-  inline int plain_cmp(const isl::pw_aff &pa2) const;
-  inline isl::boolean plain_is_equal(const isl::pw_aff &pwaff2) const;
-  inline isl::set pos_set() const;
-  inline isl::pw_aff project_domain_on_params() const;
-  inline isl::pw_aff pullback(isl::multi_aff ma) const;
-  inline isl::pw_aff pullback(isl::pw_multi_aff pma) const;
-  inline isl::pw_aff pullback(isl::multi_pw_aff mpa) const;
-  inline isl::pw_aff reset_tuple_id(isl::dim type) const;
-  inline isl::pw_aff reset_user() const;
-  inline isl::pw_aff scale(isl::val v) const;
-  inline isl::pw_aff scale_down(isl::val f) const;
-  inline isl::pw_aff set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::pw_aff set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::pw_aff sub(isl::pw_aff pwaff2) const;
-  inline isl::pw_aff subtract_domain(isl::set set) const;
-  inline isl::pw_aff tdiv_q(isl::pw_aff pa2) const;
-  inline isl::pw_aff tdiv_r(isl::pw_aff pa2) const;
-  inline isl::pw_aff union_add(isl::pw_aff pwaff2) const;
-  inline isl::pw_aff union_max(isl::pw_aff pwaff2) const;
-  inline isl::pw_aff union_min(isl::pw_aff pwaff2) const;
-  static inline isl::pw_aff var_on_domain(isl::local_space ls, isl::dim type, unsigned int pos);
-  inline isl::set zero_set() const;
+  static inline pw_aff nan_on_domain(local_space ls);
+  inline set ne_set(pw_aff pwaff2) const;
+  inline pw_aff neg() const;
+  inline set non_zero_set() const;
+  inline set nonneg_set() const;
+  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(pw_multi_aff pma) const;
+  inline pw_aff pullback(multi_pw_aff mpa) 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 isl::pw_aff_list manage(__isl_take isl_pw_aff_list *ptr);
-inline isl::pw_aff_list manage_copy(__isl_keep isl_pw_aff_list *ptr);
+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 isl::pw_aff_list manage(__isl_take isl_pw_aff_list *ptr);
-  friend inline isl::pw_aff_list manage_copy(__isl_keep isl_pw_aff_list *ptr);
+  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;
 
@@ -2048,9 +2048,9 @@
 
 public:
   inline /* implicit */ pw_aff_list();
-  inline /* implicit */ pw_aff_list(const isl::pw_aff_list &obj);
+  inline /* implicit */ pw_aff_list(const pw_aff_list &obj);
   inline /* implicit */ pw_aff_list(std::nullptr_t);
-  inline isl::pw_aff_list &operator=(isl::pw_aff_list obj);
+  inline pw_aff_list &operator=(pw_aff_list obj);
   inline ~pw_aff_list();
   inline __isl_give isl_pw_aff_list *copy() const &;
   inline __isl_give isl_pw_aff_list *copy() && = delete;
@@ -2058,40 +2058,40 @@
   inline __isl_give isl_pw_aff_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::pw_aff_list add(isl::pw_aff el) const;
-  static inline isl::pw_aff_list alloc(isl::ctx ctx, int n);
-  inline isl::pw_aff_list concat(isl::pw_aff_list list2) const;
-  inline isl::pw_aff_list drop(unsigned int first, unsigned int n) const;
-  inline isl::set eq_set(isl::pw_aff_list list2) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::pw_aff)> &fn) const;
-  static inline isl::pw_aff_list from_pw_aff(isl::pw_aff el);
-  inline isl::set ge_set(isl::pw_aff_list list2) const;
-  inline isl::pw_aff get_at(int index) const;
-  inline isl::pw_aff get_pw_aff(int index) const;
-  inline isl::set gt_set(isl::pw_aff_list list2) const;
-  inline isl::pw_aff_list insert(unsigned int pos, isl::pw_aff el) const;
-  inline isl::set le_set(isl::pw_aff_list list2) const;
-  inline isl::set lt_set(isl::pw_aff_list list2) const;
-  inline isl::pw_aff max() const;
-  inline isl::pw_aff min() const;
+  inline pw_aff_list add(pw_aff el) const;
+  static inline pw_aff_list alloc(ctx ctx, int n);
+  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 int n_pw_aff() const;
-  inline isl::set ne_set(isl::pw_aff_list list2) const;
-  inline isl::pw_aff_list reverse() const;
-  inline isl::pw_aff_list set_pw_aff(int index, isl::pw_aff el) 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 int size() const;
-  inline isl::pw_aff_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline pw_aff_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::pw_multi_aff
-inline isl::pw_multi_aff manage(__isl_take isl_pw_multi_aff *ptr);
-inline isl::pw_multi_aff manage_copy(__isl_keep isl_pw_multi_aff *ptr);
+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 isl::pw_multi_aff manage(__isl_take isl_pw_multi_aff *ptr);
-  friend inline isl::pw_multi_aff manage_copy(__isl_keep isl_pw_multi_aff *ptr);
+  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;
 
@@ -2099,12 +2099,12 @@
 
 public:
   inline /* implicit */ pw_multi_aff();
-  inline /* implicit */ pw_multi_aff(const isl::pw_multi_aff &obj);
+  inline /* implicit */ pw_multi_aff(const pw_multi_aff &obj);
   inline /* implicit */ pw_multi_aff(std::nullptr_t);
-  inline /* implicit */ pw_multi_aff(isl::multi_aff ma);
-  inline /* implicit */ pw_multi_aff(isl::pw_aff pa);
-  inline explicit pw_multi_aff(isl::ctx ctx, const std::string &str);
-  inline isl::pw_multi_aff &operator=(isl::pw_multi_aff obj);
+  inline /* implicit */ pw_multi_aff(multi_aff ma);
+  inline /* implicit */ pw_multi_aff(pw_aff pa);
+  inline explicit pw_multi_aff(ctx ctx, const std::string &str);
+  inline pw_multi_aff &operator=(pw_multi_aff obj);
   inline ~pw_multi_aff();
   inline __isl_give isl_pw_multi_aff *copy() const &;
   inline __isl_give isl_pw_multi_aff *copy() && = delete;
@@ -2112,78 +2112,78 @@
   inline __isl_give isl_pw_multi_aff *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::pw_multi_aff add(isl::pw_multi_aff pma2) const;
-  inline isl::pw_multi_aff align_params(isl::space model) const;
-  static inline isl::pw_multi_aff alloc(isl::set set, isl::multi_aff maff);
-  inline isl::pw_multi_aff coalesce() const;
+  inline pw_multi_aff add(pw_multi_aff pma2) const;
+  inline pw_multi_aff align_params(space model) const;
+  static inline pw_multi_aff alloc(set set, multi_aff maff);
+  inline pw_multi_aff coalesce() const;
   inline unsigned int dim(isl::dim type) const;
-  inline isl::set domain() const;
-  inline isl::pw_multi_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::pw_multi_aff drop_unused_params() const;
-  static inline isl::pw_multi_aff empty(isl::space space);
+  inline set domain() const;
+  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 isl::pw_multi_aff fix_si(isl::dim type, unsigned int pos, int value) const;
-  inline isl::pw_multi_aff flat_range_product(isl::pw_multi_aff pma2) const;
-  inline isl::stat foreach_piece(const std::function<isl::stat(isl::set, isl::multi_aff)> &fn) const;
-  static inline isl::pw_multi_aff from_domain(isl::set set);
-  static inline isl::pw_multi_aff from_map(isl::map map);
-  static inline isl::pw_multi_aff from_multi_pw_aff(isl::multi_pw_aff mpa);
-  static inline isl::pw_multi_aff from_set(isl::set set);
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) 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 isl::space get_domain_space() const;
-  inline isl::pw_aff get_pw_aff(int pos) const;
-  inline isl::space get_space() const;
-  inline isl::id get_tuple_id(isl::dim type) 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 isl::pw_multi_aff gist(isl::set set) const;
-  inline isl::pw_multi_aff gist_params(isl::set set) const;
-  inline isl::boolean has_tuple_id(isl::dim type) const;
-  inline isl::boolean has_tuple_name(isl::dim type) const;
-  static inline isl::pw_multi_aff identity(isl::space space);
-  inline isl::pw_multi_aff intersect_domain(isl::set set) const;
-  inline isl::pw_multi_aff intersect_params(isl::set set) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean involves_nan() const;
-  inline isl::boolean is_equal(const isl::pw_multi_aff &pma2) const;
-  static inline isl::pw_multi_aff multi_val_on_domain(isl::set domain, isl::multi_val mv);
+  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);
+  inline pw_multi_aff intersect_domain(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_nan() const;
+  inline boolean is_equal(const pw_multi_aff &pma2) const;
+  static inline pw_multi_aff multi_val_on_domain(set domain, multi_val mv);
   inline int n_piece() const;
-  inline isl::pw_multi_aff neg() const;
-  inline isl::boolean plain_is_equal(const isl::pw_multi_aff &pma2) const;
-  inline isl::pw_multi_aff product(isl::pw_multi_aff pma2) const;
-  inline isl::pw_multi_aff project_domain_on_params() const;
-  static inline isl::pw_multi_aff project_out_map(isl::space space, isl::dim type, unsigned int first, unsigned int n);
-  inline isl::pw_multi_aff pullback(isl::multi_aff ma) const;
-  inline isl::pw_multi_aff pullback(isl::pw_multi_aff pma2) const;
-  static inline isl::pw_multi_aff range_map(isl::space space);
-  inline isl::pw_multi_aff range_product(isl::pw_multi_aff pma2) const;
-  inline isl::pw_multi_aff reset_tuple_id(isl::dim type) const;
-  inline isl::pw_multi_aff reset_user() const;
-  inline isl::pw_multi_aff scale_down_val(isl::val v) const;
-  inline isl::pw_multi_aff scale_multi_val(isl::multi_val mv) const;
-  inline isl::pw_multi_aff scale_val(isl::val v) const;
-  inline isl::pw_multi_aff set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::pw_multi_aff set_pw_aff(unsigned int pos, isl::pw_aff pa) const;
-  inline isl::pw_multi_aff set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::pw_multi_aff sub(isl::pw_multi_aff pma2) const;
-  inline isl::pw_multi_aff subtract_domain(isl::set set) const;
-  inline isl::pw_multi_aff union_add(isl::pw_multi_aff pma2) const;
-  inline isl::pw_multi_aff union_lexmax(isl::pw_multi_aff pma2) const;
-  inline isl::pw_multi_aff union_lexmin(isl::pw_multi_aff pma2) const;
-  static inline isl::pw_multi_aff zero(isl::space space);
+  inline pw_multi_aff neg() const;
+  inline boolean plain_is_equal(const 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;
+  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_down_val(val v) const;
+  inline pw_multi_aff scale_multi_val(multi_val mv) const;
+  inline pw_multi_aff scale_val(val v) 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 isl::pw_multi_aff_list manage(__isl_take isl_pw_multi_aff_list *ptr);
-inline isl::pw_multi_aff_list manage_copy(__isl_keep isl_pw_multi_aff_list *ptr);
+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 isl::pw_multi_aff_list manage(__isl_take isl_pw_multi_aff_list *ptr);
-  friend inline isl::pw_multi_aff_list manage_copy(__isl_keep isl_pw_multi_aff_list *ptr);
+  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;
 
@@ -2191,9 +2191,9 @@
 
 public:
   inline /* implicit */ pw_multi_aff_list();
-  inline /* implicit */ pw_multi_aff_list(const isl::pw_multi_aff_list &obj);
+  inline /* implicit */ pw_multi_aff_list(const pw_multi_aff_list &obj);
   inline /* implicit */ pw_multi_aff_list(std::nullptr_t);
-  inline isl::pw_multi_aff_list &operator=(isl::pw_multi_aff_list obj);
+  inline pw_multi_aff_list &operator=(pw_multi_aff_list obj);
   inline ~pw_multi_aff_list();
   inline __isl_give isl_pw_multi_aff_list *copy() const &;
   inline __isl_give isl_pw_multi_aff_list *copy() && = delete;
@@ -2201,32 +2201,32 @@
   inline __isl_give isl_pw_multi_aff_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::pw_multi_aff_list add(isl::pw_multi_aff el) const;
-  static inline isl::pw_multi_aff_list alloc(isl::ctx ctx, int n);
-  inline isl::pw_multi_aff_list concat(isl::pw_multi_aff_list list2) const;
-  inline isl::pw_multi_aff_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::pw_multi_aff)> &fn) const;
-  static inline isl::pw_multi_aff_list from_pw_multi_aff(isl::pw_multi_aff el);
-  inline isl::pw_multi_aff get_at(int index) const;
-  inline isl::pw_multi_aff get_pw_multi_aff(int index) const;
-  inline isl::pw_multi_aff_list insert(unsigned int pos, isl::pw_multi_aff el) 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 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 int n_pw_multi_aff() const;
-  inline isl::pw_multi_aff_list reverse() const;
-  inline isl::pw_multi_aff_list set_pw_multi_aff(int index, isl::pw_multi_aff el) 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 int size() const;
-  inline isl::pw_multi_aff_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline pw_multi_aff_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::pw_qpolynomial
-inline isl::pw_qpolynomial manage(__isl_take isl_pw_qpolynomial *ptr);
-inline isl::pw_qpolynomial manage_copy(__isl_keep isl_pw_qpolynomial *ptr);
+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 isl::pw_qpolynomial manage(__isl_take isl_pw_qpolynomial *ptr);
-  friend inline isl::pw_qpolynomial manage_copy(__isl_keep isl_pw_qpolynomial *ptr);
+  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;
 
@@ -2234,10 +2234,10 @@
 
 public:
   inline /* implicit */ pw_qpolynomial();
-  inline /* implicit */ pw_qpolynomial(const isl::pw_qpolynomial &obj);
+  inline /* implicit */ pw_qpolynomial(const pw_qpolynomial &obj);
   inline /* implicit */ pw_qpolynomial(std::nullptr_t);
-  inline explicit pw_qpolynomial(isl::ctx ctx, const std::string &str);
-  inline isl::pw_qpolynomial &operator=(isl::pw_qpolynomial obj);
+  inline explicit pw_qpolynomial(ctx ctx, const std::string &str);
+  inline pw_qpolynomial &operator=(pw_qpolynomial obj);
   inline ~pw_qpolynomial();
   inline __isl_give isl_pw_qpolynomial *copy() const &;
   inline __isl_give isl_pw_qpolynomial *copy() && = delete;
@@ -2245,64 +2245,64 @@
   inline __isl_give isl_pw_qpolynomial *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::pw_qpolynomial add(isl::pw_qpolynomial pwqp2) const;
-  inline isl::pw_qpolynomial add_dims(isl::dim type, unsigned int n) const;
-  static inline isl::pw_qpolynomial alloc(isl::set set, isl::qpolynomial qp);
-  inline isl::pw_qpolynomial coalesce() 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 pw_qpolynomial coalesce() const;
   inline unsigned int dim(isl::dim type) const;
-  inline isl::set domain() const;
-  inline isl::pw_qpolynomial drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::pw_qpolynomial drop_unused_params() const;
-  inline isl::val eval(isl::point pnt) 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 isl::pw_qpolynomial fix_val(isl::dim type, unsigned int n, isl::val v) const;
-  inline isl::stat foreach_piece(const std::function<isl::stat(isl::set, isl::qpolynomial)> &fn) const;
-  static inline isl::pw_qpolynomial from_pw_aff(isl::pw_aff pwaff);
-  static inline isl::pw_qpolynomial from_qpolynomial(isl::qpolynomial qp);
-  inline isl::pw_qpolynomial from_range() const;
-  inline isl::space get_domain_space() const;
-  inline isl::space get_space() const;
-  inline isl::pw_qpolynomial gist(isl::set context) const;
-  inline isl::pw_qpolynomial gist_params(isl::set context) const;
-  inline isl::boolean has_equal_space(const isl::pw_qpolynomial &pwqp2) const;
-  inline isl::pw_qpolynomial insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::pw_qpolynomial intersect_domain(isl::set set) const;
-  inline isl::pw_qpolynomial intersect_params(isl::set set) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean involves_nan() const;
-  inline isl::boolean is_zero() const;
-  inline isl::val max() const;
-  inline isl::val min() const;
-  inline isl::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 isl::pw_qpolynomial mul(isl::pw_qpolynomial pwqp2) 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_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 is_zero() 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 int n_piece() const;
-  inline isl::pw_qpolynomial neg() const;
-  inline isl::boolean plain_is_equal(const isl::pw_qpolynomial &pwqp2) const;
-  inline isl::pw_qpolynomial pow(unsigned int exponent) const;
-  inline isl::pw_qpolynomial project_domain_on_params() const;
-  inline isl::pw_qpolynomial reset_domain_space(isl::space dim) const;
-  inline isl::pw_qpolynomial reset_user() const;
-  inline isl::pw_qpolynomial scale_down_val(isl::val v) const;
-  inline isl::pw_qpolynomial scale_val(isl::val v) const;
-  inline isl::pw_qpolynomial split_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::pw_qpolynomial split_periods(int max_periods) const;
-  inline isl::pw_qpolynomial sub(isl::pw_qpolynomial pwqp2) const;
-  inline isl::pw_qpolynomial subtract_domain(isl::set set) const;
-  inline isl::pw_qpolynomial to_polynomial(int sign) const;
-  static inline isl::pw_qpolynomial zero(isl::space dim);
+  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 dim) 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 dim);
 };
 
 // declarations for isl::pw_qpolynomial_fold_list
-inline isl::pw_qpolynomial_fold_list manage(__isl_take isl_pw_qpolynomial_fold_list *ptr);
-inline isl::pw_qpolynomial_fold_list manage_copy(__isl_keep isl_pw_qpolynomial_fold_list *ptr);
+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 isl::pw_qpolynomial_fold_list manage(__isl_take isl_pw_qpolynomial_fold_list *ptr);
-  friend inline isl::pw_qpolynomial_fold_list manage_copy(__isl_keep isl_pw_qpolynomial_fold_list *ptr);
+  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;
 
@@ -2310,9 +2310,9 @@
 
 public:
   inline /* implicit */ pw_qpolynomial_fold_list();
-  inline /* implicit */ pw_qpolynomial_fold_list(const isl::pw_qpolynomial_fold_list &obj);
+  inline /* implicit */ pw_qpolynomial_fold_list(const pw_qpolynomial_fold_list &obj);
   inline /* implicit */ pw_qpolynomial_fold_list(std::nullptr_t);
-  inline isl::pw_qpolynomial_fold_list &operator=(isl::pw_qpolynomial_fold_list obj);
+  inline pw_qpolynomial_fold_list &operator=(pw_qpolynomial_fold_list obj);
   inline ~pw_qpolynomial_fold_list();
   inline __isl_give isl_pw_qpolynomial_fold_list *copy() const &;
   inline __isl_give isl_pw_qpolynomial_fold_list *copy() && = delete;
@@ -2320,18 +2320,18 @@
   inline __isl_give isl_pw_qpolynomial_fold_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
 };
 
 // declarations for isl::pw_qpolynomial_list
-inline isl::pw_qpolynomial_list manage(__isl_take isl_pw_qpolynomial_list *ptr);
-inline isl::pw_qpolynomial_list manage_copy(__isl_keep isl_pw_qpolynomial_list *ptr);
+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 isl::pw_qpolynomial_list manage(__isl_take isl_pw_qpolynomial_list *ptr);
-  friend inline isl::pw_qpolynomial_list manage_copy(__isl_keep isl_pw_qpolynomial_list *ptr);
+  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;
 
@@ -2339,9 +2339,9 @@
 
 public:
   inline /* implicit */ pw_qpolynomial_list();
-  inline /* implicit */ pw_qpolynomial_list(const isl::pw_qpolynomial_list &obj);
+  inline /* implicit */ pw_qpolynomial_list(const pw_qpolynomial_list &obj);
   inline /* implicit */ pw_qpolynomial_list(std::nullptr_t);
-  inline isl::pw_qpolynomial_list &operator=(isl::pw_qpolynomial_list obj);
+  inline pw_qpolynomial_list &operator=(pw_qpolynomial_list obj);
   inline ~pw_qpolynomial_list();
   inline __isl_give isl_pw_qpolynomial_list *copy() const &;
   inline __isl_give isl_pw_qpolynomial_list *copy() && = delete;
@@ -2349,32 +2349,32 @@
   inline __isl_give isl_pw_qpolynomial_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::pw_qpolynomial_list add(isl::pw_qpolynomial el) const;
-  static inline isl::pw_qpolynomial_list alloc(isl::ctx ctx, int n);
-  inline isl::pw_qpolynomial_list concat(isl::pw_qpolynomial_list list2) const;
-  inline isl::pw_qpolynomial_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::pw_qpolynomial)> &fn) const;
-  static inline isl::pw_qpolynomial_list from_pw_qpolynomial(isl::pw_qpolynomial el);
-  inline isl::pw_qpolynomial get_at(int index) const;
-  inline isl::pw_qpolynomial get_pw_qpolynomial(int index) const;
-  inline isl::pw_qpolynomial_list insert(unsigned int pos, isl::pw_qpolynomial el) const;
+  inline pw_qpolynomial_list add(pw_qpolynomial el) const;
+  static inline pw_qpolynomial_list alloc(ctx ctx, int n);
+  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 int n_pw_qpolynomial() const;
-  inline isl::pw_qpolynomial_list reverse() const;
-  inline isl::pw_qpolynomial_list set_pw_qpolynomial(int index, isl::pw_qpolynomial el) const;
+  inline pw_qpolynomial_list reverse() const;
+  inline pw_qpolynomial_list set_pw_qpolynomial(int index, pw_qpolynomial el) const;
   inline int size() const;
-  inline isl::pw_qpolynomial_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline pw_qpolynomial_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::qpolynomial
-inline isl::qpolynomial manage(__isl_take isl_qpolynomial *ptr);
-inline isl::qpolynomial manage_copy(__isl_keep isl_qpolynomial *ptr);
+inline qpolynomial manage(__isl_take isl_qpolynomial *ptr);
+inline qpolynomial manage_copy(__isl_keep isl_qpolynomial *ptr);
 
 class qpolynomial {
-  friend inline isl::qpolynomial manage(__isl_take isl_qpolynomial *ptr);
-  friend inline isl::qpolynomial manage_copy(__isl_keep isl_qpolynomial *ptr);
+  friend inline qpolynomial manage(__isl_take isl_qpolynomial *ptr);
+  friend inline qpolynomial manage_copy(__isl_keep isl_qpolynomial *ptr);
 
   isl_qpolynomial *ptr = nullptr;
 
@@ -2382,9 +2382,9 @@
 
 public:
   inline /* implicit */ qpolynomial();
-  inline /* implicit */ qpolynomial(const isl::qpolynomial &obj);
+  inline /* implicit */ qpolynomial(const qpolynomial &obj);
   inline /* implicit */ qpolynomial(std::nullptr_t);
-  inline isl::qpolynomial &operator=(isl::qpolynomial obj);
+  inline qpolynomial &operator=(qpolynomial obj);
   inline ~qpolynomial();
   inline __isl_give isl_qpolynomial *copy() const &;
   inline __isl_give isl_qpolynomial *copy() && = delete;
@@ -2392,58 +2392,58 @@
   inline __isl_give isl_qpolynomial *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::qpolynomial add(isl::qpolynomial qp2) const;
-  inline isl::qpolynomial add_dims(isl::dim type, unsigned int n) const;
-  inline isl::qpolynomial align_params(isl::space model) const;
-  inline isl::stat as_polynomial_on_domain(const isl::basic_set &bset, const std::function<isl::stat(isl::basic_set, isl::qpolynomial)> &fn) 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 unsigned int dim(isl::dim type) const;
-  inline isl::qpolynomial drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::val eval(isl::point pnt) const;
-  inline isl::stat foreach_term(const std::function<isl::stat(isl::term)> &fn) const;
-  static inline isl::qpolynomial from_aff(isl::aff aff);
-  static inline isl::qpolynomial from_constraint(isl::constraint c, isl::dim type, unsigned int pos);
-  static inline isl::qpolynomial from_term(isl::term term);
-  inline isl::val get_constant_val() const;
-  inline isl::space get_domain_space() const;
-  inline isl::space get_space() const;
-  inline isl::qpolynomial gist(isl::set context) const;
-  inline isl::qpolynomial gist_params(isl::set context) const;
-  inline isl::qpolynomial homogenize() const;
-  static inline isl::qpolynomial infty_on_domain(isl::space dim);
-  inline isl::qpolynomial insert_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean is_infty() const;
-  inline isl::boolean is_nan() const;
-  inline isl::boolean is_neginfty() const;
-  inline isl::boolean is_zero() const;
-  inline isl::qpolynomial move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
-  inline isl::qpolynomial mul(isl::qpolynomial qp2) const;
-  static inline isl::qpolynomial nan_on_domain(isl::space dim);
-  inline isl::qpolynomial neg() const;
-  static inline isl::qpolynomial neginfty_on_domain(isl::space dim);
-  static inline isl::qpolynomial one_on_domain(isl::space dim);
-  inline isl::boolean plain_is_equal(const isl::qpolynomial &qp2) const;
-  inline isl::qpolynomial pow(unsigned int power) const;
-  inline isl::qpolynomial project_domain_on_params() const;
-  inline isl::qpolynomial scale_down_val(isl::val v) const;
-  inline isl::qpolynomial scale_val(isl::val v) 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 dim);
+  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 dim);
+  inline qpolynomial neg() const;
+  static inline qpolynomial neginfty_on_domain(space dim);
+  static inline qpolynomial one_on_domain(space dim);
+  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 isl::qpolynomial sub(isl::qpolynomial qp2) const;
-  static inline isl::qpolynomial val_on_domain(isl::space space, isl::val val);
-  static inline isl::qpolynomial var_on_domain(isl::space dim, isl::dim type, unsigned int pos);
-  static inline isl::qpolynomial zero_on_domain(isl::space dim);
+  inline qpolynomial sub(qpolynomial qp2) const;
+  static inline qpolynomial val_on_domain(space space, val val);
+  static inline qpolynomial var_on_domain(space dim, isl::dim type, unsigned int pos);
+  static inline qpolynomial zero_on_domain(space dim);
 };
 
 // declarations for isl::schedule
-inline isl::schedule manage(__isl_take isl_schedule *ptr);
-inline isl::schedule manage_copy(__isl_keep isl_schedule *ptr);
+inline schedule manage(__isl_take isl_schedule *ptr);
+inline schedule manage_copy(__isl_keep isl_schedule *ptr);
 
 class schedule {
-  friend inline isl::schedule manage(__isl_take isl_schedule *ptr);
-  friend inline isl::schedule manage_copy(__isl_keep isl_schedule *ptr);
+  friend inline schedule manage(__isl_take isl_schedule *ptr);
+  friend inline schedule manage_copy(__isl_keep isl_schedule *ptr);
 
   isl_schedule *ptr = nullptr;
 
@@ -2451,10 +2451,10 @@
 
 public:
   inline /* implicit */ schedule();
-  inline /* implicit */ schedule(const isl::schedule &obj);
+  inline /* implicit */ schedule(const schedule &obj);
   inline /* implicit */ schedule(std::nullptr_t);
-  inline explicit schedule(isl::ctx ctx, const std::string &str);
-  inline isl::schedule &operator=(isl::schedule obj);
+  inline explicit schedule(ctx ctx, const std::string &str);
+  inline schedule &operator=(schedule obj);
   inline ~schedule();
   inline __isl_give isl_schedule *copy() const &;
   inline __isl_give isl_schedule *copy() && = delete;
@@ -2462,34 +2462,34 @@
   inline __isl_give isl_schedule *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::schedule align_params(isl::space space) const;
-  static inline isl::schedule empty(isl::space space);
-  static inline isl::schedule from_domain(isl::union_set domain);
-  inline isl::union_set get_domain() const;
-  inline isl::union_map get_map() const;
-  inline isl::schedule_node get_root() const;
-  inline isl::schedule gist_domain_params(isl::set context) const;
-  inline isl::schedule insert_context(isl::set context) const;
-  inline isl::schedule insert_guard(isl::set guard) const;
-  inline isl::schedule insert_partial_schedule(isl::multi_union_pw_aff partial) const;
-  inline isl::schedule intersect_domain(isl::union_set domain) const;
-  inline isl::boolean plain_is_equal(const isl::schedule &schedule2) const;
-  inline isl::schedule pullback(isl::union_pw_multi_aff upma) const;
-  inline isl::schedule reset_user() const;
-  inline isl::schedule sequence(isl::schedule schedule2) 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 isl::schedule_constraints manage(__isl_take isl_schedule_constraints *ptr);
-inline isl::schedule_constraints manage_copy(__isl_keep isl_schedule_constraints *ptr);
+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 isl::schedule_constraints manage(__isl_take isl_schedule_constraints *ptr);
-  friend inline isl::schedule_constraints manage_copy(__isl_keep isl_schedule_constraints *ptr);
+  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;
 
@@ -2497,10 +2497,10 @@
 
 public:
   inline /* implicit */ schedule_constraints();
-  inline /* implicit */ schedule_constraints(const isl::schedule_constraints &obj);
+  inline /* implicit */ schedule_constraints(const schedule_constraints &obj);
   inline /* implicit */ schedule_constraints(std::nullptr_t);
-  inline explicit schedule_constraints(isl::ctx ctx, const std::string &str);
-  inline isl::schedule_constraints &operator=(isl::schedule_constraints obj);
+  inline explicit schedule_constraints(ctx ctx, const std::string &str);
+  inline schedule_constraints &operator=(schedule_constraints obj);
   inline ~schedule_constraints();
   inline __isl_give isl_schedule_constraints *copy() const &;
   inline __isl_give isl_schedule_constraints *copy() && = delete;
@@ -2508,34 +2508,34 @@
   inline __isl_give isl_schedule_constraints *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::schedule_constraints apply(isl::union_map umap) const;
-  inline isl::schedule compute_schedule() const;
-  inline isl::union_map get_coincidence() const;
-  inline isl::union_map get_conditional_validity() const;
-  inline isl::union_map get_conditional_validity_condition() const;
-  inline isl::set get_context() const;
-  inline isl::union_set get_domain() const;
-  inline isl::union_map get_proximity() const;
-  inline isl::union_map get_validity() const;
-  static inline isl::schedule_constraints on_domain(isl::union_set domain);
-  inline isl::schedule_constraints set_coincidence(isl::union_map coincidence) const;
-  inline isl::schedule_constraints set_conditional_validity(isl::union_map condition, isl::union_map validity) const;
-  inline isl::schedule_constraints set_context(isl::set context) const;
-  inline isl::schedule_constraints set_proximity(isl::union_map proximity) const;
-  inline isl::schedule_constraints set_validity(isl::union_map validity) 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 isl::schedule_node manage(__isl_take isl_schedule_node *ptr);
-inline isl::schedule_node manage_copy(__isl_keep isl_schedule_node *ptr);
+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 isl::schedule_node manage(__isl_take isl_schedule_node *ptr);
-  friend inline isl::schedule_node manage_copy(__isl_keep isl_schedule_node *ptr);
+  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;
 
@@ -2543,9 +2543,9 @@
 
 public:
   inline /* implicit */ schedule_node();
-  inline /* implicit */ schedule_node(const isl::schedule_node &obj);
+  inline /* implicit */ schedule_node(const schedule_node &obj);
   inline /* implicit */ schedule_node(std::nullptr_t);
-  inline isl::schedule_node &operator=(isl::schedule_node obj);
+  inline schedule_node &operator=(schedule_node obj);
   inline ~schedule_node();
   inline __isl_give isl_schedule_node *copy() const &;
   inline __isl_give isl_schedule_node *copy() && = delete;
@@ -2553,79 +2553,79 @@
   inline __isl_give isl_schedule_node *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::schedule_node align_params(isl::space space) const;
-  inline isl::schedule_node ancestor(int generation) const;
-  inline isl::boolean band_member_get_coincident(int pos) const;
-  inline isl::schedule_node band_member_set_coincident(int pos, int coincident) const;
-  inline isl::schedule_node band_set_ast_build_options(isl::union_set options) const;
-  inline isl::schedule_node child(int pos) const;
-  inline isl::set context_get_context() const;
-  inline isl::schedule_node cut() const;
-  inline isl::union_set domain_get_domain() const;
-  inline isl::union_pw_multi_aff expansion_get_contraction() const;
-  inline isl::union_map expansion_get_expansion() const;
-  inline isl::union_map extension_get_extension() const;
-  inline isl::union_set filter_get_filter() const;
-  inline isl::schedule_node first_child() const;
-  inline isl::stat foreach_ancestor_top_down(const std::function<isl::stat(isl::schedule_node)> &fn) const;
-  static inline isl::schedule_node from_domain(isl::union_set domain);
-  static inline isl::schedule_node from_extension(isl::union_map extension);
-  inline int get_ancestor_child_position(const isl::schedule_node &ancestor) const;
-  inline isl::schedule_node get_child(int pos) 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 int get_ancestor_child_position(const schedule_node &ancestor) const;
+  inline schedule_node get_child(int pos) const;
   inline int get_child_position() const;
-  inline isl::union_set get_domain() const;
-  inline isl::multi_union_pw_aff get_prefix_schedule_multi_union_pw_aff() const;
-  inline isl::union_map get_prefix_schedule_relation() const;
-  inline isl::union_map get_prefix_schedule_union_map() const;
-  inline isl::union_pw_multi_aff get_prefix_schedule_union_pw_multi_aff() const;
-  inline isl::schedule get_schedule() 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 int get_schedule_depth() const;
-  inline isl::schedule_node get_shared_ancestor(const isl::schedule_node &node2) const;
-  inline isl::union_pw_multi_aff get_subtree_contraction() const;
-  inline isl::union_map get_subtree_expansion() const;
-  inline isl::union_map get_subtree_schedule_union_map() 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 int get_tree_depth() const;
-  inline isl::union_set get_universe_domain() const;
-  inline isl::schedule_node graft_after(isl::schedule_node graft) const;
-  inline isl::schedule_node graft_before(isl::schedule_node graft) const;
-  inline isl::schedule_node group(isl::id group_id) const;
-  inline isl::set guard_get_guard() const;
-  inline isl::boolean has_children() const;
-  inline isl::boolean has_next_sibling() const;
-  inline isl::boolean has_parent() const;
-  inline isl::boolean has_previous_sibling() const;
-  inline isl::schedule_node insert_context(isl::set context) const;
-  inline isl::schedule_node insert_filter(isl::union_set filter) const;
-  inline isl::schedule_node insert_guard(isl::set context) const;
-  inline isl::schedule_node insert_mark(isl::id mark) const;
-  inline isl::schedule_node insert_partial_schedule(isl::multi_union_pw_aff schedule) const;
-  inline isl::schedule_node insert_sequence(isl::union_set_list filters) const;
-  inline isl::schedule_node insert_set(isl::union_set_list filters) const;
-  inline isl::boolean is_equal(const isl::schedule_node &node2) const;
-  inline isl::boolean is_subtree_anchored() const;
-  inline isl::id mark_get_id() 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 int n_children() const;
-  inline isl::schedule_node next_sibling() const;
-  inline isl::schedule_node order_after(isl::union_set filter) const;
-  inline isl::schedule_node order_before(isl::union_set filter) const;
-  inline isl::schedule_node parent() const;
-  inline isl::schedule_node previous_sibling() const;
-  inline isl::schedule_node reset_user() const;
-  inline isl::schedule_node root() const;
-  inline isl::schedule_node sequence_splice_child(int pos) 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 isl::set manage(__isl_take isl_set *ptr);
-inline isl::set manage_copy(__isl_keep isl_set *ptr);
+inline set manage(__isl_take isl_set *ptr);
+inline set manage_copy(__isl_keep isl_set *ptr);
 
 class set {
-  friend inline isl::set manage(__isl_take isl_set *ptr);
-  friend inline isl::set manage_copy(__isl_keep isl_set *ptr);
+  friend inline set manage(__isl_take isl_set *ptr);
+  friend inline set manage_copy(__isl_keep isl_set *ptr);
 
   isl_set *ptr = nullptr;
 
@@ -2633,13 +2633,13 @@
 
 public:
   inline /* implicit */ set();
-  inline /* implicit */ set(const isl::set &obj);
+  inline /* implicit */ set(const set &obj);
   inline /* implicit */ set(std::nullptr_t);
-  inline explicit set(isl::ctx ctx, const std::string &str);
-  inline /* implicit */ set(isl::basic_set bset);
-  inline /* implicit */ set(isl::point pnt);
-  inline explicit set(isl::union_set uset);
-  inline isl::set &operator=(isl::set obj);
+  inline explicit set(ctx ctx, const std::string &str);
+  inline /* implicit */ set(basic_set bset);
+  inline /* implicit */ set(point pnt);
+  inline explicit set(union_set uset);
+  inline set &operator=(set obj);
   inline ~set();
   inline __isl_give isl_set *copy() const &;
   inline __isl_give isl_set *copy() && = delete;
@@ -2647,151 +2647,151 @@
   inline __isl_give isl_set *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::set add_constraint(isl::constraint constraint) const;
-  inline isl::set add_dims(isl::dim type, unsigned int n) const;
-  inline isl::basic_set affine_hull() const;
-  inline isl::set align_params(isl::space model) const;
-  inline isl::set apply(isl::map map) const;
-  inline isl::basic_set bounded_simple_hull() const;
-  static inline isl::set box_from_points(isl::point pnt1, isl::point pnt2);
-  inline isl::set coalesce() const;
-  inline isl::basic_set coefficients() const;
-  inline isl::set complement() const;
-  inline isl::basic_set convex_hull() const;
-  inline isl::val count_val() const;
-  inline isl::set detect_equalities() 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 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 unsigned int dim(isl::dim type) const;
-  inline isl::boolean dim_has_any_lower_bound(isl::dim type, unsigned int pos) const;
-  inline isl::boolean dim_has_any_upper_bound(isl::dim type, unsigned int pos) const;
-  inline isl::boolean dim_has_lower_bound(isl::dim type, unsigned int pos) const;
-  inline isl::boolean dim_has_upper_bound(isl::dim type, unsigned int pos) const;
-  inline isl::boolean dim_is_bounded(isl::dim type, unsigned int pos) const;
-  inline isl::pw_aff dim_max(int pos) const;
-  inline isl::pw_aff dim_min(int pos) const;
-  inline isl::set drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::set drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::set drop_unused_params() const;
-  inline isl::set eliminate(isl::dim type, unsigned int first, unsigned int n) const;
-  static inline isl::set empty(isl::space space);
-  inline isl::set equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const;
-  inline int find_dim_by_id(isl::dim type, const isl::id &id) 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 pw_aff dim_min(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 isl::set fix_si(isl::dim type, unsigned int pos, int value) const;
-  inline isl::set fix_val(isl::dim type, unsigned int pos, isl::val v) const;
-  inline isl::set flat_product(isl::set set2) const;
-  inline isl::set flatten() const;
-  inline isl::map flatten_map() const;
-  inline int follows_at(const isl::set &set2, int pos) const;
-  inline isl::stat foreach_basic_set(const std::function<isl::stat(isl::basic_set)> &fn) const;
-  inline isl::stat foreach_point(const std::function<isl::stat(isl::point)> &fn) const;
-  static inline isl::set from_multi_aff(isl::multi_aff ma);
-  static inline isl::set from_multi_pw_aff(isl::multi_pw_aff mpa);
-  inline isl::set from_params() const;
-  static inline isl::set from_pw_aff(isl::pw_aff pwaff);
-  static inline isl::set from_pw_multi_aff(isl::pw_multi_aff pma);
-  inline isl::basic_set_list get_basic_set_list() const;
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) 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 isl::space get_space() const;
-  inline isl::val get_stride(int pos) const;
-  inline isl::id get_tuple_id() 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 isl::set gist(isl::set context) const;
-  inline isl::set gist_basic_set(isl::basic_set context) const;
-  inline isl::set gist_params(isl::set context) const;
-  inline isl::boolean has_dim_id(isl::dim type, unsigned int pos) const;
-  inline isl::boolean has_dim_name(isl::dim type, unsigned int pos) const;
-  inline isl::boolean has_equal_space(const isl::set &set2) const;
-  inline isl::boolean has_tuple_id() const;
-  inline isl::boolean has_tuple_name() const;
-  inline isl::map identity() const;
-  inline isl::pw_aff indicator_function() const;
-  inline isl::set insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
-  inline isl::set intersect(isl::set set2) const;
-  inline isl::set intersect_params(isl::set params) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean is_bounded() const;
-  inline isl::boolean is_box() const;
-  inline isl::boolean is_disjoint(const isl::set &set2) const;
-  inline isl::boolean is_empty() const;
-  inline isl::boolean is_equal(const isl::set &set2) const;
-  inline isl::boolean is_params() const;
-  inline isl::boolean is_singleton() const;
-  inline isl::boolean is_strict_subset(const isl::set &set2) const;
-  inline isl::boolean is_subset(const isl::set &set2) const;
-  inline isl::boolean is_wrapping() const;
-  inline isl::map lex_ge_set(isl::set set2) const;
-  inline isl::map lex_gt_set(isl::set set2) const;
-  inline isl::map lex_le_set(isl::set set2) const;
-  inline isl::map lex_lt_set(isl::set set2) const;
-  inline isl::set lexmax() const;
-  inline isl::pw_multi_aff lexmax_pw_multi_aff() const;
-  inline isl::set lexmin() const;
-  inline isl::pw_multi_aff lexmin_pw_multi_aff() const;
-  inline isl::set lower_bound_si(isl::dim type, unsigned int pos, int value) const;
-  inline isl::set lower_bound_val(isl::dim type, unsigned int pos, isl::val value) const;
-  inline isl::val max_val(const isl::aff &obj) const;
-  inline isl::val min_val(const isl::aff &obj) const;
-  inline isl::set move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) 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 set intersect(set set2) const;
+  inline set intersect_params(set params) const;
+  inline boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) 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_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 val max_val(const aff &obj) 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 int n_basic_set() const;
   inline unsigned int n_dim() const;
-  static inline isl::set nat_universe(isl::space dim);
-  inline isl::set neg() const;
-  inline isl::set params() const;
-  inline int plain_cmp(const isl::set &set2) const;
-  inline isl::val plain_get_val_if_fixed(isl::dim type, unsigned int pos) const;
-  inline isl::boolean plain_is_disjoint(const isl::set &set2) const;
-  inline isl::boolean plain_is_empty() const;
-  inline isl::boolean plain_is_equal(const isl::set &set2) const;
-  inline isl::boolean plain_is_universe() const;
-  inline isl::basic_set plain_unshifted_simple_hull() const;
-  inline isl::basic_set polyhedral_hull() const;
-  inline isl::set preimage_multi_aff(isl::multi_aff ma) const;
-  inline isl::set preimage_multi_pw_aff(isl::multi_pw_aff mpa) const;
-  inline isl::set preimage_pw_multi_aff(isl::pw_multi_aff pma) const;
-  inline isl::set product(isl::set set2) const;
-  inline isl::map project_onto_map(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::set project_out(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::set remove_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::set remove_divs() const;
-  inline isl::set remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::set remove_redundancies() const;
-  inline isl::set remove_unknown_divs() const;
-  inline isl::set reset_space(isl::space dim) const;
-  inline isl::set reset_tuple_id() const;
-  inline isl::set reset_user() const;
-  inline isl::basic_set sample() const;
-  inline isl::point sample_point() const;
-  inline isl::set set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::set set_tuple_id(isl::id id) const;
-  inline isl::set set_tuple_name(const std::string &s) const;
-  inline isl::basic_set simple_hull() const;
+  static inline set nat_universe(space dim);
+  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(multi_aff ma) const;
+  inline set preimage_multi_pw_aff(multi_pw_aff mpa) const;
+  inline set preimage_pw_multi_aff(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 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 dim) 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 isl::basic_set solutions() const;
-  inline isl::set split_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::set subtract(isl::set set2) const;
-  inline isl::set sum(isl::set set2) const;
-  inline isl::set unite(isl::set set2) const;
-  static inline isl::set universe(isl::space space);
-  inline isl::basic_set unshifted_simple_hull() const;
-  inline isl::basic_set unshifted_simple_hull_from_set_list(isl::set_list list) const;
-  inline isl::map unwrap() const;
-  inline isl::set upper_bound_si(isl::dim type, unsigned int pos, int value) const;
-  inline isl::set upper_bound_val(isl::dim type, unsigned int pos, isl::val value) const;
-  inline isl::map wrapped_domain_map() 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 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_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 isl::set_list manage(__isl_take isl_set_list *ptr);
-inline isl::set_list manage_copy(__isl_keep isl_set_list *ptr);
+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 isl::set_list manage(__isl_take isl_set_list *ptr);
-  friend inline isl::set_list manage_copy(__isl_keep isl_set_list *ptr);
+  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;
 
@@ -2799,9 +2799,9 @@
 
 public:
   inline /* implicit */ set_list();
-  inline /* implicit */ set_list(const isl::set_list &obj);
+  inline /* implicit */ set_list(const set_list &obj);
   inline /* implicit */ set_list(std::nullptr_t);
-  inline isl::set_list &operator=(isl::set_list obj);
+  inline set_list &operator=(set_list obj);
   inline ~set_list();
   inline __isl_give isl_set_list *copy() const &;
   inline __isl_give isl_set_list *copy() && = delete;
@@ -2809,33 +2809,33 @@
   inline __isl_give isl_set_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::set_list add(isl::set el) const;
-  static inline isl::set_list alloc(isl::ctx ctx, int n);
-  inline isl::set_list concat(isl::set_list list2) const;
-  inline isl::set_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::set)> &fn) const;
-  static inline isl::set_list from_set(isl::set el);
-  inline isl::set get_at(int index) const;
-  inline isl::set get_set(int index) const;
-  inline isl::set_list insert(unsigned int pos, isl::set el) const;
+  inline set_list add(set el) const;
+  static inline set_list alloc(ctx ctx, int n);
+  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 int n_set() const;
-  inline isl::set_list reverse() const;
-  inline isl::set_list set_set(int index, isl::set el) const;
+  inline set_list reverse() const;
+  inline set_list set_set(int index, set el) const;
   inline int size() const;
-  inline isl::set_list swap(unsigned int pos1, unsigned int pos2) const;
-  inline isl::set unite() const;
+  inline set_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline set unite() const;
 };
 
 // declarations for isl::space
-inline isl::space manage(__isl_take isl_space *ptr);
-inline isl::space manage_copy(__isl_keep isl_space *ptr);
+inline space manage(__isl_take isl_space *ptr);
+inline space manage_copy(__isl_keep isl_space *ptr);
 
 class space {
-  friend inline isl::space manage(__isl_take isl_space *ptr);
-  friend inline isl::space manage_copy(__isl_keep isl_space *ptr);
+  friend inline space manage(__isl_take isl_space *ptr);
+  friend inline space manage_copy(__isl_keep isl_space *ptr);
 
   isl_space *ptr = nullptr;
 
@@ -2843,11 +2843,11 @@
 
 public:
   inline /* implicit */ space();
-  inline /* implicit */ space(const isl::space &obj);
+  inline /* implicit */ space(const space &obj);
   inline /* implicit */ space(std::nullptr_t);
-  inline explicit space(isl::ctx ctx, unsigned int nparam, unsigned int n_in, unsigned int n_out);
-  inline explicit space(isl::ctx ctx, unsigned int nparam, unsigned int dim);
-  inline isl::space &operator=(isl::space obj);
+  inline explicit space(ctx ctx, unsigned int nparam, unsigned int n_in, unsigned int n_out);
+  inline explicit space(ctx ctx, unsigned int nparam, unsigned int dim);
+  inline space &operator=(space obj);
   inline ~space();
   inline __isl_give isl_space *copy() const &;
   inline __isl_give isl_space *copy() && = delete;
@@ -2855,88 +2855,88 @@
   inline __isl_give isl_space *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::space add_dims(isl::dim type, unsigned int n) const;
-  inline isl::space add_param_id(isl::id id) const;
-  inline isl::space align_params(isl::space dim2) const;
-  inline isl::boolean can_curry() const;
-  inline isl::boolean can_range_curry() const;
-  inline isl::boolean can_uncurry() const;
-  inline isl::boolean can_zip() const;
-  inline isl::space curry() const;
+  inline space add_dims(isl::dim type, unsigned int n) const;
+  inline space add_param_id(id id) const;
+  inline space align_params(space dim2) 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 unsigned int dim(isl::dim type) const;
-  inline isl::space domain() const;
-  inline isl::space domain_factor_domain() const;
-  inline isl::space domain_factor_range() const;
-  inline isl::boolean domain_is_wrapping() const;
-  inline isl::space domain_map() const;
-  inline isl::space domain_product(isl::space right) const;
-  inline isl::space drop_dims(isl::dim type, unsigned int first, unsigned int num) const;
-  inline isl::space factor_domain() const;
-  inline isl::space factor_range() const;
-  inline int find_dim_by_id(isl::dim type, const isl::id &id) 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_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 isl::space flatten_domain() const;
-  inline isl::space flatten_range() const;
-  inline isl::space from_domain() const;
-  inline isl::space from_range() const;
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) 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 isl::id get_tuple_id(isl::dim type) const;
+  inline id get_tuple_id(isl::dim type) const;
   inline std::string get_tuple_name(isl::dim type) const;
-  inline isl::boolean has_dim_id(isl::dim type, unsigned int pos) const;
-  inline isl::boolean has_dim_name(isl::dim type, unsigned int pos) const;
-  inline isl::boolean has_equal_params(const isl::space &space2) const;
-  inline isl::boolean has_equal_tuples(const isl::space &space2) const;
-  inline isl::boolean has_tuple_id(isl::dim type) const;
-  inline isl::boolean has_tuple_name(isl::dim type) const;
-  inline isl::space insert_dims(isl::dim type, unsigned int pos, unsigned int n) const;
-  inline isl::boolean is_domain(const isl::space &space2) const;
-  inline isl::boolean is_equal(const isl::space &space2) const;
-  inline isl::boolean is_map() const;
-  inline isl::boolean is_params() const;
-  inline isl::boolean is_product() const;
-  inline isl::boolean is_range(const isl::space &space2) const;
-  inline isl::boolean is_set() const;
-  inline isl::boolean is_wrapping() const;
-  inline isl::space join(isl::space right) const;
-  inline isl::space map_from_domain_and_range(isl::space range) const;
-  inline isl::space map_from_set() const;
-  inline isl::space move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const;
-  inline isl::space params() const;
-  static inline isl::space params_alloc(isl::ctx ctx, unsigned int nparam);
-  inline isl::space product(isl::space right) const;
-  inline isl::space range() const;
-  inline isl::space range_curry() const;
-  inline isl::space range_factor_domain() const;
-  inline isl::space range_factor_range() const;
-  inline isl::boolean range_is_wrapping() const;
-  inline isl::space range_map() const;
-  inline isl::space range_product(isl::space right) const;
-  inline isl::space reset_tuple_id(isl::dim type) const;
-  inline isl::space reset_user() const;
-  inline isl::space reverse() const;
-  inline isl::space set_dim_id(isl::dim type, unsigned int pos, isl::id id) const;
-  inline isl::space set_from_params() const;
-  inline isl::space set_tuple_id(isl::dim type, isl::id id) const;
-  inline isl::space set_tuple_name(isl::dim type, const std::string &s) const;
-  inline isl::boolean tuple_is_equal(isl::dim type1, const isl::space &space2, isl::dim type2) const;
-  inline isl::space uncurry() const;
-  inline isl::space unwrap() const;
-  inline isl::space wrap() const;
-  inline isl::space zip() 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 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;
+  inline space unwrap() const;
+  inline space wrap() const;
+  inline space zip() const;
 };
 
 // declarations for isl::term
-inline isl::term manage(__isl_take isl_term *ptr);
-inline isl::term manage_copy(__isl_keep isl_term *ptr);
+inline term manage(__isl_take isl_term *ptr);
+inline term manage_copy(__isl_keep isl_term *ptr);
 
 class term {
-  friend inline isl::term manage(__isl_take isl_term *ptr);
-  friend inline isl::term manage_copy(__isl_keep isl_term *ptr);
+  friend inline term manage(__isl_take isl_term *ptr);
+  friend inline term manage_copy(__isl_keep isl_term *ptr);
 
   isl_term *ptr = nullptr;
 
@@ -2944,9 +2944,9 @@
 
 public:
   inline /* implicit */ term();
-  inline /* implicit */ term(const isl::term &obj);
+  inline /* implicit */ term(const term &obj);
   inline /* implicit */ term(std::nullptr_t);
-  inline isl::term &operator=(isl::term obj);
+  inline term &operator=(term obj);
   inline ~term();
   inline __isl_give isl_term *copy() const &;
   inline __isl_give isl_term *copy() && = delete;
@@ -2954,21 +2954,21 @@
   inline __isl_give isl_term *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
 
   inline unsigned int dim(isl::dim type) const;
-  inline isl::val get_coefficient_val() const;
-  inline isl::aff get_div(unsigned int pos) const;
+  inline val get_coefficient_val() const;
+  inline aff get_div(unsigned int pos) const;
   inline int get_exp(isl::dim type, unsigned int pos) const;
 };
 
 // declarations for isl::union_access_info
-inline isl::union_access_info manage(__isl_take isl_union_access_info *ptr);
-inline isl::union_access_info manage_copy(__isl_keep isl_union_access_info *ptr);
+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 isl::union_access_info manage(__isl_take isl_union_access_info *ptr);
-  friend inline isl::union_access_info manage_copy(__isl_keep isl_union_access_info *ptr);
+  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;
 
@@ -2976,10 +2976,10 @@
 
 public:
   inline /* implicit */ union_access_info();
-  inline /* implicit */ union_access_info(const isl::union_access_info &obj);
+  inline /* implicit */ union_access_info(const union_access_info &obj);
   inline /* implicit */ union_access_info(std::nullptr_t);
-  inline explicit union_access_info(isl::union_map sink);
-  inline isl::union_access_info &operator=(isl::union_access_info obj);
+  inline explicit union_access_info(union_map sink);
+  inline union_access_info &operator=(union_access_info obj);
   inline ~union_access_info();
   inline __isl_give isl_union_access_info *copy() const &;
   inline __isl_give isl_union_access_info *copy() && = delete;
@@ -2987,24 +2987,24 @@
   inline __isl_give isl_union_access_info *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
 
-  inline isl::union_flow compute_flow() const;
-  inline isl::union_access_info set_kill(isl::union_map kill) const;
-  inline isl::union_access_info set_may_source(isl::union_map may_source) const;
-  inline isl::union_access_info set_must_source(isl::union_map must_source) const;
-  inline isl::union_access_info set_schedule(isl::schedule schedule) const;
-  inline isl::union_access_info set_schedule_map(isl::union_map schedule_map) 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 isl::union_flow manage(__isl_take isl_union_flow *ptr);
-inline isl::union_flow manage_copy(__isl_keep isl_union_flow *ptr);
+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 isl::union_flow manage(__isl_take isl_union_flow *ptr);
-  friend inline isl::union_flow manage_copy(__isl_keep isl_union_flow *ptr);
+  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;
 
@@ -3012,9 +3012,9 @@
 
 public:
   inline /* implicit */ union_flow();
-  inline /* implicit */ union_flow(const isl::union_flow &obj);
+  inline /* implicit */ union_flow(const union_flow &obj);
   inline /* implicit */ union_flow(std::nullptr_t);
-  inline isl::union_flow &operator=(isl::union_flow obj);
+  inline union_flow &operator=(union_flow obj);
   inline ~union_flow();
   inline __isl_give isl_union_flow *copy() const &;
   inline __isl_give isl_union_flow *copy() && = delete;
@@ -3022,24 +3022,24 @@
   inline __isl_give isl_union_flow *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
 
-  inline isl::union_map get_full_may_dependence() const;
-  inline isl::union_map get_full_must_dependence() const;
-  inline isl::union_map get_may_dependence() const;
-  inline isl::union_map get_may_no_source() const;
-  inline isl::union_map get_must_dependence() const;
-  inline isl::union_map get_must_no_source() 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 isl::union_map manage(__isl_take isl_union_map *ptr);
-inline isl::union_map manage_copy(__isl_keep isl_union_map *ptr);
+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 isl::union_map manage(__isl_take isl_union_map *ptr);
-  friend inline isl::union_map manage_copy(__isl_keep isl_union_map *ptr);
+  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;
 
@@ -3047,13 +3047,13 @@
 
 public:
   inline /* implicit */ union_map();
-  inline /* implicit */ union_map(const isl::union_map &obj);
+  inline /* implicit */ union_map(const union_map &obj);
   inline /* implicit */ union_map(std::nullptr_t);
-  inline explicit union_map(isl::union_pw_multi_aff upma);
-  inline /* implicit */ union_map(isl::basic_map bmap);
-  inline /* implicit */ union_map(isl::map map);
-  inline explicit union_map(isl::ctx ctx, const std::string &str);
-  inline isl::union_map &operator=(isl::union_map obj);
+  inline explicit union_map(union_pw_multi_aff upma);
+  inline /* implicit */ union_map(basic_map bmap);
+  inline /* implicit */ union_map(map map);
+  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;
@@ -3061,118 +3061,118 @@
   inline __isl_give isl_union_map *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::union_map add_map(isl::map map) const;
-  inline isl::union_map affine_hull() const;
-  inline isl::union_map align_params(isl::space model) const;
-  inline isl::union_map apply_domain(isl::union_map umap2) const;
-  inline isl::union_map apply_range(isl::union_map umap2) const;
-  inline isl::union_map coalesce() const;
-  inline isl::boolean contains(const isl::space &space) const;
-  inline isl::union_map curry() const;
-  inline isl::union_set deltas() const;
-  inline isl::union_map deltas_map() const;
-  inline isl::union_map detect_equalities() 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_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 unsigned int dim(isl::dim type) const;
-  inline isl::union_set domain() const;
-  inline isl::union_map domain_factor_domain() const;
-  inline isl::union_map domain_factor_range() const;
-  inline isl::union_map domain_map() const;
-  inline isl::union_pw_multi_aff domain_map_union_pw_multi_aff() const;
-  inline isl::union_map domain_product(isl::union_map umap2) const;
-  static inline isl::union_map empty(isl::space space);
-  inline isl::union_map eq_at(isl::multi_union_pw_aff mupa) const;
-  inline isl::map extract_map(isl::space dim) const;
-  inline isl::union_map factor_domain() const;
-  inline isl::union_map factor_range() 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);
+  inline union_map eq_at(multi_union_pw_aff mupa) const;
+  inline map extract_map(space dim) 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 isl::union_map fixed_power(isl::val exp) const;
-  inline isl::union_map flat_domain_product(isl::union_map umap2) const;
-  inline isl::union_map flat_range_product(isl::union_map umap2) const;
-  inline isl::stat foreach_map(const std::function<isl::stat(isl::map)> &fn) const;
-  static inline isl::union_map from(isl::multi_union_pw_aff mupa);
-  static inline isl::union_map from_domain(isl::union_set uset);
-  static inline isl::union_map from_domain_and_range(isl::union_set domain, isl::union_set range);
-  static inline isl::union_map from_range(isl::union_set uset);
-  static inline isl::union_map from_union_pw_aff(isl::union_pw_aff upa);
-  inline isl::id get_dim_id(isl::dim type, unsigned int pos) 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 isl::map_list get_map_list() const;
-  inline isl::space get_space() const;
-  inline isl::union_map gist(isl::union_map context) const;
-  inline isl::union_map gist_domain(isl::union_set uset) const;
-  inline isl::union_map gist_params(isl::set set) const;
-  inline isl::union_map gist_range(isl::union_set uset) const;
-  inline isl::union_map intersect(isl::union_map umap2) const;
-  inline isl::union_map intersect_domain(isl::union_set uset) const;
-  inline isl::union_map intersect_params(isl::set set) const;
-  inline isl::union_map intersect_range(isl::union_set uset) const;
-  inline isl::union_map intersect_range_factor_range(isl::union_map factor) const;
-  inline isl::boolean involves_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::boolean is_bijective() const;
-  inline isl::boolean is_disjoint(const isl::union_map &umap2) const;
-  inline isl::boolean is_empty() const;
-  inline isl::boolean is_equal(const isl::union_map &umap2) const;
-  inline isl::boolean is_identity() const;
-  inline isl::boolean is_injective() const;
-  inline isl::boolean is_single_valued() const;
-  inline isl::boolean is_strict_subset(const isl::union_map &umap2) const;
-  inline isl::boolean is_subset(const isl::union_map &umap2) const;
-  inline isl::union_map lex_ge_union_map(isl::union_map umap2) const;
-  inline isl::union_map lex_gt_at_multi_union_pw_aff(isl::multi_union_pw_aff mupa) const;
-  inline isl::union_map lex_gt_union_map(isl::union_map umap2) const;
-  inline isl::union_map lex_le_union_map(isl::union_map umap2) const;
-  inline isl::union_map lex_lt_at_multi_union_pw_aff(isl::multi_union_pw_aff mupa) const;
-  inline isl::union_map lex_lt_union_map(isl::union_map umap2) const;
-  inline isl::union_map lexmax() const;
-  inline isl::union_map lexmin() 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(union_set uset) const;
+  inline union_map intersect_params(set set) const;
+  inline union_map intersect_range(union_set uset) 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 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_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 int n_map() const;
-  inline isl::set params() const;
-  inline isl::boolean plain_is_empty() const;
-  inline isl::boolean plain_is_injective() const;
-  inline isl::union_map polyhedral_hull() const;
-  inline isl::union_map preimage_domain_multi_aff(isl::multi_aff ma) const;
-  inline isl::union_map preimage_domain_multi_pw_aff(isl::multi_pw_aff mpa) const;
-  inline isl::union_map preimage_domain_pw_multi_aff(isl::pw_multi_aff pma) const;
-  inline isl::union_map preimage_domain_union_pw_multi_aff(isl::union_pw_multi_aff upma) const;
-  inline isl::union_map preimage_range_multi_aff(isl::multi_aff ma) const;
-  inline isl::union_map preimage_range_pw_multi_aff(isl::pw_multi_aff pma) const;
-  inline isl::union_map preimage_range_union_pw_multi_aff(isl::union_pw_multi_aff upma) const;
-  inline isl::union_map product(isl::union_map umap2) const;
-  inline isl::union_map project_out(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::union_map project_out_all_params() const;
-  inline isl::union_set range() const;
-  inline isl::union_map range_curry() const;
-  inline isl::union_map range_factor_domain() const;
-  inline isl::union_map range_factor_range() const;
-  inline isl::union_map range_map() const;
-  inline isl::union_map range_product(isl::union_map umap2) const;
-  inline isl::union_map remove_divs() const;
-  inline isl::union_map remove_redundancies() const;
-  inline isl::union_map reset_user() const;
-  inline isl::union_map reverse() const;
-  inline isl::basic_map sample() const;
-  inline isl::union_map simple_hull() const;
-  inline isl::union_map subtract(isl::union_map umap2) const;
-  inline isl::union_map subtract_domain(isl::union_set dom) const;
-  inline isl::union_map subtract_range(isl::union_set dom) const;
-  inline isl::union_map uncurry() const;
-  inline isl::union_map unite(isl::union_map umap2) const;
-  inline isl::union_map universe() const;
-  inline isl::union_set wrap() const;
-  inline isl::union_map zip() 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(multi_aff ma) const;
+  inline union_map preimage_domain_multi_pw_aff(multi_pw_aff mpa) const;
+  inline union_map preimage_domain_pw_multi_aff(pw_multi_aff pma) const;
+  inline union_map preimage_domain_union_pw_multi_aff(union_pw_multi_aff upma) const;
+  inline union_map preimage_range_multi_aff(multi_aff ma) const;
+  inline union_map preimage_range_pw_multi_aff(pw_multi_aff pma) const;
+  inline union_map preimage_range_union_pw_multi_aff(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 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 isl::union_map_list manage(__isl_take isl_union_map_list *ptr);
-inline isl::union_map_list manage_copy(__isl_keep isl_union_map_list *ptr);
+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 isl::union_map_list manage(__isl_take isl_union_map_list *ptr);
-  friend inline isl::union_map_list manage_copy(__isl_keep isl_union_map_list *ptr);
+  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;
 
@@ -3180,9 +3180,9 @@
 
 public:
   inline /* implicit */ union_map_list();
-  inline /* implicit */ union_map_list(const isl::union_map_list &obj);
+  inline /* implicit */ union_map_list(const union_map_list &obj);
   inline /* implicit */ union_map_list(std::nullptr_t);
-  inline isl::union_map_list &operator=(isl::union_map_list obj);
+  inline union_map_list &operator=(union_map_list obj);
   inline ~union_map_list();
   inline __isl_give isl_union_map_list *copy() const &;
   inline __isl_give isl_union_map_list *copy() && = delete;
@@ -3190,32 +3190,32 @@
   inline __isl_give isl_union_map_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::union_map_list add(isl::union_map el) const;
-  static inline isl::union_map_list alloc(isl::ctx ctx, int n);
-  inline isl::union_map_list concat(isl::union_map_list list2) const;
-  inline isl::union_map_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::union_map)> &fn) const;
-  static inline isl::union_map_list from_union_map(isl::union_map el);
-  inline isl::union_map get_at(int index) const;
-  inline isl::union_map get_union_map(int index) const;
-  inline isl::union_map_list insert(unsigned int pos, isl::union_map el) const;
+  inline union_map_list add(union_map el) const;
+  static inline union_map_list alloc(ctx ctx, int n);
+  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 int n_union_map() const;
-  inline isl::union_map_list reverse() const;
-  inline isl::union_map_list set_union_map(int index, isl::union_map el) const;
+  inline union_map_list reverse() const;
+  inline union_map_list set_union_map(int index, union_map el) const;
   inline int size() const;
-  inline isl::union_map_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline union_map_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::union_pw_aff
-inline isl::union_pw_aff manage(__isl_take isl_union_pw_aff *ptr);
-inline isl::union_pw_aff manage_copy(__isl_keep isl_union_pw_aff *ptr);
+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 isl::union_pw_aff manage(__isl_take isl_union_pw_aff *ptr);
-  friend inline isl::union_pw_aff manage_copy(__isl_keep isl_union_pw_aff *ptr);
+  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;
 
@@ -3223,12 +3223,12 @@
 
 public:
   inline /* implicit */ union_pw_aff();
-  inline /* implicit */ union_pw_aff(const isl::union_pw_aff &obj);
+  inline /* implicit */ union_pw_aff(const union_pw_aff &obj);
   inline /* implicit */ union_pw_aff(std::nullptr_t);
-  inline /* implicit */ union_pw_aff(isl::pw_aff pa);
-  inline explicit union_pw_aff(isl::union_set domain, isl::val v);
-  inline explicit union_pw_aff(isl::ctx ctx, const std::string &str);
-  inline isl::union_pw_aff &operator=(isl::union_pw_aff obj);
+  inline /* implicit */ union_pw_aff(pw_aff pa);
+  inline explicit union_pw_aff(union_set domain, val v);
+  inline explicit union_pw_aff(ctx ctx, const std::string &str);
+  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;
@@ -3236,55 +3236,55 @@
   inline __isl_give isl_union_pw_aff *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::union_pw_aff add(isl::union_pw_aff upa2) const;
-  inline isl::union_pw_aff add_pw_aff(isl::pw_aff pa) const;
-  static inline isl::union_pw_aff aff_on_domain(isl::union_set domain, isl::aff aff);
-  inline isl::union_pw_aff align_params(isl::space model) const;
-  inline isl::union_pw_aff coalesce() 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_pw_aff coalesce() const;
   inline unsigned int dim(isl::dim type) const;
-  inline isl::union_set domain() const;
-  inline isl::union_pw_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  static inline isl::union_pw_aff empty(isl::space space);
-  inline isl::pw_aff extract_pw_aff(isl::space space) 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);
+  inline pw_aff extract_pw_aff(space space) const;
   inline int find_dim_by_name(isl::dim type, const std::string &name) const;
-  inline isl::union_pw_aff floor() const;
-  inline isl::stat foreach_pw_aff(const std::function<isl::stat(isl::pw_aff)> &fn) const;
-  inline isl::pw_aff_list get_pw_aff_list() const;
-  inline isl::space get_space() const;
-  inline isl::union_pw_aff gist(isl::union_set context) const;
-  inline isl::union_pw_aff gist_params(isl::set context) const;
-  inline isl::union_pw_aff intersect_domain(isl::union_set uset) const;
-  inline isl::union_pw_aff intersect_params(isl::set set) const;
-  inline isl::boolean involves_nan() const;
-  inline isl::val max_val() const;
-  inline isl::val min_val() const;
-  inline isl::union_pw_aff mod_val(isl::val f) 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(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 int n_pw_aff() const;
-  inline isl::union_pw_aff neg() const;
-  static inline isl::union_pw_aff param_on_domain_id(isl::union_set domain, isl::id id);
-  inline isl::boolean plain_is_equal(const isl::union_pw_aff &upa2) const;
-  inline isl::union_pw_aff pullback(isl::union_pw_multi_aff upma) const;
-  static inline isl::union_pw_aff pw_aff_on_domain(isl::union_set domain, isl::pw_aff pa);
-  inline isl::union_pw_aff reset_user() const;
-  inline isl::union_pw_aff scale_down_val(isl::val v) const;
-  inline isl::union_pw_aff scale_val(isl::val v) const;
-  inline isl::union_pw_aff sub(isl::union_pw_aff upa2) const;
-  inline isl::union_pw_aff subtract_domain(isl::union_set uset) const;
-  inline isl::union_pw_aff union_add(isl::union_pw_aff upa2) const;
-  inline isl::union_set zero_union_set() 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(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 isl::union_pw_aff_list manage(__isl_take isl_union_pw_aff_list *ptr);
-inline isl::union_pw_aff_list manage_copy(__isl_keep isl_union_pw_aff_list *ptr);
+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 isl::union_pw_aff_list manage(__isl_take isl_union_pw_aff_list *ptr);
-  friend inline isl::union_pw_aff_list manage_copy(__isl_keep isl_union_pw_aff_list *ptr);
+  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;
 
@@ -3292,9 +3292,9 @@
 
 public:
   inline /* implicit */ union_pw_aff_list();
-  inline /* implicit */ union_pw_aff_list(const isl::union_pw_aff_list &obj);
+  inline /* implicit */ union_pw_aff_list(const union_pw_aff_list &obj);
   inline /* implicit */ union_pw_aff_list(std::nullptr_t);
-  inline isl::union_pw_aff_list &operator=(isl::union_pw_aff_list obj);
+  inline union_pw_aff_list &operator=(union_pw_aff_list obj);
   inline ~union_pw_aff_list();
   inline __isl_give isl_union_pw_aff_list *copy() const &;
   inline __isl_give isl_union_pw_aff_list *copy() && = delete;
@@ -3302,32 +3302,32 @@
   inline __isl_give isl_union_pw_aff_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::union_pw_aff_list add(isl::union_pw_aff el) const;
-  static inline isl::union_pw_aff_list alloc(isl::ctx ctx, int n);
-  inline isl::union_pw_aff_list concat(isl::union_pw_aff_list list2) const;
-  inline isl::union_pw_aff_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::union_pw_aff)> &fn) const;
-  static inline isl::union_pw_aff_list from_union_pw_aff(isl::union_pw_aff el);
-  inline isl::union_pw_aff get_at(int index) const;
-  inline isl::union_pw_aff get_union_pw_aff(int index) const;
-  inline isl::union_pw_aff_list insert(unsigned int pos, isl::union_pw_aff el) 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 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 int n_union_pw_aff() const;
-  inline isl::union_pw_aff_list reverse() const;
-  inline isl::union_pw_aff_list set_union_pw_aff(int index, isl::union_pw_aff el) 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 int size() const;
-  inline isl::union_pw_aff_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline union_pw_aff_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::union_pw_multi_aff
-inline isl::union_pw_multi_aff manage(__isl_take isl_union_pw_multi_aff *ptr);
-inline isl::union_pw_multi_aff manage_copy(__isl_keep isl_union_pw_multi_aff *ptr);
+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 isl::union_pw_multi_aff manage(__isl_take isl_union_pw_multi_aff *ptr);
-  friend inline isl::union_pw_multi_aff manage_copy(__isl_keep isl_union_pw_multi_aff *ptr);
+  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;
 
@@ -3335,16 +3335,16 @@
 
 public:
   inline /* implicit */ union_pw_multi_aff();
-  inline /* implicit */ union_pw_multi_aff(const isl::union_pw_multi_aff &obj);
+  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(isl::aff aff);
-  inline /* implicit */ union_pw_multi_aff(isl::pw_multi_aff pma);
-  inline explicit union_pw_multi_aff(isl::union_set uset);
-  inline explicit union_pw_multi_aff(isl::union_map umap);
-  inline explicit union_pw_multi_aff(isl::ctx ctx, const std::string &str);
-  inline /* implicit */ union_pw_multi_aff(isl::union_pw_aff upa);
-  inline explicit union_pw_multi_aff(isl::multi_union_pw_aff mupa);
-  inline isl::union_pw_multi_aff &operator=(isl::union_pw_multi_aff obj);
+  inline /* implicit */ union_pw_multi_aff(aff aff);
+  inline /* implicit */ union_pw_multi_aff(pw_multi_aff pma);
+  inline explicit union_pw_multi_aff(union_set uset);
+  inline explicit union_pw_multi_aff(union_map umap);
+  inline explicit union_pw_multi_aff(ctx ctx, const std::string &str);
+  inline /* implicit */ union_pw_multi_aff(union_pw_aff upa);
+  inline explicit union_pw_multi_aff(multi_union_pw_aff mupa);
+  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;
@@ -3352,52 +3352,52 @@
   inline __isl_give isl_union_pw_multi_aff *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::union_pw_multi_aff add(isl::union_pw_multi_aff upma2) const;
-  inline isl::union_pw_multi_aff add_pw_multi_aff(isl::pw_multi_aff pma) const;
-  inline isl::union_pw_multi_aff align_params(isl::space model) const;
-  inline isl::union_pw_multi_aff coalesce() 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 coalesce() const;
   inline unsigned int dim(isl::dim type) const;
-  inline isl::union_set domain() const;
-  inline isl::union_pw_multi_aff drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  static inline isl::union_pw_multi_aff empty(isl::space space);
-  inline isl::pw_multi_aff extract_pw_multi_aff(isl::space space) 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);
+  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 isl::union_pw_multi_aff flat_range_product(isl::union_pw_multi_aff upma2) const;
-  inline isl::stat foreach_pw_multi_aff(const std::function<isl::stat(isl::pw_multi_aff)> &fn) const;
-  static inline isl::union_pw_multi_aff from_union_set(isl::union_set uset);
-  inline isl::pw_multi_aff_list get_pw_multi_aff_list() const;
-  inline isl::space get_space() const;
-  inline isl::union_pw_aff get_union_pw_aff(int pos) const;
-  inline isl::union_pw_multi_aff gist(isl::union_set context) const;
-  inline isl::union_pw_multi_aff gist_params(isl::set context) const;
-  inline isl::union_pw_multi_aff intersect_domain(isl::union_set uset) const;
-  inline isl::union_pw_multi_aff intersect_params(isl::set set) const;
-  inline isl::boolean involves_nan() const;
-  static inline isl::union_pw_multi_aff multi_val_on_domain(isl::union_set domain, isl::multi_val mv);
+  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(union_set uset) const;
+  inline union_pw_multi_aff intersect_params(set set) const;
+  inline boolean involves_nan() const;
+  static inline union_pw_multi_aff multi_val_on_domain(union_set domain, multi_val mv);
   inline int n_pw_multi_aff() const;
-  inline isl::union_pw_multi_aff neg() const;
-  inline isl::boolean plain_is_equal(const isl::union_pw_multi_aff &upma2) const;
-  inline isl::union_pw_multi_aff pullback(isl::union_pw_multi_aff upma2) const;
-  inline isl::union_pw_multi_aff reset_user() const;
-  inline isl::union_pw_multi_aff scale_down_val(isl::val val) const;
-  inline isl::union_pw_multi_aff scale_multi_val(isl::multi_val mv) const;
-  inline isl::union_pw_multi_aff scale_val(isl::val val) const;
-  inline isl::union_pw_multi_aff sub(isl::union_pw_multi_aff upma2) const;
-  inline isl::union_pw_multi_aff subtract_domain(isl::union_set uset) const;
-  inline isl::union_pw_multi_aff union_add(isl::union_pw_multi_aff upma2) const;
+  inline union_pw_multi_aff neg() const;
+  inline boolean plain_is_equal(const union_pw_multi_aff &upma2) const;
+  inline union_pw_multi_aff pullback(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(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 isl::union_pw_multi_aff_list manage(__isl_take isl_union_pw_multi_aff_list *ptr);
-inline isl::union_pw_multi_aff_list manage_copy(__isl_keep isl_union_pw_multi_aff_list *ptr);
+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 isl::union_pw_multi_aff_list manage(__isl_take isl_union_pw_multi_aff_list *ptr);
-  friend inline isl::union_pw_multi_aff_list manage_copy(__isl_keep isl_union_pw_multi_aff_list *ptr);
+  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;
 
@@ -3405,9 +3405,9 @@
 
 public:
   inline /* implicit */ union_pw_multi_aff_list();
-  inline /* implicit */ union_pw_multi_aff_list(const isl::union_pw_multi_aff_list &obj);
+  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 isl::union_pw_multi_aff_list &operator=(isl::union_pw_multi_aff_list obj);
+  inline union_pw_multi_aff_list &operator=(union_pw_multi_aff_list obj);
   inline ~union_pw_multi_aff_list();
   inline __isl_give isl_union_pw_multi_aff_list *copy() const &;
   inline __isl_give isl_union_pw_multi_aff_list *copy() && = delete;
@@ -3415,32 +3415,32 @@
   inline __isl_give isl_union_pw_multi_aff_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::union_pw_multi_aff_list add(isl::union_pw_multi_aff el) const;
-  static inline isl::union_pw_multi_aff_list alloc(isl::ctx ctx, int n);
-  inline isl::union_pw_multi_aff_list concat(isl::union_pw_multi_aff_list list2) const;
-  inline isl::union_pw_multi_aff_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::union_pw_multi_aff)> &fn) const;
-  static inline isl::union_pw_multi_aff_list from_union_pw_multi_aff(isl::union_pw_multi_aff el);
-  inline isl::union_pw_multi_aff get_at(int index) const;
-  inline isl::union_pw_multi_aff get_union_pw_multi_aff(int index) const;
-  inline isl::union_pw_multi_aff_list insert(unsigned int pos, isl::union_pw_multi_aff el) 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 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 int n_union_pw_multi_aff() const;
-  inline isl::union_pw_multi_aff_list reverse() const;
-  inline isl::union_pw_multi_aff_list set_union_pw_multi_aff(int index, isl::union_pw_multi_aff el) 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 int size() const;
-  inline isl::union_pw_multi_aff_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline union_pw_multi_aff_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::union_pw_qpolynomial
-inline isl::union_pw_qpolynomial manage(__isl_take isl_union_pw_qpolynomial *ptr);
-inline isl::union_pw_qpolynomial manage_copy(__isl_keep isl_union_pw_qpolynomial *ptr);
+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 isl::union_pw_qpolynomial manage(__isl_take isl_union_pw_qpolynomial *ptr);
-  friend inline isl::union_pw_qpolynomial manage_copy(__isl_keep isl_union_pw_qpolynomial *ptr);
+  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;
 
@@ -3448,10 +3448,10 @@
 
 public:
   inline /* implicit */ union_pw_qpolynomial();
-  inline /* implicit */ union_pw_qpolynomial(const isl::union_pw_qpolynomial &obj);
+  inline /* implicit */ union_pw_qpolynomial(const union_pw_qpolynomial &obj);
   inline /* implicit */ union_pw_qpolynomial(std::nullptr_t);
-  inline explicit union_pw_qpolynomial(isl::ctx ctx, const std::string &str);
-  inline isl::union_pw_qpolynomial &operator=(isl::union_pw_qpolynomial obj);
+  inline explicit union_pw_qpolynomial(ctx ctx, const std::string &str);
+  inline union_pw_qpolynomial &operator=(union_pw_qpolynomial obj);
   inline ~union_pw_qpolynomial();
   inline __isl_give isl_union_pw_qpolynomial *copy() const &;
   inline __isl_give isl_union_pw_qpolynomial *copy() && = delete;
@@ -3459,48 +3459,48 @@
   inline __isl_give isl_union_pw_qpolynomial *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
 
-  inline isl::union_pw_qpolynomial add(isl::union_pw_qpolynomial upwqp2) const;
-  inline isl::union_pw_qpolynomial add_pw_qpolynomial(isl::pw_qpolynomial pwqp) const;
-  inline isl::union_pw_qpolynomial align_params(isl::space model) const;
-  inline isl::union_pw_qpolynomial coalesce() 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 unsigned int dim(isl::dim type) const;
-  inline isl::union_set domain() const;
-  inline isl::union_pw_qpolynomial drop_dims(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::val eval(isl::point pnt) const;
-  inline isl::pw_qpolynomial extract_pw_qpolynomial(isl::space dim) 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 dim) const;
   inline int find_dim_by_name(isl::dim type, const std::string &name) const;
-  inline isl::stat foreach_pw_qpolynomial(const std::function<isl::stat(isl::pw_qpolynomial)> &fn) const;
-  static inline isl::union_pw_qpolynomial from_pw_qpolynomial(isl::pw_qpolynomial pwqp);
-  inline isl::pw_qpolynomial_list get_pw_qpolynomial_list() const;
-  inline isl::space get_space() const;
-  inline isl::union_pw_qpolynomial gist(isl::union_set context) const;
-  inline isl::union_pw_qpolynomial gist_params(isl::set context) const;
-  inline isl::union_pw_qpolynomial intersect_domain(isl::union_set uset) const;
-  inline isl::union_pw_qpolynomial intersect_params(isl::set set) const;
-  inline isl::boolean involves_nan() const;
-  inline isl::union_pw_qpolynomial mul(isl::union_pw_qpolynomial upwqp2) 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_params(set set) const;
+  inline boolean involves_nan() const;
+  inline union_pw_qpolynomial mul(union_pw_qpolynomial upwqp2) const;
   inline int n_pw_qpolynomial() const;
-  inline isl::union_pw_qpolynomial neg() const;
-  inline isl::boolean plain_is_equal(const isl::union_pw_qpolynomial &upwqp2) const;
-  inline isl::union_pw_qpolynomial reset_user() const;
-  inline isl::union_pw_qpolynomial scale_down_val(isl::val v) const;
-  inline isl::union_pw_qpolynomial scale_val(isl::val v) const;
-  inline isl::union_pw_qpolynomial sub(isl::union_pw_qpolynomial upwqp2) const;
-  inline isl::union_pw_qpolynomial subtract_domain(isl::union_set uset) const;
-  inline isl::union_pw_qpolynomial to_polynomial(int sign) const;
-  static inline isl::union_pw_qpolynomial zero(isl::space dim);
+  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 to_polynomial(int sign) const;
+  static inline union_pw_qpolynomial zero(space dim);
 };
 
 // declarations for isl::union_set
-inline isl::union_set manage(__isl_take isl_union_set *ptr);
-inline isl::union_set manage_copy(__isl_keep isl_union_set *ptr);
+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 isl::union_set manage(__isl_take isl_union_set *ptr);
-  friend inline isl::union_set manage_copy(__isl_keep isl_union_set *ptr);
+  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;
 
@@ -3508,13 +3508,13 @@
 
 public:
   inline /* implicit */ union_set();
-  inline /* implicit */ union_set(const isl::union_set &obj);
+  inline /* implicit */ union_set(const union_set &obj);
   inline /* implicit */ union_set(std::nullptr_t);
-  inline /* implicit */ union_set(isl::basic_set bset);
-  inline /* implicit */ union_set(isl::set set);
-  inline /* implicit */ union_set(isl::point pnt);
-  inline explicit union_set(isl::ctx ctx, const std::string &str);
-  inline isl::union_set &operator=(isl::union_set obj);
+  inline /* implicit */ union_set(basic_set bset);
+  inline /* implicit */ union_set(set set);
+  inline /* implicit */ union_set(point pnt);
+  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;
@@ -3522,76 +3522,76 @@
   inline __isl_give isl_union_set *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::union_set add_set(isl::set set) const;
-  inline isl::union_set affine_hull() const;
-  inline isl::union_set align_params(isl::space model) const;
-  inline isl::union_set apply(isl::union_map umap) const;
-  inline isl::union_set coalesce() const;
-  inline isl::union_set coefficients() const;
-  inline isl::schedule compute_schedule(isl::union_map validity, isl::union_map proximity) const;
-  inline isl::boolean contains(const isl::space &space) const;
-  inline isl::union_set detect_equalities() 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 unsigned int dim(isl::dim type) const;
-  static inline isl::union_set empty(isl::space space);
-  inline isl::set extract_set(isl::space dim) const;
-  inline isl::stat foreach_point(const std::function<isl::stat(isl::point)> &fn) const;
-  inline isl::stat foreach_set(const std::function<isl::stat(isl::set)> &fn) const;
-  inline isl::basic_set_list get_basic_set_list() const;
+  static inline union_set empty(space space);
+  inline set extract_set(space dim) 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 isl::set_list get_set_list() const;
-  inline isl::space get_space() const;
-  inline isl::union_set gist(isl::union_set context) const;
-  inline isl::union_set gist_params(isl::set set) const;
-  inline isl::union_map identity() const;
-  inline isl::union_pw_multi_aff identity_union_pw_multi_aff() const;
-  inline isl::union_set intersect(isl::union_set uset2) const;
-  inline isl::union_set intersect_params(isl::set set) const;
-  inline isl::boolean is_disjoint(const isl::union_set &uset2) const;
-  inline isl::boolean is_empty() const;
-  inline isl::boolean is_equal(const isl::union_set &uset2) const;
-  inline isl::boolean is_params() const;
-  inline isl::boolean is_strict_subset(const isl::union_set &uset2) const;
-  inline isl::boolean is_subset(const isl::union_set &uset2) const;
-  inline isl::union_map lex_ge_union_set(isl::union_set uset2) const;
-  inline isl::union_map lex_gt_union_set(isl::union_set uset2) const;
-  inline isl::union_map lex_le_union_set(isl::union_set uset2) const;
-  inline isl::union_map lex_lt_union_set(isl::union_set uset2) const;
-  inline isl::union_set lexmax() const;
-  inline isl::union_set lexmin() const;
-  inline isl::multi_val min_multi_union_pw_aff(const isl::multi_union_pw_aff &obj) 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 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 int n_set() const;
-  inline isl::set params() const;
-  inline isl::union_set polyhedral_hull() const;
-  inline isl::union_set preimage(isl::multi_aff ma) const;
-  inline isl::union_set preimage(isl::pw_multi_aff pma) const;
-  inline isl::union_set preimage(isl::union_pw_multi_aff upma) const;
-  inline isl::union_set product(isl::union_set uset2) const;
-  inline isl::union_set project_out(isl::dim type, unsigned int first, unsigned int n) const;
-  inline isl::union_set remove_divs() const;
-  inline isl::union_set remove_redundancies() const;
-  inline isl::union_set reset_user() const;
-  inline isl::basic_set sample() const;
-  inline isl::point sample_point() const;
-  inline isl::union_set simple_hull() const;
-  inline isl::union_set solutions() const;
-  inline isl::union_set subtract(isl::union_set uset2) const;
-  inline isl::union_set unite(isl::union_set uset2) const;
-  inline isl::union_set universe() const;
-  inline isl::union_map unwrap() const;
-  inline isl::union_map wrapped_domain_map() 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 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 isl::union_set_list manage(__isl_take isl_union_set_list *ptr);
-inline isl::union_set_list manage_copy(__isl_keep isl_union_set_list *ptr);
+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 isl::union_set_list manage(__isl_take isl_union_set_list *ptr);
-  friend inline isl::union_set_list manage_copy(__isl_keep isl_union_set_list *ptr);
+  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;
 
@@ -3599,9 +3599,9 @@
 
 public:
   inline /* implicit */ union_set_list();
-  inline /* implicit */ union_set_list(const isl::union_set_list &obj);
+  inline /* implicit */ union_set_list(const union_set_list &obj);
   inline /* implicit */ union_set_list(std::nullptr_t);
-  inline isl::union_set_list &operator=(isl::union_set_list obj);
+  inline union_set_list &operator=(union_set_list obj);
   inline ~union_set_list();
   inline __isl_give isl_union_set_list *copy() const &;
   inline __isl_give isl_union_set_list *copy() && = delete;
@@ -3609,33 +3609,33 @@
   inline __isl_give isl_union_set_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::union_set_list add(isl::union_set el) const;
-  static inline isl::union_set_list alloc(isl::ctx ctx, int n);
-  inline isl::union_set_list concat(isl::union_set_list list2) const;
-  inline isl::union_set_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::union_set)> &fn) const;
-  static inline isl::union_set_list from_union_set(isl::union_set el);
-  inline isl::union_set get_at(int index) const;
-  inline isl::union_set get_union_set(int index) const;
-  inline isl::union_set_list insert(unsigned int pos, isl::union_set el) const;
+  inline union_set_list add(union_set el) const;
+  static inline union_set_list alloc(ctx ctx, int n);
+  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 int n_union_set() const;
-  inline isl::union_set_list reverse() const;
-  inline isl::union_set_list set_union_set(int index, isl::union_set el) const;
+  inline union_set_list reverse() const;
+  inline union_set_list set_union_set(int index, union_set el) const;
   inline int size() const;
-  inline isl::union_set_list swap(unsigned int pos1, unsigned int pos2) const;
-  inline isl::union_set unite() const;
+  inline union_set_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline union_set unite() const;
 };
 
 // declarations for isl::val
-inline isl::val manage(__isl_take isl_val *ptr);
-inline isl::val manage_copy(__isl_keep isl_val *ptr);
+inline val manage(__isl_take isl_val *ptr);
+inline val manage_copy(__isl_keep isl_val *ptr);
 
 class val {
-  friend inline isl::val manage(__isl_take isl_val *ptr);
-  friend inline isl::val manage_copy(__isl_keep isl_val *ptr);
+  friend inline val manage(__isl_take isl_val *ptr);
+  friend inline val manage_copy(__isl_keep isl_val *ptr);
 
   isl_val *ptr = nullptr;
 
@@ -3643,11 +3643,11 @@
 
 public:
   inline /* implicit */ val();
-  inline /* implicit */ val(const isl::val &obj);
+  inline /* implicit */ val(const val &obj);
   inline /* implicit */ val(std::nullptr_t);
-  inline explicit val(isl::ctx ctx, const std::string &str);
-  inline explicit val(isl::ctx ctx, long i);
-  inline isl::val &operator=(isl::val obj);
+  inline explicit val(ctx ctx, const std::string &str);
+  inline explicit val(ctx ctx, long i);
+  inline val &operator=(val obj);
   inline ~val();
   inline __isl_give isl_val *copy() const &;
   inline __isl_give isl_val *copy() && = delete;
@@ -3655,72 +3655,72 @@
   inline __isl_give isl_val *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline std::string to_str() const;
   inline void dump() const;
 
-  inline isl::val two_exp() const;
-  inline isl::val abs() const;
-  inline isl::boolean abs_eq(const isl::val &v2) const;
-  inline isl::val add(isl::val v2) const;
-  inline isl::val add_ui(unsigned long v2) const;
-  inline isl::val ceil() const;
+  inline val two_exp() 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 isl::val div(isl::val v2) const;
-  inline isl::val div_ui(unsigned long v2) const;
-  inline isl::boolean eq(const isl::val &v2) const;
-  inline isl::val floor() const;
-  inline isl::val gcd(isl::val v2) const;
-  inline isl::boolean ge(const isl::val &v2) const;
+  inline val div(val v2) const;
+  inline val div_ui(unsigned long v2) const;
+  inline boolean eq(const val &v2) 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 isl::boolean gt(const isl::val &v2) const;
-  inline isl::boolean gt_si(long i) const;
-  static inline isl::val infty(isl::ctx ctx);
-  static inline isl::val int_from_ui(isl::ctx ctx, unsigned long u);
-  inline isl::val inv() const;
-  inline isl::boolean is_divisible_by(const isl::val &v2) const;
-  inline isl::boolean is_infty() const;
-  inline isl::boolean is_int() const;
-  inline isl::boolean is_nan() const;
-  inline isl::boolean is_neg() const;
-  inline isl::boolean is_neginfty() const;
-  inline isl::boolean is_negone() const;
-  inline isl::boolean is_nonneg() const;
-  inline isl::boolean is_nonpos() const;
-  inline isl::boolean is_one() const;
-  inline isl::boolean is_pos() const;
-  inline isl::boolean is_rat() const;
-  inline isl::boolean is_zero() const;
-  inline isl::boolean le(const isl::val &v2) const;
-  inline isl::boolean lt(const isl::val &v2) const;
-  inline isl::val max(isl::val v2) const;
-  inline isl::val min(isl::val v2) const;
-  inline isl::val mod(isl::val v2) const;
-  inline isl::val mul(isl::val v2) const;
-  inline isl::val mul_ui(unsigned long v2) 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 size_t n_abs_num_chunks(size_t size) const;
-  static inline isl::val nan(isl::ctx ctx);
-  inline isl::boolean ne(const isl::val &v2) const;
-  inline isl::val neg() const;
-  static inline isl::val neginfty(isl::ctx ctx);
-  static inline isl::val negone(isl::ctx ctx);
-  static inline isl::val one(isl::ctx ctx);
-  inline isl::val set_si(long i) 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 set_si(long i) const;
   inline int sgn() const;
-  inline isl::val sub(isl::val v2) const;
-  inline isl::val sub_ui(unsigned long v2) const;
-  inline isl::val trunc() const;
-  static inline isl::val zero(isl::ctx ctx);
+  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 isl::val_list manage(__isl_take isl_val_list *ptr);
-inline isl::val_list manage_copy(__isl_keep isl_val_list *ptr);
+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 isl::val_list manage(__isl_take isl_val_list *ptr);
-  friend inline isl::val_list manage_copy(__isl_keep isl_val_list *ptr);
+  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;
 
@@ -3728,9 +3728,9 @@
 
 public:
   inline /* implicit */ val_list();
-  inline /* implicit */ val_list(const isl::val_list &obj);
+  inline /* implicit */ val_list(const val_list &obj);
   inline /* implicit */ val_list(std::nullptr_t);
-  inline isl::val_list &operator=(isl::val_list obj);
+  inline val_list &operator=(val_list obj);
   inline ~val_list();
   inline __isl_give isl_val_list *copy() const &;
   inline __isl_give isl_val_list *copy() && = delete;
@@ -3738,32 +3738,32 @@
   inline __isl_give isl_val_list *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::val_list add(isl::val el) const;
-  static inline isl::val_list alloc(isl::ctx ctx, int n);
-  inline isl::val_list concat(isl::val_list list2) const;
-  inline isl::val_list drop(unsigned int first, unsigned int n) const;
-  inline isl::stat foreach(const std::function<isl::stat(isl::val)> &fn) const;
-  static inline isl::val_list from_val(isl::val el);
-  inline isl::val get_at(int index) const;
-  inline isl::val get_val(int index) const;
-  inline isl::val_list insert(unsigned int pos, isl::val el) const;
+  inline val_list add(val el) const;
+  static inline val_list alloc(ctx ctx, int n);
+  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 int n_val() const;
-  inline isl::val_list reverse() const;
-  inline isl::val_list set_val(int index, isl::val el) const;
+  inline val_list reverse() const;
+  inline val_list set_val(int index, val el) const;
   inline int size() const;
-  inline isl::val_list swap(unsigned int pos1, unsigned int pos2) const;
+  inline val_list swap(unsigned int pos1, unsigned int pos2) const;
 };
 
 // declarations for isl::vec
-inline isl::vec manage(__isl_take isl_vec *ptr);
-inline isl::vec manage_copy(__isl_keep isl_vec *ptr);
+inline vec manage(__isl_take isl_vec *ptr);
+inline vec manage_copy(__isl_keep isl_vec *ptr);
 
 class vec {
-  friend inline isl::vec manage(__isl_take isl_vec *ptr);
-  friend inline isl::vec manage_copy(__isl_keep isl_vec *ptr);
+  friend inline vec manage(__isl_take isl_vec *ptr);
+  friend inline vec manage_copy(__isl_keep isl_vec *ptr);
 
   isl_vec *ptr = nullptr;
 
@@ -3771,9 +3771,9 @@
 
 public:
   inline /* implicit */ vec();
-  inline /* implicit */ vec(const isl::vec &obj);
+  inline /* implicit */ vec(const vec &obj);
   inline /* implicit */ vec(std::nullptr_t);
-  inline isl::vec &operator=(isl::vec obj);
+  inline vec &operator=(vec obj);
   inline ~vec();
   inline __isl_give isl_vec *copy() const &;
   inline __isl_give isl_vec *copy() && = delete;
@@ -3781,40 +3781,40 @@
   inline __isl_give isl_vec *release();
   inline bool is_null() const;
   inline explicit operator bool() const;
-  inline isl::ctx get_ctx() const;
+  inline ctx get_ctx() const;
   inline void dump() const;
 
-  inline isl::vec add(isl::vec vec2) const;
-  inline isl::vec add_els(unsigned int n) const;
-  static inline isl::vec alloc(isl::ctx ctx, unsigned int size);
-  inline isl::vec ceil() const;
-  inline isl::vec clr() const;
-  inline int cmp_element(const isl::vec &vec2, int pos) const;
-  inline isl::vec concat(isl::vec vec2) const;
-  inline isl::vec drop_els(unsigned int pos, unsigned int n) const;
-  inline isl::vec extend(unsigned int size) const;
-  inline isl::val get_element_val(int pos) const;
-  inline isl::vec insert_els(unsigned int pos, unsigned int n) const;
-  inline isl::vec insert_zero_els(unsigned int pos, unsigned int n) const;
-  inline isl::boolean is_equal(const isl::vec &vec2) const;
-  inline isl::vec mat_product(isl::mat mat) const;
-  inline isl::vec move_els(unsigned int dst_col, unsigned int src_col, unsigned int n) const;
-  inline isl::vec neg() const;
-  inline isl::vec set_element_si(int pos, int v) const;
-  inline isl::vec set_element_val(int pos, isl::val v) const;
-  inline isl::vec set_si(int v) const;
-  inline isl::vec set_val(isl::val v) 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 int size() const;
-  inline isl::vec sort() const;
-  static inline isl::vec zero(isl::ctx ctx, unsigned int size);
-  inline isl::vec zero_extend(unsigned int 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
-isl::aff manage(__isl_take isl_aff *ptr) {
+aff manage(__isl_take isl_aff *ptr) {
   return aff(ptr);
 }
-isl::aff manage_copy(__isl_keep isl_aff *ptr) {
+aff manage_copy(__isl_keep isl_aff *ptr) {
   ptr = isl_aff_copy(ptr);
   return aff(ptr);
 }
@@ -3822,7 +3822,7 @@
 aff::aff()
     : ptr(nullptr) {}
 
-aff::aff(const isl::aff &obj)
+aff::aff(const aff &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -3834,23 +3834,23 @@
 aff::aff(__isl_take isl_aff *ptr)
     : ptr(ptr) {}
 
-aff::aff(isl::local_space ls)
+aff::aff(local_space ls)
 {
   auto res = isl_aff_zero_on_domain(ls.release());
   ptr = res;
 }
-aff::aff(isl::local_space ls, isl::val val)
+aff::aff(local_space ls, val val)
 {
   auto res = isl_aff_val_on_domain(ls.release(), val.release());
   ptr = res;
 }
-aff::aff(isl::ctx ctx, const std::string &str)
+aff::aff(ctx ctx, const std::string &str)
 {
   auto res = isl_aff_read_from_str(ctx.release(), str.c_str());
   ptr = res;
 }
 
-aff &aff::operator=(isl::aff obj) {
+aff &aff::operator=(aff obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -3882,8 +3882,8 @@
 }
 
 
-isl::ctx aff::get_ctx() const {
-  return isl::ctx(isl_aff_get_ctx(ptr));
+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());
@@ -3900,55 +3900,55 @@
 }
 
 
-isl::aff aff::add(isl::aff aff2) const
+aff aff::add(aff aff2) const
 {
   auto res = isl_aff_add(copy(), aff2.release());
   return manage(res);
 }
 
-isl::aff aff::add_coefficient_si(isl::dim type, int pos, int v) const
+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);
 }
 
-isl::aff aff::add_coefficient_val(isl::dim type, int pos, isl::val v) const
+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);
 }
 
-isl::aff aff::add_constant_num_si(int v) const
+aff aff::add_constant_num_si(int v) const
 {
   auto res = isl_aff_add_constant_num_si(copy(), v);
   return manage(res);
 }
 
-isl::aff aff::add_constant_si(int v) const
+aff aff::add_constant_si(int v) const
 {
   auto res = isl_aff_add_constant_si(copy(), v);
   return manage(res);
 }
 
-isl::aff aff::add_constant_val(isl::val v) const
+aff aff::add_constant_val(val v) const
 {
   auto res = isl_aff_add_constant_val(copy(), v.release());
   return manage(res);
 }
 
-isl::aff aff::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::aff aff::align_params(isl::space model) const
+aff aff::align_params(space model) const
 {
   auto res = isl_aff_align_params(copy(), model.release());
   return manage(res);
 }
 
-isl::aff aff::ceil() const
+aff aff::ceil() const
 {
   auto res = isl_aff_ceil(copy());
   return manage(res);
@@ -3966,31 +3966,31 @@
   return res;
 }
 
-isl::aff aff::div(isl::aff aff2) const
+aff aff::div(aff aff2) const
 {
   auto res = isl_aff_div(copy(), aff2.release());
   return manage(res);
 }
 
-isl::aff aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_set aff::eq_basic_set(isl::aff aff2) const
+basic_set aff::eq_basic_set(aff aff2) const
 {
   auto res = isl_aff_eq_basic_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::set aff::eq_set(isl::aff aff2) const
+set aff::eq_set(aff aff2) const
 {
   auto res = isl_aff_eq_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::val aff::eval(isl::point pnt) const
+val aff::eval(point pnt) const
 {
   auto res = isl_aff_eval(copy(), pnt.release());
   return manage(res);
@@ -4002,43 +4002,43 @@
   return res;
 }
 
-isl::aff aff::floor() const
+aff aff::floor() const
 {
   auto res = isl_aff_floor(copy());
   return manage(res);
 }
 
-isl::aff aff::from_range() const
+aff aff::from_range() const
 {
   auto res = isl_aff_from_range(copy());
   return manage(res);
 }
 
-isl::basic_set aff::ge_basic_set(isl::aff aff2) const
+basic_set aff::ge_basic_set(aff aff2) const
 {
   auto res = isl_aff_ge_basic_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::set aff::ge_set(isl::aff aff2) const
+set aff::ge_set(aff aff2) const
 {
   auto res = isl_aff_ge_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::val aff::get_coefficient_val(isl::dim type, int pos) const
+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);
 }
 
-isl::val aff::get_constant_val() const
+val aff::get_constant_val() const
 {
   auto res = isl_aff_get_constant_val(get());
   return manage(res);
 }
 
-isl::val aff::get_denominator_val() const
+val aff::get_denominator_val() const
 {
   auto res = isl_aff_get_denominator_val(get());
   return manage(res);
@@ -4051,19 +4051,19 @@
   return tmp;
 }
 
-isl::aff aff::get_div(int pos) const
+aff aff::get_div(int pos) const
 {
   auto res = isl_aff_get_div(get(), pos);
   return manage(res);
 }
 
-isl::local_space aff::get_domain_local_space() const
+local_space aff::get_domain_local_space() const
 {
   auto res = isl_aff_get_domain_local_space(get());
   return manage(res);
 }
 
-isl::space aff::get_domain_space() const
+space aff::get_domain_space() const
 {
   auto res = isl_aff_get_domain_space(get());
   return manage(res);
@@ -4075,245 +4075,245 @@
   return res;
 }
 
-isl::local_space aff::get_local_space() const
+local_space aff::get_local_space() const
 {
   auto res = isl_aff_get_local_space(get());
   return manage(res);
 }
 
-isl::space aff::get_space() const
+space aff::get_space() const
 {
   auto res = isl_aff_get_space(get());
   return manage(res);
 }
 
-isl::aff aff::gist(isl::set context) const
+aff aff::gist(set context) const
 {
   auto res = isl_aff_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::aff aff::gist_params(isl::set context) const
+aff aff::gist_params(set context) const
 {
   auto res = isl_aff_gist_params(copy(), context.release());
   return manage(res);
 }
 
-isl::basic_set aff::gt_basic_set(isl::aff aff2) const
+basic_set aff::gt_basic_set(aff aff2) const
 {
   auto res = isl_aff_gt_basic_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::set aff::gt_set(isl::aff aff2) const
+set aff::gt_set(aff aff2) const
 {
   auto res = isl_aff_gt_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::aff aff::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean aff::is_cst() const
+boolean aff::is_cst() const
 {
   auto res = isl_aff_is_cst(get());
   return manage(res);
 }
 
-isl::boolean aff::is_nan() const
+boolean aff::is_nan() const
 {
   auto res = isl_aff_is_nan(get());
   return manage(res);
 }
 
-isl::basic_set aff::le_basic_set(isl::aff aff2) const
+basic_set aff::le_basic_set(aff aff2) const
 {
   auto res = isl_aff_le_basic_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::set aff::le_set(isl::aff aff2) const
+set aff::le_set(aff aff2) const
 {
   auto res = isl_aff_le_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::basic_set aff::lt_basic_set(isl::aff aff2) const
+basic_set aff::lt_basic_set(aff aff2) const
 {
   auto res = isl_aff_lt_basic_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::set aff::lt_set(isl::aff aff2) const
+set aff::lt_set(aff aff2) const
 {
   auto res = isl_aff_lt_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::aff aff::mod(isl::val mod) const
+aff aff::mod(val mod) const
 {
   auto res = isl_aff_mod_val(copy(), mod.release());
   return manage(res);
 }
 
-isl::aff aff::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
+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);
 }
 
-isl::aff aff::mul(isl::aff aff2) const
+aff aff::mul(aff aff2) const
 {
   auto res = isl_aff_mul(copy(), aff2.release());
   return manage(res);
 }
 
-isl::aff aff::nan_on_domain(isl::local_space ls)
+aff aff::nan_on_domain(local_space ls)
 {
   auto res = isl_aff_nan_on_domain(ls.release());
   return manage(res);
 }
 
-isl::set aff::ne_set(isl::aff aff2) const
+set aff::ne_set(aff aff2) const
 {
   auto res = isl_aff_ne_set(copy(), aff2.release());
   return manage(res);
 }
 
-isl::aff aff::neg() const
+aff aff::neg() const
 {
   auto res = isl_aff_neg(copy());
   return manage(res);
 }
 
-isl::basic_set aff::neg_basic_set() const
+basic_set aff::neg_basic_set() const
 {
   auto res = isl_aff_neg_basic_set(copy());
   return manage(res);
 }
 
-isl::aff aff::param_on_domain_space_id(isl::space space, isl::id id)
+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);
 }
 
-isl::boolean aff::plain_is_equal(const isl::aff &aff2) const
+boolean aff::plain_is_equal(const aff &aff2) const
 {
   auto res = isl_aff_plain_is_equal(get(), aff2.get());
   return manage(res);
 }
 
-isl::boolean aff::plain_is_zero() const
+boolean aff::plain_is_zero() const
 {
   auto res = isl_aff_plain_is_zero(get());
   return manage(res);
 }
 
-isl::aff aff::project_domain_on_params() const
+aff aff::project_domain_on_params() const
 {
   auto res = isl_aff_project_domain_on_params(copy());
   return manage(res);
 }
 
-isl::aff aff::pullback(isl::multi_aff ma) const
+aff aff::pullback(multi_aff ma) const
 {
   auto res = isl_aff_pullback_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-isl::aff aff::pullback_aff(isl::aff aff2) const
+aff aff::pullback_aff(aff aff2) const
 {
   auto res = isl_aff_pullback_aff(copy(), aff2.release());
   return manage(res);
 }
 
-isl::aff aff::scale(isl::val v) const
+aff aff::scale(val v) const
 {
   auto res = isl_aff_scale_val(copy(), v.release());
   return manage(res);
 }
 
-isl::aff aff::scale_down(isl::val v) const
+aff aff::scale_down(val v) const
 {
   auto res = isl_aff_scale_down_val(copy(), v.release());
   return manage(res);
 }
 
-isl::aff aff::scale_down_ui(unsigned int f) const
+aff aff::scale_down_ui(unsigned int f) const
 {
   auto res = isl_aff_scale_down_ui(copy(), f);
   return manage(res);
 }
 
-isl::aff aff::set_coefficient_si(isl::dim type, int pos, int v) const
+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);
 }
 
-isl::aff aff::set_coefficient_val(isl::dim type, int pos, isl::val v) const
+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);
 }
 
-isl::aff aff::set_constant_si(int v) const
+aff aff::set_constant_si(int v) const
 {
   auto res = isl_aff_set_constant_si(copy(), v);
   return manage(res);
 }
 
-isl::aff aff::set_constant_val(isl::val v) const
+aff aff::set_constant_val(val v) const
 {
   auto res = isl_aff_set_constant_val(copy(), v.release());
   return manage(res);
 }
 
-isl::aff aff::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::aff aff::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::aff aff::sub(isl::aff aff2) const
+aff aff::sub(aff aff2) const
 {
   auto res = isl_aff_sub(copy(), aff2.release());
   return manage(res);
 }
 
-isl::aff aff::var_on_domain(isl::local_space ls, isl::dim type, unsigned int pos)
+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);
 }
 
-isl::basic_set aff::zero_basic_set() const
+basic_set aff::zero_basic_set() const
 {
   auto res = isl_aff_zero_basic_set(copy());
   return manage(res);
 }
 
 // implementations for isl::aff_list
-isl::aff_list manage(__isl_take isl_aff_list *ptr) {
+aff_list manage(__isl_take isl_aff_list *ptr) {
   return aff_list(ptr);
 }
-isl::aff_list manage_copy(__isl_keep isl_aff_list *ptr) {
+aff_list manage_copy(__isl_keep isl_aff_list *ptr) {
   ptr = isl_aff_list_copy(ptr);
   return aff_list(ptr);
 }
@@ -4321,7 +4321,7 @@
 aff_list::aff_list()
     : ptr(nullptr) {}
 
-aff_list::aff_list(const isl::aff_list &obj)
+aff_list::aff_list(const aff_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -4334,7 +4334,7 @@
     : ptr(ptr) {}
 
 
-aff_list &aff_list::operator=(isl::aff_list obj) {
+aff_list &aff_list::operator=(aff_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -4366,8 +4366,8 @@
 }
 
 
-isl::ctx aff_list::get_ctx() const {
-  return isl::ctx(isl_aff_list_get_ctx(ptr));
+ctx aff_list::get_ctx() const {
+  return ctx(isl_aff_list_get_ctx(ptr));
 }
 
 void aff_list::dump() const {
@@ -4375,63 +4375,63 @@
 }
 
 
-isl::aff_list aff_list::add(isl::aff el) const
+aff_list aff_list::add(aff el) const
 {
   auto res = isl_aff_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::aff_list aff_list::alloc(isl::ctx ctx, int n)
+aff_list aff_list::alloc(ctx ctx, int n)
 {
   auto res = isl_aff_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::aff_list aff_list::concat(isl::aff_list list2) const
+aff_list aff_list::concat(aff_list list2) const
 {
   auto res = isl_aff_list_concat(copy(), list2.release());
   return manage(res);
 }
 
-isl::aff_list aff_list::drop(unsigned int first, unsigned int n) const
+aff_list aff_list::drop(unsigned int first, unsigned int n) const
 {
   auto res = isl_aff_list_drop(copy(), first, n);
   return manage(res);
 }
 
-isl::stat aff_list::foreach(const std::function<isl::stat(isl::aff)> &fn) const
+stat aff_list::foreach(const std::function<stat(aff)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::aff)> *func;
+    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)(isl::manage(arg_0));
+    stat ret = (*data->func)(manage(arg_0));
     return ret.release();
   };
   auto res = isl_aff_list_foreach(get(), fn_lambda, &fn_data);
   return manage(res);
 }
 
-isl::aff_list aff_list::from_aff(isl::aff el)
+aff_list aff_list::from_aff(aff el)
 {
   auto res = isl_aff_list_from_aff(el.release());
   return manage(res);
 }
 
-isl::aff aff_list::get_aff(int index) const
+aff aff_list::get_aff(int index) const
 {
   auto res = isl_aff_list_get_aff(get(), index);
   return manage(res);
 }
 
-isl::aff aff_list::get_at(int index) const
+aff aff_list::get_at(int index) const
 {
   auto res = isl_aff_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::aff_list aff_list::insert(unsigned int pos, isl::aff el) const
+aff_list aff_list::insert(unsigned int pos, aff el) const
 {
   auto res = isl_aff_list_insert(copy(), pos, el.release());
   return manage(res);
@@ -4443,13 +4443,13 @@
   return res;
 }
 
-isl::aff_list aff_list::reverse() const
+aff_list aff_list::reverse() const
 {
   auto res = isl_aff_list_reverse(copy());
   return manage(res);
 }
 
-isl::aff_list aff_list::set_aff(int index, isl::aff el) const
+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);
@@ -4461,17 +4461,17 @@
   return res;
 }
 
-isl::aff_list aff_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::ast_build manage(__isl_take isl_ast_build *ptr) {
+ast_build manage(__isl_take isl_ast_build *ptr) {
   return ast_build(ptr);
 }
-isl::ast_build manage_copy(__isl_keep isl_ast_build *ptr) {
+ast_build manage_copy(__isl_keep isl_ast_build *ptr) {
   ptr = isl_ast_build_copy(ptr);
   return ast_build(ptr);
 }
@@ -4479,7 +4479,7 @@
 ast_build::ast_build()
     : ptr(nullptr) {}
 
-ast_build::ast_build(const isl::ast_build &obj)
+ast_build::ast_build(const ast_build &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -4491,13 +4491,13 @@
 ast_build::ast_build(__isl_take isl_ast_build *ptr)
     : ptr(ptr) {}
 
-ast_build::ast_build(isl::ctx ctx)
+ast_build::ast_build(ctx ctx)
 {
   auto res = isl_ast_build_alloc(ctx.release());
   ptr = res;
 }
 
-ast_build &ast_build::operator=(isl::ast_build obj) {
+ast_build &ast_build::operator=(ast_build obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -4529,94 +4529,94 @@
 }
 
 
-isl::ctx ast_build::get_ctx() const {
-  return isl::ctx(isl_ast_build_get_ctx(ptr));
+ctx ast_build::get_ctx() const {
+  return ctx(isl_ast_build_get_ctx(ptr));
 }
 
 
-isl::ast_expr ast_build::access_from(isl::pw_multi_aff pma) const
+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);
 }
 
-isl::ast_expr ast_build::access_from(isl::multi_pw_aff mpa) const
+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);
 }
 
-isl::ast_node ast_build::ast_from_schedule(isl::union_map schedule) const
+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);
 }
 
-isl::ast_expr ast_build::call_from(isl::pw_multi_aff pma) const
+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);
 }
 
-isl::ast_expr ast_build::call_from(isl::multi_pw_aff mpa) const
+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);
 }
 
-isl::ast_expr ast_build::expr_from(isl::set set) const
+ast_expr ast_build::expr_from(set set) const
 {
   auto res = isl_ast_build_expr_from_set(get(), set.release());
   return manage(res);
 }
 
-isl::ast_expr ast_build::expr_from(isl::pw_aff pa) const
+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);
 }
 
-isl::ast_build ast_build::from_context(isl::set set)
+ast_build ast_build::from_context(set set)
 {
   auto res = isl_ast_build_from_context(set.release());
   return manage(res);
 }
 
-isl::union_map ast_build::get_schedule() const
+union_map ast_build::get_schedule() const
 {
   auto res = isl_ast_build_get_schedule(get());
   return manage(res);
 }
 
-isl::space ast_build::get_schedule_space() const
+space ast_build::get_schedule_space() const
 {
   auto res = isl_ast_build_get_schedule_space(get());
   return manage(res);
 }
 
-isl::ast_node ast_build::node_from_schedule(isl::schedule schedule) const
+ast_node ast_build::node_from_schedule(schedule schedule) const
 {
   auto res = isl_ast_build_node_from_schedule(get(), schedule.release());
   return manage(res);
 }
 
-isl::ast_node ast_build::node_from_schedule_map(isl::union_map schedule) const
+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);
 }
 
-isl::ast_build ast_build::restrict(isl::set set) const
+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
-isl::ast_expr manage(__isl_take isl_ast_expr *ptr) {
+ast_expr manage(__isl_take isl_ast_expr *ptr) {
   return ast_expr(ptr);
 }
-isl::ast_expr manage_copy(__isl_keep isl_ast_expr *ptr) {
+ast_expr manage_copy(__isl_keep isl_ast_expr *ptr) {
   ptr = isl_ast_expr_copy(ptr);
   return ast_expr(ptr);
 }
@@ -4624,7 +4624,7 @@
 ast_expr::ast_expr()
     : ptr(nullptr) {}
 
-ast_expr::ast_expr(const isl::ast_expr &obj)
+ast_expr::ast_expr(const ast_expr &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -4637,7 +4637,7 @@
     : ptr(ptr) {}
 
 
-ast_expr &ast_expr::operator=(isl::ast_expr obj) {
+ast_expr &ast_expr::operator=(ast_expr obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -4669,8 +4669,8 @@
 }
 
 
-isl::ctx ast_expr::get_ctx() const {
-  return isl::ctx(isl_ast_expr_get_ctx(ptr));
+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());
@@ -4687,67 +4687,67 @@
 }
 
 
-isl::ast_expr ast_expr::access(isl::ast_expr_list indices) const
+ast_expr ast_expr::access(ast_expr_list indices) const
 {
   auto res = isl_ast_expr_access(copy(), indices.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::add(isl::ast_expr expr2) const
+ast_expr ast_expr::add(ast_expr expr2) const
 {
   auto res = isl_ast_expr_add(copy(), expr2.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::address_of() const
+ast_expr ast_expr::address_of() const
 {
   auto res = isl_ast_expr_address_of(copy());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::call(isl::ast_expr_list arguments) const
+ast_expr ast_expr::call(ast_expr_list arguments) const
 {
   auto res = isl_ast_expr_call(copy(), arguments.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::div(isl::ast_expr expr2) const
+ast_expr ast_expr::div(ast_expr expr2) const
 {
   auto res = isl_ast_expr_div(copy(), expr2.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::eq(isl::ast_expr expr2) const
+ast_expr ast_expr::eq(ast_expr expr2) const
 {
   auto res = isl_ast_expr_eq(copy(), expr2.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::from_id(isl::id id)
+ast_expr ast_expr::from_id(id id)
 {
   auto res = isl_ast_expr_from_id(id.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::from_val(isl::val v)
+ast_expr ast_expr::from_val(val v)
 {
   auto res = isl_ast_expr_from_val(v.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::ge(isl::ast_expr expr2) const
+ast_expr ast_expr::ge(ast_expr expr2) const
 {
   auto res = isl_ast_expr_ge(copy(), expr2.release());
   return manage(res);
 }
 
-isl::id ast_expr::get_id() const
+id ast_expr::get_id() const
 {
   auto res = isl_ast_expr_get_id(get());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::get_op_arg(int pos) const
+ast_expr ast_expr::get_op_arg(int pos) const
 {
   auto res = isl_ast_expr_get_op_arg(get(), pos);
   return manage(res);
@@ -4759,73 +4759,73 @@
   return res;
 }
 
-isl::val ast_expr::get_val() const
+val ast_expr::get_val() const
 {
   auto res = isl_ast_expr_get_val(get());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::gt(isl::ast_expr expr2) const
+ast_expr ast_expr::gt(ast_expr expr2) const
 {
   auto res = isl_ast_expr_gt(copy(), expr2.release());
   return manage(res);
 }
 
-isl::boolean ast_expr::is_equal(const isl::ast_expr &expr2) const
+boolean ast_expr::is_equal(const ast_expr &expr2) const
 {
   auto res = isl_ast_expr_is_equal(get(), expr2.get());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::le(isl::ast_expr expr2) const
+ast_expr ast_expr::le(ast_expr expr2) const
 {
   auto res = isl_ast_expr_le(copy(), expr2.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::lt(isl::ast_expr expr2) const
+ast_expr ast_expr::lt(ast_expr expr2) const
 {
   auto res = isl_ast_expr_lt(copy(), expr2.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::mul(isl::ast_expr expr2) const
+ast_expr ast_expr::mul(ast_expr expr2) const
 {
   auto res = isl_ast_expr_mul(copy(), expr2.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::neg() const
+ast_expr ast_expr::neg() const
 {
   auto res = isl_ast_expr_neg(copy());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::pdiv_q(isl::ast_expr expr2) const
+ast_expr ast_expr::pdiv_q(ast_expr expr2) const
 {
   auto res = isl_ast_expr_pdiv_q(copy(), expr2.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::pdiv_r(isl::ast_expr expr2) const
+ast_expr ast_expr::pdiv_r(ast_expr expr2) const
 {
   auto res = isl_ast_expr_pdiv_r(copy(), expr2.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::set_op_arg(int pos, isl::ast_expr arg) const
+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);
 }
 
-isl::ast_expr ast_expr::sub(isl::ast_expr expr2) const
+ast_expr ast_expr::sub(ast_expr expr2) const
 {
   auto res = isl_ast_expr_sub(copy(), expr2.release());
   return manage(res);
 }
 
-isl::ast_expr ast_expr::substitute_ids(isl::id_to_ast_expr id2expr) const
+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);
@@ -4840,10 +4840,10 @@
 }
 
 // implementations for isl::ast_expr_list
-isl::ast_expr_list manage(__isl_take isl_ast_expr_list *ptr) {
+ast_expr_list manage(__isl_take isl_ast_expr_list *ptr) {
   return ast_expr_list(ptr);
 }
-isl::ast_expr_list manage_copy(__isl_keep isl_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);
 }
@@ -4851,7 +4851,7 @@
 ast_expr_list::ast_expr_list()
     : ptr(nullptr) {}
 
-ast_expr_list::ast_expr_list(const isl::ast_expr_list &obj)
+ast_expr_list::ast_expr_list(const ast_expr_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -4864,7 +4864,7 @@
     : ptr(ptr) {}
 
 
-ast_expr_list &ast_expr_list::operator=(isl::ast_expr_list obj) {
+ast_expr_list &ast_expr_list::operator=(ast_expr_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -4896,8 +4896,8 @@
 }
 
 
-isl::ctx ast_expr_list::get_ctx() const {
-  return isl::ctx(isl_ast_expr_list_get_ctx(ptr));
+ctx ast_expr_list::get_ctx() const {
+  return ctx(isl_ast_expr_list_get_ctx(ptr));
 }
 
 void ast_expr_list::dump() const {
@@ -4905,63 +4905,63 @@
 }
 
 
-isl::ast_expr_list ast_expr_list::add(isl::ast_expr el) const
+ast_expr_list ast_expr_list::add(ast_expr el) const
 {
   auto res = isl_ast_expr_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::ast_expr_list ast_expr_list::alloc(isl::ctx ctx, int n)
+ast_expr_list ast_expr_list::alloc(ctx ctx, int n)
 {
   auto res = isl_ast_expr_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::ast_expr_list ast_expr_list::concat(isl::ast_expr_list list2) const
+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);
 }
 
-isl::ast_expr_list ast_expr_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::stat ast_expr_list::foreach(const std::function<isl::stat(isl::ast_expr)> &fn) const
+stat ast_expr_list::foreach(const std::function<stat(ast_expr)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::ast_expr)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::ast_expr_list ast_expr_list::from_ast_expr(isl::ast_expr el)
+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);
 }
 
-isl::ast_expr ast_expr_list::get_ast_expr(int index) const
+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);
 }
 
-isl::ast_expr ast_expr_list::get_at(int index) const
+ast_expr ast_expr_list::get_at(int index) const
 {
   auto res = isl_ast_expr_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::ast_expr_list ast_expr_list::insert(unsigned int pos, isl::ast_expr el) const
+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);
@@ -4973,13 +4973,13 @@
   return res;
 }
 
-isl::ast_expr_list ast_expr_list::reverse() const
+ast_expr_list ast_expr_list::reverse() const
 {
   auto res = isl_ast_expr_list_reverse(copy());
   return manage(res);
 }
 
-isl::ast_expr_list ast_expr_list::set_ast_expr(int index, isl::ast_expr el) const
+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);
@@ -4991,17 +4991,17 @@
   return res;
 }
 
-isl::ast_expr_list ast_expr_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::ast_node manage(__isl_take isl_ast_node *ptr) {
+ast_node manage(__isl_take isl_ast_node *ptr) {
   return ast_node(ptr);
 }
-isl::ast_node manage_copy(__isl_keep isl_ast_node *ptr) {
+ast_node manage_copy(__isl_keep isl_ast_node *ptr) {
   ptr = isl_ast_node_copy(ptr);
   return ast_node(ptr);
 }
@@ -5009,7 +5009,7 @@
 ast_node::ast_node()
     : ptr(nullptr) {}
 
-ast_node::ast_node(const isl::ast_node &obj)
+ast_node::ast_node(const ast_node &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -5022,7 +5022,7 @@
     : ptr(ptr) {}
 
 
-ast_node &ast_node::operator=(isl::ast_node obj) {
+ast_node &ast_node::operator=(ast_node obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -5054,8 +5054,8 @@
 }
 
 
-isl::ctx ast_node::get_ctx() const {
-  return isl::ctx(isl_ast_node_get_ctx(ptr));
+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());
@@ -5072,97 +5072,97 @@
 }
 
 
-isl::ast_node ast_node::alloc_user(isl::ast_expr expr)
+ast_node ast_node::alloc_user(ast_expr expr)
 {
   auto res = isl_ast_node_alloc_user(expr.release());
   return manage(res);
 }
 
-isl::ast_node_list ast_node::block_get_children() const
+ast_node_list ast_node::block_get_children() const
 {
   auto res = isl_ast_node_block_get_children(get());
   return manage(res);
 }
 
-isl::ast_node ast_node::for_get_body() const
+ast_node ast_node::for_get_body() const
 {
   auto res = isl_ast_node_for_get_body(get());
   return manage(res);
 }
 
-isl::ast_expr ast_node::for_get_cond() const
+ast_expr ast_node::for_get_cond() const
 {
   auto res = isl_ast_node_for_get_cond(get());
   return manage(res);
 }
 
-isl::ast_expr ast_node::for_get_inc() const
+ast_expr ast_node::for_get_inc() const
 {
   auto res = isl_ast_node_for_get_inc(get());
   return manage(res);
 }
 
-isl::ast_expr ast_node::for_get_init() const
+ast_expr ast_node::for_get_init() const
 {
   auto res = isl_ast_node_for_get_init(get());
   return manage(res);
 }
 
-isl::ast_expr ast_node::for_get_iterator() const
+ast_expr ast_node::for_get_iterator() const
 {
   auto res = isl_ast_node_for_get_iterator(get());
   return manage(res);
 }
 
-isl::boolean ast_node::for_is_degenerate() const
+boolean ast_node::for_is_degenerate() const
 {
   auto res = isl_ast_node_for_is_degenerate(get());
   return manage(res);
 }
 
-isl::id ast_node::get_annotation() const
+id ast_node::get_annotation() const
 {
   auto res = isl_ast_node_get_annotation(get());
   return manage(res);
 }
 
-isl::ast_expr ast_node::if_get_cond() const
+ast_expr ast_node::if_get_cond() const
 {
   auto res = isl_ast_node_if_get_cond(get());
   return manage(res);
 }
 
-isl::ast_node ast_node::if_get_else() const
+ast_node ast_node::if_get_else() const
 {
   auto res = isl_ast_node_if_get_else(get());
   return manage(res);
 }
 
-isl::ast_node ast_node::if_get_then() const
+ast_node ast_node::if_get_then() const
 {
   auto res = isl_ast_node_if_get_then(get());
   return manage(res);
 }
 
-isl::boolean ast_node::if_has_else() const
+boolean ast_node::if_has_else() const
 {
   auto res = isl_ast_node_if_has_else(get());
   return manage(res);
 }
 
-isl::id ast_node::mark_get_id() const
+id ast_node::mark_get_id() const
 {
   auto res = isl_ast_node_mark_get_id(get());
   return manage(res);
 }
 
-isl::ast_node ast_node::mark_get_node() const
+ast_node ast_node::mark_get_node() const
 {
   auto res = isl_ast_node_mark_get_node(get());
   return manage(res);
 }
 
-isl::ast_node ast_node::set_annotation(isl::id annotation) const
+ast_node ast_node::set_annotation(id annotation) const
 {
   auto res = isl_ast_node_set_annotation(copy(), annotation.release());
   return manage(res);
@@ -5176,17 +5176,17 @@
   return tmp;
 }
 
-isl::ast_expr ast_node::user_get_expr() const
+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
-isl::ast_node_list manage(__isl_take isl_ast_node_list *ptr) {
+ast_node_list manage(__isl_take isl_ast_node_list *ptr) {
   return ast_node_list(ptr);
 }
-isl::ast_node_list manage_copy(__isl_keep isl_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);
 }
@@ -5194,7 +5194,7 @@
 ast_node_list::ast_node_list()
     : ptr(nullptr) {}
 
-ast_node_list::ast_node_list(const isl::ast_node_list &obj)
+ast_node_list::ast_node_list(const ast_node_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -5207,7 +5207,7 @@
     : ptr(ptr) {}
 
 
-ast_node_list &ast_node_list::operator=(isl::ast_node_list obj) {
+ast_node_list &ast_node_list::operator=(ast_node_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -5239,8 +5239,8 @@
 }
 
 
-isl::ctx ast_node_list::get_ctx() const {
-  return isl::ctx(isl_ast_node_list_get_ctx(ptr));
+ctx ast_node_list::get_ctx() const {
+  return ctx(isl_ast_node_list_get_ctx(ptr));
 }
 
 void ast_node_list::dump() const {
@@ -5248,63 +5248,63 @@
 }
 
 
-isl::ast_node_list ast_node_list::add(isl::ast_node el) const
+ast_node_list ast_node_list::add(ast_node el) const
 {
   auto res = isl_ast_node_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::ast_node_list ast_node_list::alloc(isl::ctx ctx, int n)
+ast_node_list ast_node_list::alloc(ctx ctx, int n)
 {
   auto res = isl_ast_node_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::ast_node_list ast_node_list::concat(isl::ast_node_list list2) const
+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);
 }
 
-isl::ast_node_list ast_node_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::stat ast_node_list::foreach(const std::function<isl::stat(isl::ast_node)> &fn) const
+stat ast_node_list::foreach(const std::function<stat(ast_node)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::ast_node)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::ast_node_list ast_node_list::from_ast_node(isl::ast_node el)
+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);
 }
 
-isl::ast_node ast_node_list::get_ast_node(int index) const
+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);
 }
 
-isl::ast_node ast_node_list::get_at(int index) const
+ast_node ast_node_list::get_at(int index) const
 {
   auto res = isl_ast_node_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::ast_node_list ast_node_list::insert(unsigned int pos, isl::ast_node el) const
+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);
@@ -5316,13 +5316,13 @@
   return res;
 }
 
-isl::ast_node_list ast_node_list::reverse() const
+ast_node_list ast_node_list::reverse() const
 {
   auto res = isl_ast_node_list_reverse(copy());
   return manage(res);
 }
 
-isl::ast_node_list ast_node_list::set_ast_node(int index, isl::ast_node el) const
+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);
@@ -5334,17 +5334,17 @@
   return res;
 }
 
-isl::ast_node_list ast_node_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::basic_map manage(__isl_take isl_basic_map *ptr) {
+basic_map manage(__isl_take isl_basic_map *ptr) {
   return basic_map(ptr);
 }
-isl::basic_map manage_copy(__isl_keep isl_basic_map *ptr) {
+basic_map manage_copy(__isl_keep isl_basic_map *ptr) {
   ptr = isl_basic_map_copy(ptr);
   return basic_map(ptr);
 }
@@ -5352,7 +5352,7 @@
 basic_map::basic_map()
     : ptr(nullptr) {}
 
-basic_map::basic_map(const isl::basic_map &obj)
+basic_map::basic_map(const basic_map &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -5364,13 +5364,13 @@
 basic_map::basic_map(__isl_take isl_basic_map *ptr)
     : ptr(ptr) {}
 
-basic_map::basic_map(isl::ctx ctx, const std::string &str)
+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=(isl::basic_map obj) {
+basic_map &basic_map::operator=(basic_map obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -5402,8 +5402,8 @@
 }
 
 
-isl::ctx basic_map::get_ctx() const {
-  return isl::ctx(isl_basic_map_get_ctx(ptr));
+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());
@@ -5420,79 +5420,79 @@
 }
 
 
-isl::basic_map basic_map::add_constraint(isl::constraint constraint) const
+basic_map basic_map::add_constraint(constraint constraint) const
 {
   auto res = isl_basic_map_add_constraint(copy(), constraint.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::basic_map basic_map::affine_hull() const
+basic_map basic_map::affine_hull() const
 {
   auto res = isl_basic_map_affine_hull(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::align_params(isl::space model) const
+basic_map basic_map::align_params(space model) const
 {
   auto res = isl_basic_map_align_params(copy(), model.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::apply_domain(isl::basic_map bmap2) const
+basic_map basic_map::apply_domain(basic_map bmap2) const
 {
   auto res = isl_basic_map_apply_domain(copy(), bmap2.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::apply_range(isl::basic_map bmap2) const
+basic_map basic_map::apply_range(basic_map bmap2) const
 {
   auto res = isl_basic_map_apply_range(copy(), bmap2.release());
   return manage(res);
 }
 
-isl::boolean basic_map::can_curry() const
+boolean basic_map::can_curry() const
 {
   auto res = isl_basic_map_can_curry(get());
   return manage(res);
 }
 
-isl::boolean basic_map::can_uncurry() const
+boolean basic_map::can_uncurry() const
 {
   auto res = isl_basic_map_can_uncurry(get());
   return manage(res);
 }
 
-isl::boolean basic_map::can_zip() const
+boolean basic_map::can_zip() const
 {
   auto res = isl_basic_map_can_zip(get());
   return manage(res);
 }
 
-isl::basic_map basic_map::curry() const
+basic_map basic_map::curry() const
 {
   auto res = isl_basic_map_curry(copy());
   return manage(res);
 }
 
-isl::basic_set basic_map::deltas() const
+basic_set basic_map::deltas() const
 {
   auto res = isl_basic_map_deltas(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::deltas_map() const
+basic_map basic_map::deltas_map() const
 {
   auto res = isl_basic_map_deltas_map(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::detect_equalities() const
+basic_map basic_map::detect_equalities() const
 {
   auto res = isl_basic_map_detect_equalities(copy());
   return manage(res);
@@ -5504,67 +5504,67 @@
   return res;
 }
 
-isl::basic_set basic_map::domain() const
+basic_set basic_map::domain() const
 {
   auto res = isl_basic_map_domain(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::domain_map() const
+basic_map basic_map::domain_map() const
 {
   auto res = isl_basic_map_domain_map(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::domain_product(isl::basic_map bmap2) const
+basic_map basic_map::domain_product(basic_map bmap2) const
 {
   auto res = isl_basic_map_domain_product(copy(), bmap2.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_map basic_map::drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_map basic_map::drop_unused_params() const
+basic_map basic_map::drop_unused_params() const
 {
   auto res = isl_basic_map_drop_unused_params(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::eliminate(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_map basic_map::empty(isl::space space)
+basic_map basic_map::empty(space space)
 {
   auto res = isl_basic_map_empty(space.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::equal(isl::space dim, unsigned int n_equal)
+basic_map basic_map::equal(space dim, unsigned int n_equal)
 {
   auto res = isl_basic_map_equal(dim.release(), n_equal);
   return manage(res);
 }
 
-isl::mat basic_map::equalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4, isl::dim c5) const
+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);
 }
 
-isl::basic_map basic_map::equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const
+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);
@@ -5576,111 +5576,111 @@
   return res;
 }
 
-isl::basic_map basic_map::fix_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::basic_map basic_map::fix_val(isl::dim type, unsigned int pos, isl::val v) const
+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);
 }
 
-isl::basic_map basic_map::flat_product(isl::basic_map bmap2) const
+basic_map basic_map::flat_product(basic_map bmap2) const
 {
   auto res = isl_basic_map_flat_product(copy(), bmap2.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::flat_range_product(isl::basic_map bmap2) const
+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);
 }
 
-isl::basic_map basic_map::flatten() const
+basic_map basic_map::flatten() const
 {
   auto res = isl_basic_map_flatten(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::flatten_domain() const
+basic_map basic_map::flatten_domain() const
 {
   auto res = isl_basic_map_flatten_domain(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::flatten_range() const
+basic_map basic_map::flatten_range() const
 {
   auto res = isl_basic_map_flatten_range(copy());
   return manage(res);
 }
 
-isl::stat basic_map::foreach_constraint(const std::function<isl::stat(isl::constraint)> &fn) const
+stat basic_map::foreach_constraint(const std::function<stat(constraint)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::constraint)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::basic_map basic_map::from_aff(isl::aff aff)
+basic_map basic_map::from_aff(aff aff)
 {
   auto res = isl_basic_map_from_aff(aff.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::from_aff_list(isl::space domain_space, isl::aff_list list)
+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);
 }
 
-isl::basic_map basic_map::from_constraint(isl::constraint constraint)
+basic_map basic_map::from_constraint(constraint constraint)
 {
   auto res = isl_basic_map_from_constraint(constraint.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::from_domain(isl::basic_set bset)
+basic_map basic_map::from_domain(basic_set bset)
 {
   auto res = isl_basic_map_from_domain(bset.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::from_domain_and_range(isl::basic_set domain, isl::basic_set range)
+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);
 }
 
-isl::basic_map basic_map::from_multi_aff(isl::multi_aff maff)
+basic_map basic_map::from_multi_aff(multi_aff maff)
 {
   auto res = isl_basic_map_from_multi_aff(maff.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::from_qpolynomial(isl::qpolynomial qp)
+basic_map basic_map::from_qpolynomial(qpolynomial qp)
 {
   auto res = isl_basic_map_from_qpolynomial(qp.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::from_range(isl::basic_set bset)
+basic_map basic_map::from_range(basic_set bset)
 {
   auto res = isl_basic_map_from_range(bset.release());
   return manage(res);
 }
 
-isl::constraint_list basic_map::get_constraint_list() const
+constraint_list basic_map::get_constraint_list() const
 {
   auto res = isl_basic_map_get_constraint_list(get());
   return manage(res);
@@ -5693,19 +5693,19 @@
   return tmp;
 }
 
-isl::aff basic_map::get_div(int pos) const
+aff basic_map::get_div(int pos) const
 {
   auto res = isl_basic_map_get_div(get(), pos);
   return manage(res);
 }
 
-isl::local_space basic_map::get_local_space() const
+local_space basic_map::get_local_space() const
 {
   auto res = isl_basic_map_get_local_space(get());
   return manage(res);
 }
 
-isl::space basic_map::get_space() const
+space basic_map::get_space() const
 {
   auto res = isl_basic_map_get_space(get());
   return manage(res);
@@ -5718,157 +5718,157 @@
   return tmp;
 }
 
-isl::basic_map basic_map::gist(isl::basic_map context) const
+basic_map basic_map::gist(basic_map context) const
 {
   auto res = isl_basic_map_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::gist_domain(isl::basic_set context) const
+basic_map basic_map::gist_domain(basic_set context) const
 {
   auto res = isl_basic_map_gist_domain(copy(), context.release());
   return manage(res);
 }
 
-isl::boolean basic_map::has_dim_id(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::basic_map basic_map::identity(isl::space dim)
+basic_map basic_map::identity(space dim)
 {
   auto res = isl_basic_map_identity(dim.release());
   return manage(res);
 }
 
-isl::boolean basic_map::image_is_bounded() const
+boolean basic_map::image_is_bounded() const
 {
   auto res = isl_basic_map_image_is_bounded(get());
   return manage(res);
 }
 
-isl::mat basic_map::inequalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4, isl::dim c5) const
+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);
 }
 
-isl::basic_map basic_map::insert_dims(isl::dim type, unsigned int pos, unsigned int n) const
+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);
 }
 
-isl::basic_map basic_map::intersect(isl::basic_map bmap2) const
+basic_map basic_map::intersect(basic_map bmap2) const
 {
   auto res = isl_basic_map_intersect(copy(), bmap2.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::intersect_domain(isl::basic_set bset) const
+basic_map basic_map::intersect_domain(basic_set bset) const
 {
   auto res = isl_basic_map_intersect_domain(copy(), bset.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::intersect_range(isl::basic_set bset) const
+basic_map basic_map::intersect_range(basic_set bset) const
 {
   auto res = isl_basic_map_intersect_range(copy(), bset.release());
   return manage(res);
 }
 
-isl::boolean basic_map::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean basic_map::is_disjoint(const isl::basic_map &bmap2) const
+boolean basic_map::is_disjoint(const basic_map &bmap2) const
 {
   auto res = isl_basic_map_is_disjoint(get(), bmap2.get());
   return manage(res);
 }
 
-isl::boolean basic_map::is_empty() const
+boolean basic_map::is_empty() const
 {
   auto res = isl_basic_map_is_empty(get());
   return manage(res);
 }
 
-isl::boolean basic_map::is_equal(const isl::basic_map &bmap2) const
+boolean basic_map::is_equal(const basic_map &bmap2) const
 {
   auto res = isl_basic_map_is_equal(get(), bmap2.get());
   return manage(res);
 }
 
-isl::boolean basic_map::is_rational() const
+boolean basic_map::is_rational() const
 {
   auto res = isl_basic_map_is_rational(get());
   return manage(res);
 }
 
-isl::boolean basic_map::is_single_valued() const
+boolean basic_map::is_single_valued() const
 {
   auto res = isl_basic_map_is_single_valued(get());
   return manage(res);
 }
 
-isl::boolean basic_map::is_strict_subset(const isl::basic_map &bmap2) const
+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);
 }
 
-isl::boolean basic_map::is_subset(const isl::basic_map &bmap2) const
+boolean basic_map::is_subset(const basic_map &bmap2) const
 {
   auto res = isl_basic_map_is_subset(get(), bmap2.get());
   return manage(res);
 }
 
-isl::boolean basic_map::is_universe() const
+boolean basic_map::is_universe() const
 {
   auto res = isl_basic_map_is_universe(get());
   return manage(res);
 }
 
-isl::basic_map basic_map::less_at(isl::space dim, unsigned int pos)
+basic_map basic_map::less_at(space dim, unsigned int pos)
 {
   auto res = isl_basic_map_less_at(dim.release(), pos);
   return manage(res);
 }
 
-isl::map basic_map::lexmax() const
+map basic_map::lexmax() const
 {
   auto res = isl_basic_map_lexmax(copy());
   return manage(res);
 }
 
-isl::map basic_map::lexmin() const
+map basic_map::lexmin() const
 {
   auto res = isl_basic_map_lexmin(copy());
   return manage(res);
 }
 
-isl::pw_multi_aff basic_map::lexmin_pw_multi_aff() const
+pw_multi_aff basic_map::lexmin_pw_multi_aff() const
 {
   auto res = isl_basic_map_lexmin_pw_multi_aff(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::lower_bound_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::basic_map basic_map::more_at(isl::space dim, unsigned int pos)
+basic_map basic_map::more_at(space dim, unsigned int pos)
 {
   auto res = isl_basic_map_more_at(dim.release(), pos);
   return manage(res);
 }
 
-isl::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
+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);
@@ -5880,185 +5880,185 @@
   return res;
 }
 
-isl::basic_map basic_map::nat_universe(isl::space dim)
+basic_map basic_map::nat_universe(space dim)
 {
   auto res = isl_basic_map_nat_universe(dim.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::neg() const
+basic_map basic_map::neg() const
 {
   auto res = isl_basic_map_neg(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::order_ge(isl::dim type1, int pos1, isl::dim type2, int pos2) const
+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);
 }
 
-isl::basic_map basic_map::order_gt(isl::dim type1, int pos1, isl::dim type2, int pos2) const
+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);
 }
 
-isl::val basic_map::plain_get_val_if_fixed(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean basic_map::plain_is_empty() const
+boolean basic_map::plain_is_empty() const
 {
   auto res = isl_basic_map_plain_is_empty(get());
   return manage(res);
 }
 
-isl::boolean basic_map::plain_is_universe() const
+boolean basic_map::plain_is_universe() const
 {
   auto res = isl_basic_map_plain_is_universe(get());
   return manage(res);
 }
 
-isl::basic_map basic_map::preimage_domain_multi_aff(isl::multi_aff ma) const
+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);
 }
 
-isl::basic_map basic_map::preimage_range_multi_aff(isl::multi_aff ma) const
+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);
 }
 
-isl::basic_map basic_map::product(isl::basic_map bmap2) const
+basic_map basic_map::product(basic_map bmap2) const
 {
   auto res = isl_basic_map_product(copy(), bmap2.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::project_out(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_set basic_map::range() const
+basic_set basic_map::range() const
 {
   auto res = isl_basic_map_range(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::range_map() const
+basic_map basic_map::range_map() const
 {
   auto res = isl_basic_map_range_map(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::range_product(isl::basic_map bmap2) const
+basic_map basic_map::range_product(basic_map bmap2) const
 {
   auto res = isl_basic_map_range_product(copy(), bmap2.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::remove_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_map basic_map::remove_divs() const
+basic_map basic_map::remove_divs() const
 {
   auto res = isl_basic_map_remove_divs(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_map basic_map::remove_redundancies() const
+basic_map basic_map::remove_redundancies() const
 {
   auto res = isl_basic_map_remove_redundancies(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::reverse() const
+basic_map basic_map::reverse() const
 {
   auto res = isl_basic_map_reverse(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::sample() const
+basic_map basic_map::sample() const
 {
   auto res = isl_basic_map_sample(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::basic_map basic_map::set_tuple_name(isl::dim type, const std::string &s) const
+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);
 }
 
-isl::basic_map basic_map::sum(isl::basic_map bmap2) const
+basic_map basic_map::sum(basic_map bmap2) const
 {
   auto res = isl_basic_map_sum(copy(), bmap2.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::uncurry() const
+basic_map basic_map::uncurry() const
 {
   auto res = isl_basic_map_uncurry(copy());
   return manage(res);
 }
 
-isl::map basic_map::unite(isl::basic_map bmap2) const
+map basic_map::unite(basic_map bmap2) const
 {
   auto res = isl_basic_map_union(copy(), bmap2.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::universe(isl::space space)
+basic_map basic_map::universe(space space)
 {
   auto res = isl_basic_map_universe(space.release());
   return manage(res);
 }
 
-isl::basic_map basic_map::upper_bound_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::basic_set basic_map::wrap() const
+basic_set basic_map::wrap() const
 {
   auto res = isl_basic_map_wrap(copy());
   return manage(res);
 }
 
-isl::basic_map basic_map::zip() const
+basic_map basic_map::zip() const
 {
   auto res = isl_basic_map_zip(copy());
   return manage(res);
 }
 
 // implementations for isl::basic_map_list
-isl::basic_map_list manage(__isl_take isl_basic_map_list *ptr) {
+basic_map_list manage(__isl_take isl_basic_map_list *ptr) {
   return basic_map_list(ptr);
 }
-isl::basic_map_list manage_copy(__isl_keep isl_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);
 }
@@ -6066,7 +6066,7 @@
 basic_map_list::basic_map_list()
     : ptr(nullptr) {}
 
-basic_map_list::basic_map_list(const isl::basic_map_list &obj)
+basic_map_list::basic_map_list(const basic_map_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -6079,7 +6079,7 @@
     : ptr(ptr) {}
 
 
-basic_map_list &basic_map_list::operator=(isl::basic_map_list obj) {
+basic_map_list &basic_map_list::operator=(basic_map_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -6111,8 +6111,8 @@
 }
 
 
-isl::ctx basic_map_list::get_ctx() const {
-  return isl::ctx(isl_basic_map_list_get_ctx(ptr));
+ctx basic_map_list::get_ctx() const {
+  return ctx(isl_basic_map_list_get_ctx(ptr));
 }
 
 void basic_map_list::dump() const {
@@ -6120,63 +6120,63 @@
 }
 
 
-isl::basic_map_list basic_map_list::add(isl::basic_map el) const
+basic_map_list basic_map_list::add(basic_map el) const
 {
   auto res = isl_basic_map_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::basic_map_list basic_map_list::alloc(isl::ctx ctx, int n)
+basic_map_list basic_map_list::alloc(ctx ctx, int n)
 {
   auto res = isl_basic_map_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::basic_map_list basic_map_list::concat(isl::basic_map_list list2) const
+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);
 }
 
-isl::basic_map_list basic_map_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::stat basic_map_list::foreach(const std::function<isl::stat(isl::basic_map)> &fn) const
+stat basic_map_list::foreach(const std::function<stat(basic_map)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::basic_map)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::basic_map_list basic_map_list::from_basic_map(isl::basic_map el)
+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);
 }
 
-isl::basic_map basic_map_list::get_at(int index) const
+basic_map basic_map_list::get_at(int index) const
 {
   auto res = isl_basic_map_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::basic_map basic_map_list::get_basic_map(int index) const
+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);
 }
 
-isl::basic_map_list basic_map_list::insert(unsigned int pos, isl::basic_map el) const
+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);
@@ -6188,13 +6188,13 @@
   return res;
 }
 
-isl::basic_map_list basic_map_list::reverse() const
+basic_map_list basic_map_list::reverse() const
 {
   auto res = isl_basic_map_list_reverse(copy());
   return manage(res);
 }
 
-isl::basic_map_list basic_map_list::set_basic_map(int index, isl::basic_map el) const
+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);
@@ -6206,17 +6206,17 @@
   return res;
 }
 
-isl::basic_map_list basic_map_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::basic_set manage(__isl_take isl_basic_set *ptr) {
+basic_set manage(__isl_take isl_basic_set *ptr) {
   return basic_set(ptr);
 }
-isl::basic_set manage_copy(__isl_keep isl_basic_set *ptr) {
+basic_set manage_copy(__isl_keep isl_basic_set *ptr) {
   ptr = isl_basic_set_copy(ptr);
   return basic_set(ptr);
 }
@@ -6224,7 +6224,7 @@
 basic_set::basic_set()
     : ptr(nullptr) {}
 
-basic_set::basic_set(const isl::basic_set &obj)
+basic_set::basic_set(const basic_set &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -6236,18 +6236,18 @@
 basic_set::basic_set(__isl_take isl_basic_set *ptr)
     : ptr(ptr) {}
 
-basic_set::basic_set(isl::ctx ctx, const std::string &str)
+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(isl::point pnt)
+basic_set::basic_set(point pnt)
 {
   auto res = isl_basic_set_from_point(pnt.release());
   ptr = res;
 }
 
-basic_set &basic_set::operator=(isl::basic_set obj) {
+basic_set &basic_set::operator=(basic_set obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -6279,8 +6279,8 @@
 }
 
 
-isl::ctx basic_set::get_ctx() const {
-  return isl::ctx(isl_basic_set_get_ctx(ptr));
+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());
@@ -6297,37 +6297,37 @@
 }
 
 
-isl::basic_set basic_set::affine_hull() const
+basic_set basic_set::affine_hull() const
 {
   auto res = isl_basic_set_affine_hull(copy());
   return manage(res);
 }
 
-isl::basic_set basic_set::align_params(isl::space model) const
+basic_set basic_set::align_params(space model) const
 {
   auto res = isl_basic_set_align_params(copy(), model.release());
   return manage(res);
 }
 
-isl::basic_set basic_set::apply(isl::basic_map bmap) const
+basic_set basic_set::apply(basic_map bmap) const
 {
   auto res = isl_basic_set_apply(copy(), bmap.release());
   return manage(res);
 }
 
-isl::basic_set basic_set::box_from_points(isl::point pnt1, isl::point pnt2)
+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);
 }
 
-isl::basic_set basic_set::coefficients() const
+basic_set basic_set::coefficients() const
 {
   auto res = isl_basic_set_coefficients(copy());
   return manage(res);
 }
 
-isl::basic_set basic_set::detect_equalities() const
+basic_set basic_set::detect_equalities() const
 {
   auto res = isl_basic_set_detect_equalities(copy());
   return manage(res);
@@ -6339,125 +6339,125 @@
   return res;
 }
 
-isl::val basic_set::dim_max_val(int pos) const
+val basic_set::dim_max_val(int pos) const
 {
   auto res = isl_basic_set_dim_max_val(copy(), pos);
   return manage(res);
 }
 
-isl::basic_set basic_set::drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_set basic_set::drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_set basic_set::drop_unused_params() const
+basic_set basic_set::drop_unused_params() const
 {
   auto res = isl_basic_set_drop_unused_params(copy());
   return manage(res);
 }
 
-isl::basic_set basic_set::eliminate(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_set basic_set::empty(isl::space space)
+basic_set basic_set::empty(space space)
 {
   auto res = isl_basic_set_empty(space.release());
   return manage(res);
 }
 
-isl::mat basic_set::equalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4) const
+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);
 }
 
-isl::basic_set basic_set::fix_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::basic_set basic_set::fix_val(isl::dim type, unsigned int pos, isl::val v) const
+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);
 }
 
-isl::basic_set basic_set::flat_product(isl::basic_set bset2) const
+basic_set basic_set::flat_product(basic_set bset2) const
 {
   auto res = isl_basic_set_flat_product(copy(), bset2.release());
   return manage(res);
 }
 
-isl::basic_set basic_set::flatten() const
+basic_set basic_set::flatten() const
 {
   auto res = isl_basic_set_flatten(copy());
   return manage(res);
 }
 
-isl::stat basic_set::foreach_bound_pair(isl::dim type, unsigned int pos, const std::function<isl::stat(isl::constraint, isl::constraint, isl::basic_set)> &fn) const
+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<isl::stat(isl::constraint, isl::constraint, isl::basic_set)> *func;
+    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)(isl::manage(arg_0), isl::manage(arg_1), isl::manage(arg_2));
+    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);
 }
 
-isl::stat basic_set::foreach_constraint(const std::function<isl::stat(isl::constraint)> &fn) const
+stat basic_set::foreach_constraint(const std::function<stat(constraint)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::constraint)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::basic_set basic_set::from_constraint(isl::constraint constraint)
+basic_set basic_set::from_constraint(constraint constraint)
 {
   auto res = isl_basic_set_from_constraint(constraint.release());
   return manage(res);
 }
 
-isl::basic_set basic_set::from_multi_aff(isl::multi_aff ma)
+basic_set basic_set::from_multi_aff(multi_aff ma)
 {
   auto res = isl_basic_set_from_multi_aff(ma.release());
   return manage(res);
 }
 
-isl::basic_set basic_set::from_params() const
+basic_set basic_set::from_params() const
 {
   auto res = isl_basic_set_from_params(copy());
   return manage(res);
 }
 
-isl::constraint_list basic_set::get_constraint_list() const
+constraint_list basic_set::get_constraint_list() const
 {
   auto res = isl_basic_set_get_constraint_list(get());
   return manage(res);
 }
 
-isl::id basic_set::get_dim_id(isl::dim type, unsigned int pos) const
+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);
@@ -6470,19 +6470,19 @@
   return tmp;
 }
 
-isl::aff basic_set::get_div(int pos) const
+aff basic_set::get_div(int pos) const
 {
   auto res = isl_basic_set_get_div(get(), pos);
   return manage(res);
 }
 
-isl::local_space basic_set::get_local_space() const
+local_space basic_set::get_local_space() const
 {
   auto res = isl_basic_set_get_local_space(get());
   return manage(res);
 }
 
-isl::space basic_set::get_space() const
+space basic_set::get_space() const
 {
   auto res = isl_basic_set_get_space(get());
   return manage(res);
@@ -6495,61 +6495,61 @@
   return tmp;
 }
 
-isl::basic_set basic_set::gist(isl::basic_set context) const
+basic_set basic_set::gist(basic_set context) const
 {
   auto res = isl_basic_set_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::mat basic_set::inequalities_matrix(isl::dim c1, isl::dim c2, isl::dim c3, isl::dim c4) const
+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);
 }
 
-isl::basic_set basic_set::insert_dims(isl::dim type, unsigned int pos, unsigned int n) const
+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);
 }
 
-isl::basic_set basic_set::intersect(isl::basic_set bset2) const
+basic_set basic_set::intersect(basic_set bset2) const
 {
   auto res = isl_basic_set_intersect(copy(), bset2.release());
   return manage(res);
 }
 
-isl::basic_set basic_set::intersect_params(isl::basic_set bset2) const
+basic_set basic_set::intersect_params(basic_set bset2) const
 {
   auto res = isl_basic_set_intersect_params(copy(), bset2.release());
   return manage(res);
 }
 
-isl::boolean basic_set::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean basic_set::is_bounded() const
+boolean basic_set::is_bounded() const
 {
   auto res = isl_basic_set_is_bounded(get());
   return manage(res);
 }
 
-isl::boolean basic_set::is_disjoint(const isl::basic_set &bset2) const
+boolean basic_set::is_disjoint(const basic_set &bset2) const
 {
   auto res = isl_basic_set_is_disjoint(get(), bset2.get());
   return manage(res);
 }
 
-isl::boolean basic_set::is_empty() const
+boolean basic_set::is_empty() const
 {
   auto res = isl_basic_set_is_empty(get());
   return manage(res);
 }
 
-isl::boolean basic_set::is_equal(const isl::basic_set &bset2) const
+boolean basic_set::is_equal(const basic_set &bset2) const
 {
   auto res = isl_basic_set_is_equal(get(), bset2.get());
   return manage(res);
@@ -6561,49 +6561,49 @@
   return res;
 }
 
-isl::boolean basic_set::is_subset(const isl::basic_set &bset2) const
+boolean basic_set::is_subset(const basic_set &bset2) const
 {
   auto res = isl_basic_set_is_subset(get(), bset2.get());
   return manage(res);
 }
 
-isl::boolean basic_set::is_universe() const
+boolean basic_set::is_universe() const
 {
   auto res = isl_basic_set_is_universe(get());
   return manage(res);
 }
 
-isl::boolean basic_set::is_wrapping() const
+boolean basic_set::is_wrapping() const
 {
   auto res = isl_basic_set_is_wrapping(get());
   return manage(res);
 }
 
-isl::set basic_set::lexmax() const
+set basic_set::lexmax() const
 {
   auto res = isl_basic_set_lexmax(copy());
   return manage(res);
 }
 
-isl::set basic_set::lexmin() const
+set basic_set::lexmin() const
 {
   auto res = isl_basic_set_lexmin(copy());
   return manage(res);
 }
 
-isl::basic_set basic_set::lower_bound_val(isl::dim type, unsigned int pos, isl::val value) const
+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);
 }
 
-isl::val basic_set::max_val(const isl::aff &obj) const
+val basic_set::max_val(const aff &obj) const
 {
   auto res = isl_basic_set_max_val(get(), obj.get());
   return manage(res);
 }
 
-isl::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
+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);
@@ -6621,155 +6621,155 @@
   return res;
 }
 
-isl::basic_set basic_set::nat_universe(isl::space dim)
+basic_set basic_set::nat_universe(space dim)
 {
   auto res = isl_basic_set_nat_universe(dim.release());
   return manage(res);
 }
 
-isl::basic_set basic_set::neg() const
+basic_set basic_set::neg() const
 {
   auto res = isl_basic_set_neg(copy());
   return manage(res);
 }
 
-isl::basic_set basic_set::params() const
+basic_set basic_set::params() const
 {
   auto res = isl_basic_set_params(copy());
   return manage(res);
 }
 
-isl::boolean basic_set::plain_is_empty() const
+boolean basic_set::plain_is_empty() const
 {
   auto res = isl_basic_set_plain_is_empty(get());
   return manage(res);
 }
 
-isl::boolean basic_set::plain_is_equal(const isl::basic_set &bset2) const
+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);
 }
 
-isl::boolean basic_set::plain_is_universe() const
+boolean basic_set::plain_is_universe() const
 {
   auto res = isl_basic_set_plain_is_universe(get());
   return manage(res);
 }
 
-isl::basic_set basic_set::positive_orthant(isl::space space)
+basic_set basic_set::positive_orthant(space space)
 {
   auto res = isl_basic_set_positive_orthant(space.release());
   return manage(res);
 }
 
-isl::basic_set basic_set::preimage_multi_aff(isl::multi_aff ma) const
+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);
 }
 
-isl::basic_set basic_set::project_out(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::mat basic_set::reduced_basis() const
+mat basic_set::reduced_basis() const
 {
   auto res = isl_basic_set_reduced_basis(get());
   return manage(res);
 }
 
-isl::basic_set basic_set::remove_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_set basic_set::remove_divs() const
+basic_set basic_set::remove_divs() const
 {
   auto res = isl_basic_set_remove_divs(copy());
   return manage(res);
 }
 
-isl::basic_set basic_set::remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::basic_set basic_set::remove_redundancies() const
+basic_set basic_set::remove_redundancies() const
 {
   auto res = isl_basic_set_remove_redundancies(copy());
   return manage(res);
 }
 
-isl::basic_set basic_set::remove_unknown_divs() const
+basic_set basic_set::remove_unknown_divs() const
 {
   auto res = isl_basic_set_remove_unknown_divs(copy());
   return manage(res);
 }
 
-isl::basic_set basic_set::sample() const
+basic_set basic_set::sample() const
 {
   auto res = isl_basic_set_sample(copy());
   return manage(res);
 }
 
-isl::point basic_set::sample_point() const
+point basic_set::sample_point() const
 {
   auto res = isl_basic_set_sample_point(copy());
   return manage(res);
 }
 
-isl::basic_set basic_set::set_tuple_id(isl::id id) const
+basic_set basic_set::set_tuple_id(id id) const
 {
   auto res = isl_basic_set_set_tuple_id(copy(), id.release());
   return manage(res);
 }
 
-isl::basic_set basic_set::set_tuple_name(const std::string &s) const
+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);
 }
 
-isl::basic_set basic_set::solutions() const
+basic_set basic_set::solutions() const
 {
   auto res = isl_basic_set_solutions(copy());
   return manage(res);
 }
 
-isl::set basic_set::unite(isl::basic_set bset2) const
+set basic_set::unite(basic_set bset2) const
 {
   auto res = isl_basic_set_union(copy(), bset2.release());
   return manage(res);
 }
 
-isl::basic_set basic_set::universe(isl::space space)
+basic_set basic_set::universe(space space)
 {
   auto res = isl_basic_set_universe(space.release());
   return manage(res);
 }
 
-isl::basic_map basic_set::unwrap() const
+basic_map basic_set::unwrap() const
 {
   auto res = isl_basic_set_unwrap(copy());
   return manage(res);
 }
 
-isl::basic_set basic_set::upper_bound_val(isl::dim type, unsigned int pos, isl::val value) const
+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
-isl::basic_set_list manage(__isl_take isl_basic_set_list *ptr) {
+basic_set_list manage(__isl_take isl_basic_set_list *ptr) {
   return basic_set_list(ptr);
 }
-isl::basic_set_list manage_copy(__isl_keep isl_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);
 }
@@ -6777,7 +6777,7 @@
 basic_set_list::basic_set_list()
     : ptr(nullptr) {}
 
-basic_set_list::basic_set_list(const isl::basic_set_list &obj)
+basic_set_list::basic_set_list(const basic_set_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -6790,7 +6790,7 @@
     : ptr(ptr) {}
 
 
-basic_set_list &basic_set_list::operator=(isl::basic_set_list obj) {
+basic_set_list &basic_set_list::operator=(basic_set_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -6822,8 +6822,8 @@
 }
 
 
-isl::ctx basic_set_list::get_ctx() const {
-  return isl::ctx(isl_basic_set_list_get_ctx(ptr));
+ctx basic_set_list::get_ctx() const {
+  return ctx(isl_basic_set_list_get_ctx(ptr));
 }
 
 void basic_set_list::dump() const {
@@ -6831,69 +6831,69 @@
 }
 
 
-isl::basic_set_list basic_set_list::add(isl::basic_set el) const
+basic_set_list basic_set_list::add(basic_set el) const
 {
   auto res = isl_basic_set_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::basic_set_list basic_set_list::alloc(isl::ctx ctx, int n)
+basic_set_list basic_set_list::alloc(ctx ctx, int n)
 {
   auto res = isl_basic_set_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::basic_set_list basic_set_list::coefficients() const
+basic_set_list basic_set_list::coefficients() const
 {
   auto res = isl_basic_set_list_coefficients(copy());
   return manage(res);
 }
 
-isl::basic_set_list basic_set_list::concat(isl::basic_set_list list2) const
+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);
 }
 
-isl::basic_set_list basic_set_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::stat basic_set_list::foreach(const std::function<isl::stat(isl::basic_set)> &fn) const
+stat basic_set_list::foreach(const std::function<stat(basic_set)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::basic_set)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::basic_set_list basic_set_list::from_basic_set(isl::basic_set el)
+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);
 }
 
-isl::basic_set basic_set_list::get_at(int index) const
+basic_set basic_set_list::get_at(int index) const
 {
   auto res = isl_basic_set_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::basic_set basic_set_list::get_basic_set(int index) const
+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);
 }
 
-isl::basic_set_list basic_set_list::insert(unsigned int pos, isl::basic_set el) const
+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);
@@ -6905,13 +6905,13 @@
   return res;
 }
 
-isl::basic_set_list basic_set_list::reverse() const
+basic_set_list basic_set_list::reverse() const
 {
   auto res = isl_basic_set_list_reverse(copy());
   return manage(res);
 }
 
-isl::basic_set_list basic_set_list::set_basic_set(int index, isl::basic_set el) const
+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);
@@ -6923,17 +6923,17 @@
   return res;
 }
 
-isl::basic_set_list basic_set_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::constraint manage(__isl_take isl_constraint *ptr) {
+constraint manage(__isl_take isl_constraint *ptr) {
   return constraint(ptr);
 }
-isl::constraint manage_copy(__isl_keep isl_constraint *ptr) {
+constraint manage_copy(__isl_keep isl_constraint *ptr) {
   ptr = isl_constraint_copy(ptr);
   return constraint(ptr);
 }
@@ -6941,7 +6941,7 @@
 constraint::constraint()
     : ptr(nullptr) {}
 
-constraint::constraint(const isl::constraint &obj)
+constraint::constraint(const constraint &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -6954,7 +6954,7 @@
     : ptr(ptr) {}
 
 
-constraint &constraint::operator=(isl::constraint obj) {
+constraint &constraint::operator=(constraint obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -6986,8 +6986,8 @@
 }
 
 
-isl::ctx constraint::get_ctx() const {
-  return isl::ctx(isl_constraint_get_ctx(ptr));
+ctx constraint::get_ctx() const {
+  return ctx(isl_constraint_get_ctx(ptr));
 }
 
 void constraint::dump() const {
@@ -6995,43 +6995,43 @@
 }
 
 
-isl::constraint constraint::alloc_equality(isl::local_space ls)
+constraint constraint::alloc_equality(local_space ls)
 {
   auto res = isl_constraint_alloc_equality(ls.release());
   return manage(res);
 }
 
-isl::constraint constraint::alloc_inequality(isl::local_space ls)
+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 isl::constraint &c2) const
+int constraint::cmp_last_non_zero(const constraint &c2) const
 {
   auto res = isl_constraint_cmp_last_non_zero(get(), c2.get());
   return res;
 }
 
-isl::aff constraint::get_aff() const
+aff constraint::get_aff() const
 {
   auto res = isl_constraint_get_aff(get());
   return manage(res);
 }
 
-isl::aff constraint::get_bound(isl::dim type, int pos) const
+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);
 }
 
-isl::val constraint::get_coefficient_val(isl::dim type, int pos) const
+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);
 }
 
-isl::val constraint::get_constant_val() const
+val constraint::get_constant_val() const
 {
   auto res = isl_constraint_get_constant_val(get());
   return manage(res);
@@ -7044,25 +7044,25 @@
   return tmp;
 }
 
-isl::aff constraint::get_div(int pos) const
+aff constraint::get_div(int pos) const
 {
   auto res = isl_constraint_get_div(get(), pos);
   return manage(res);
 }
 
-isl::local_space constraint::get_local_space() const
+local_space constraint::get_local_space() const
 {
   auto res = isl_constraint_get_local_space(get());
   return manage(res);
 }
 
-isl::space constraint::get_space() const
+space constraint::get_space() const
 {
   auto res = isl_constraint_get_space(get());
   return manage(res);
 }
 
-isl::boolean constraint::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
@@ -7074,53 +7074,53 @@
   return res;
 }
 
-isl::boolean constraint::is_lower_bound(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean constraint::is_upper_bound(isl::dim type, unsigned int pos) const
+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 isl::constraint &c2) const
+int constraint::plain_cmp(const constraint &c2) const
 {
   auto res = isl_constraint_plain_cmp(get(), c2.get());
   return res;
 }
 
-isl::constraint constraint::set_coefficient_si(isl::dim type, int pos, int v) const
+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);
 }
 
-isl::constraint constraint::set_coefficient_val(isl::dim type, int pos, isl::val v) const
+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);
 }
 
-isl::constraint constraint::set_constant_si(int v) const
+constraint constraint::set_constant_si(int v) const
 {
   auto res = isl_constraint_set_constant_si(copy(), v);
   return manage(res);
 }
 
-isl::constraint constraint::set_constant_val(isl::val v) const
+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
-isl::constraint_list manage(__isl_take isl_constraint_list *ptr) {
+constraint_list manage(__isl_take isl_constraint_list *ptr) {
   return constraint_list(ptr);
 }
-isl::constraint_list manage_copy(__isl_keep isl_constraint_list *ptr) {
+constraint_list manage_copy(__isl_keep isl_constraint_list *ptr) {
   ptr = isl_constraint_list_copy(ptr);
   return constraint_list(ptr);
 }
@@ -7128,7 +7128,7 @@
 constraint_list::constraint_list()
     : ptr(nullptr) {}
 
-constraint_list::constraint_list(const isl::constraint_list &obj)
+constraint_list::constraint_list(const constraint_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -7141,7 +7141,7 @@
     : ptr(ptr) {}
 
 
-constraint_list &constraint_list::operator=(isl::constraint_list obj) {
+constraint_list &constraint_list::operator=(constraint_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -7173,8 +7173,8 @@
 }
 
 
-isl::ctx constraint_list::get_ctx() const {
-  return isl::ctx(isl_constraint_list_get_ctx(ptr));
+ctx constraint_list::get_ctx() const {
+  return ctx(isl_constraint_list_get_ctx(ptr));
 }
 
 void constraint_list::dump() const {
@@ -7182,63 +7182,63 @@
 }
 
 
-isl::constraint_list constraint_list::add(isl::constraint el) const
+constraint_list constraint_list::add(constraint el) const
 {
   auto res = isl_constraint_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::constraint_list constraint_list::alloc(isl::ctx ctx, int n)
+constraint_list constraint_list::alloc(ctx ctx, int n)
 {
   auto res = isl_constraint_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::constraint_list constraint_list::concat(isl::constraint_list list2) const
+constraint_list constraint_list::concat(constraint_list list2) const
 {
   auto res = isl_constraint_list_concat(copy(), list2.release());
   return manage(res);
 }
 
-isl::constraint_list constraint_list::drop(unsigned int first, unsigned int n) const
+constraint_list constraint_list::drop(unsigned int first, unsigned int n) const
 {
   auto res = isl_constraint_list_drop(copy(), first, n);
   return manage(res);
 }
 
-isl::stat constraint_list::foreach(const std::function<isl::stat(isl::constraint)> &fn) const
+stat constraint_list::foreach(const std::function<stat(constraint)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::constraint)> *func;
+    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)(isl::manage(arg_0));
+    stat ret = (*data->func)(manage(arg_0));
     return ret.release();
   };
   auto res = isl_constraint_list_foreach(get(), fn_lambda, &fn_data);
   return manage(res);
 }
 
-isl::constraint_list constraint_list::from_constraint(isl::constraint el)
+constraint_list constraint_list::from_constraint(constraint el)
 {
   auto res = isl_constraint_list_from_constraint(el.release());
   return manage(res);
 }
 
-isl::constraint constraint_list::get_at(int index) const
+constraint constraint_list::get_at(int index) const
 {
   auto res = isl_constraint_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::constraint constraint_list::get_constraint(int index) const
+constraint constraint_list::get_constraint(int index) const
 {
   auto res = isl_constraint_list_get_constraint(get(), index);
   return manage(res);
 }
 
-isl::constraint_list constraint_list::insert(unsigned int pos, isl::constraint el) const
+constraint_list constraint_list::insert(unsigned int pos, constraint el) const
 {
   auto res = isl_constraint_list_insert(copy(), pos, el.release());
   return manage(res);
@@ -7250,13 +7250,13 @@
   return res;
 }
 
-isl::constraint_list constraint_list::reverse() const
+constraint_list constraint_list::reverse() const
 {
   auto res = isl_constraint_list_reverse(copy());
   return manage(res);
 }
 
-isl::constraint_list constraint_list::set_constraint(int index, isl::constraint el) const
+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);
@@ -7268,17 +7268,17 @@
   return res;
 }
 
-isl::constraint_list constraint_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::fixed_box manage(__isl_take isl_fixed_box *ptr) {
+fixed_box manage(__isl_take isl_fixed_box *ptr) {
   return fixed_box(ptr);
 }
-isl::fixed_box manage_copy(__isl_keep isl_fixed_box *ptr) {
+fixed_box manage_copy(__isl_keep isl_fixed_box *ptr) {
   ptr = isl_fixed_box_copy(ptr);
   return fixed_box(ptr);
 }
@@ -7286,7 +7286,7 @@
 fixed_box::fixed_box()
     : ptr(nullptr) {}
 
-fixed_box::fixed_box(const isl::fixed_box &obj)
+fixed_box::fixed_box(const fixed_box &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -7299,7 +7299,7 @@
     : ptr(ptr) {}
 
 
-fixed_box &fixed_box::operator=(isl::fixed_box obj) {
+fixed_box &fixed_box::operator=(fixed_box obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -7331,40 +7331,40 @@
 }
 
 
-isl::ctx fixed_box::get_ctx() const {
-  return isl::ctx(isl_fixed_box_get_ctx(ptr));
+ctx fixed_box::get_ctx() const {
+  return ctx(isl_fixed_box_get_ctx(ptr));
 }
 
 
-isl::multi_aff fixed_box::get_offset() const
+multi_aff fixed_box::get_offset() const
 {
   auto res = isl_fixed_box_get_offset(get());
   return manage(res);
 }
 
-isl::multi_val fixed_box::get_size() const
+multi_val fixed_box::get_size() const
 {
   auto res = isl_fixed_box_get_size(get());
   return manage(res);
 }
 
-isl::space fixed_box::get_space() const
+space fixed_box::get_space() const
 {
   auto res = isl_fixed_box_get_space(get());
   return manage(res);
 }
 
-isl::boolean fixed_box::is_valid() const
+boolean fixed_box::is_valid() const
 {
   auto res = isl_fixed_box_is_valid(get());
   return manage(res);
 }
 
 // implementations for isl::id
-isl::id manage(__isl_take isl_id *ptr) {
+id manage(__isl_take isl_id *ptr) {
   return id(ptr);
 }
-isl::id manage_copy(__isl_keep isl_id *ptr) {
+id manage_copy(__isl_keep isl_id *ptr) {
   ptr = isl_id_copy(ptr);
   return id(ptr);
 }
@@ -7372,7 +7372,7 @@
 id::id()
     : ptr(nullptr) {}
 
-id::id(const isl::id &obj)
+id::id(const id &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -7385,7 +7385,7 @@
     : ptr(ptr) {}
 
 
-id &id::operator=(isl::id obj) {
+id &id::operator=(id obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -7417,8 +7417,8 @@
 }
 
 
-isl::ctx id::get_ctx() const {
-  return isl::ctx(isl_id_get_ctx(ptr));
+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());
@@ -7435,7 +7435,7 @@
 }
 
 
-isl::id id::alloc(isl::ctx ctx, const std::string &name, void * user)
+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);
@@ -7461,10 +7461,10 @@
 }
 
 // implementations for isl::id_list
-isl::id_list manage(__isl_take isl_id_list *ptr) {
+id_list manage(__isl_take isl_id_list *ptr) {
   return id_list(ptr);
 }
-isl::id_list manage_copy(__isl_keep isl_id_list *ptr) {
+id_list manage_copy(__isl_keep isl_id_list *ptr) {
   ptr = isl_id_list_copy(ptr);
   return id_list(ptr);
 }
@@ -7472,7 +7472,7 @@
 id_list::id_list()
     : ptr(nullptr) {}
 
-id_list::id_list(const isl::id_list &obj)
+id_list::id_list(const id_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -7485,7 +7485,7 @@
     : ptr(ptr) {}
 
 
-id_list &id_list::operator=(isl::id_list obj) {
+id_list &id_list::operator=(id_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -7517,8 +7517,8 @@
 }
 
 
-isl::ctx id_list::get_ctx() const {
-  return isl::ctx(isl_id_list_get_ctx(ptr));
+ctx id_list::get_ctx() const {
+  return ctx(isl_id_list_get_ctx(ptr));
 }
 
 void id_list::dump() const {
@@ -7526,63 +7526,63 @@
 }
 
 
-isl::id_list id_list::add(isl::id el) const
+id_list id_list::add(id el) const
 {
   auto res = isl_id_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::id_list id_list::alloc(isl::ctx ctx, int n)
+id_list id_list::alloc(ctx ctx, int n)
 {
   auto res = isl_id_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::id_list id_list::concat(isl::id_list list2) const
+id_list id_list::concat(id_list list2) const
 {
   auto res = isl_id_list_concat(copy(), list2.release());
   return manage(res);
 }
 
-isl::id_list id_list::drop(unsigned int first, unsigned int n) const
+id_list id_list::drop(unsigned int first, unsigned int n) const
 {
   auto res = isl_id_list_drop(copy(), first, n);
   return manage(res);
 }
 
-isl::stat id_list::foreach(const std::function<isl::stat(isl::id)> &fn) const
+stat id_list::foreach(const std::function<stat(id)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::id)> *func;
+    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)(isl::manage(arg_0));
+    stat ret = (*data->func)(manage(arg_0));
     return ret.release();
   };
   auto res = isl_id_list_foreach(get(), fn_lambda, &fn_data);
   return manage(res);
 }
 
-isl::id_list id_list::from_id(isl::id el)
+id_list id_list::from_id(id el)
 {
   auto res = isl_id_list_from_id(el.release());
   return manage(res);
 }
 
-isl::id id_list::get_at(int index) const
+id id_list::get_at(int index) const
 {
   auto res = isl_id_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::id id_list::get_id(int index) const
+id id_list::get_id(int index) const
 {
   auto res = isl_id_list_get_id(get(), index);
   return manage(res);
 }
 
-isl::id_list id_list::insert(unsigned int pos, isl::id el) const
+id_list id_list::insert(unsigned int pos, id el) const
 {
   auto res = isl_id_list_insert(copy(), pos, el.release());
   return manage(res);
@@ -7594,13 +7594,13 @@
   return res;
 }
 
-isl::id_list id_list::reverse() const
+id_list id_list::reverse() const
 {
   auto res = isl_id_list_reverse(copy());
   return manage(res);
 }
 
-isl::id_list id_list::set_id(int index, isl::id el) const
+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);
@@ -7612,17 +7612,17 @@
   return res;
 }
 
-isl::id_list id_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::id_to_ast_expr manage(__isl_take isl_id_to_ast_expr *ptr) {
+id_to_ast_expr manage(__isl_take isl_id_to_ast_expr *ptr) {
   return id_to_ast_expr(ptr);
 }
-isl::id_to_ast_expr manage_copy(__isl_keep isl_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);
 }
@@ -7630,7 +7630,7 @@
 id_to_ast_expr::id_to_ast_expr()
     : ptr(nullptr) {}
 
-id_to_ast_expr::id_to_ast_expr(const isl::id_to_ast_expr &obj)
+id_to_ast_expr::id_to_ast_expr(const id_to_ast_expr &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -7643,7 +7643,7 @@
     : ptr(ptr) {}
 
 
-id_to_ast_expr &id_to_ast_expr::operator=(isl::id_to_ast_expr obj) {
+id_to_ast_expr &id_to_ast_expr::operator=(id_to_ast_expr obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -7675,8 +7675,8 @@
 }
 
 
-isl::ctx id_to_ast_expr::get_ctx() const {
-  return isl::ctx(isl_id_to_ast_expr_get_ctx(ptr));
+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 {
@@ -7684,55 +7684,55 @@
 }
 
 
-isl::id_to_ast_expr id_to_ast_expr::alloc(isl::ctx ctx, int min_size)
+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);
 }
 
-isl::id_to_ast_expr id_to_ast_expr::drop(isl::id key) const
+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);
 }
 
-isl::stat id_to_ast_expr::foreach(const std::function<isl::stat(isl::id, isl::ast_expr)> &fn) const
+stat id_to_ast_expr::foreach(const std::function<stat(id, ast_expr)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::id, isl::ast_expr)> *func;
+    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)(isl::manage(arg_0), isl::manage(arg_1));
+    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);
 }
 
-isl::ast_expr id_to_ast_expr::get(isl::id key) const
+ast_expr id_to_ast_expr::get(id key) const
 {
   auto res = isl_id_to_ast_expr_get(get(), key.release());
   return manage(res);
 }
 
-isl::boolean id_to_ast_expr::has(const isl::id &key) const
+boolean id_to_ast_expr::has(const id &key) const
 {
   auto res = isl_id_to_ast_expr_has(get(), key.get());
   return manage(res);
 }
 
-isl::id_to_ast_expr id_to_ast_expr::set(isl::id key, isl::ast_expr val) const
+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
-isl::local_space manage(__isl_take isl_local_space *ptr) {
+local_space manage(__isl_take isl_local_space *ptr) {
   return local_space(ptr);
 }
-isl::local_space manage_copy(__isl_keep isl_local_space *ptr) {
+local_space manage_copy(__isl_keep isl_local_space *ptr) {
   ptr = isl_local_space_copy(ptr);
   return local_space(ptr);
 }
@@ -7740,7 +7740,7 @@
 local_space::local_space()
     : ptr(nullptr) {}
 
-local_space::local_space(const isl::local_space &obj)
+local_space::local_space(const local_space &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -7752,13 +7752,13 @@
 local_space::local_space(__isl_take isl_local_space *ptr)
     : ptr(ptr) {}
 
-local_space::local_space(isl::space dim)
+local_space::local_space(space dim)
 {
   auto res = isl_local_space_from_space(dim.release());
   ptr = res;
 }
 
-local_space &local_space::operator=(isl::local_space obj) {
+local_space &local_space::operator=(local_space obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -7790,8 +7790,8 @@
 }
 
 
-isl::ctx local_space::get_ctx() const {
-  return isl::ctx(isl_local_space_get_ctx(ptr));
+ctx local_space::get_ctx() const {
+  return ctx(isl_local_space_get_ctx(ptr));
 }
 
 void local_space::dump() const {
@@ -7799,7 +7799,7 @@
 }
 
 
-isl::local_space local_space::add_dims(isl::dim type, unsigned int n) const
+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);
@@ -7811,13 +7811,13 @@
   return res;
 }
 
-isl::local_space local_space::domain() const
+local_space local_space::domain() const
 {
   auto res = isl_local_space_domain(copy());
   return manage(res);
 }
 
-isl::local_space local_space::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
@@ -7829,25 +7829,25 @@
   return res;
 }
 
-isl::local_space local_space::flatten_domain() const
+local_space local_space::flatten_domain() const
 {
   auto res = isl_local_space_flatten_domain(copy());
   return manage(res);
 }
 
-isl::local_space local_space::flatten_range() const
+local_space local_space::flatten_range() const
 {
   auto res = isl_local_space_flatten_range(copy());
   return manage(res);
 }
 
-isl::local_space local_space::from_domain() const
+local_space local_space::from_domain() const
 {
   auto res = isl_local_space_from_domain(copy());
   return manage(res);
 }
 
-isl::id local_space::get_dim_id(isl::dim type, unsigned int pos) const
+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);
@@ -7860,95 +7860,95 @@
   return tmp;
 }
 
-isl::aff local_space::get_div(int pos) const
+aff local_space::get_div(int pos) const
 {
   auto res = isl_local_space_get_div(get(), pos);
   return manage(res);
 }
 
-isl::space local_space::get_space() const
+space local_space::get_space() const
 {
   auto res = isl_local_space_get_space(get());
   return manage(res);
 }
 
-isl::boolean local_space::has_dim_id(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean local_space::has_dim_name(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::local_space local_space::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::local_space local_space::intersect(isl::local_space ls2) const
+local_space local_space::intersect(local_space ls2) const
 {
   auto res = isl_local_space_intersect(copy(), ls2.release());
   return manage(res);
 }
 
-isl::boolean local_space::is_equal(const isl::local_space &ls2) const
+boolean local_space::is_equal(const local_space &ls2) const
 {
   auto res = isl_local_space_is_equal(get(), ls2.get());
   return manage(res);
 }
 
-isl::boolean local_space::is_params() const
+boolean local_space::is_params() const
 {
   auto res = isl_local_space_is_params(get());
   return manage(res);
 }
 
-isl::boolean local_space::is_set() const
+boolean local_space::is_set() const
 {
   auto res = isl_local_space_is_set(get());
   return manage(res);
 }
 
-isl::local_space local_space::range() const
+local_space local_space::range() const
 {
   auto res = isl_local_space_range(copy());
   return manage(res);
 }
 
-isl::local_space local_space::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::local_space local_space::set_from_params() const
+local_space local_space::set_from_params() const
 {
   auto res = isl_local_space_set_from_params(copy());
   return manage(res);
 }
 
-isl::local_space local_space::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::local_space local_space::wrap() const
+local_space local_space::wrap() const
 {
   auto res = isl_local_space_wrap(copy());
   return manage(res);
 }
 
 // implementations for isl::map
-isl::map manage(__isl_take isl_map *ptr) {
+map manage(__isl_take isl_map *ptr) {
   return map(ptr);
 }
-isl::map manage_copy(__isl_keep isl_map *ptr) {
+map manage_copy(__isl_keep isl_map *ptr) {
   ptr = isl_map_copy(ptr);
   return map(ptr);
 }
@@ -7956,7 +7956,7 @@
 map::map()
     : ptr(nullptr) {}
 
-map::map(const isl::map &obj)
+map::map(const map &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -7968,18 +7968,18 @@
 map::map(__isl_take isl_map *ptr)
     : ptr(ptr) {}
 
-map::map(isl::ctx ctx, const std::string &str)
+map::map(ctx ctx, const std::string &str)
 {
   auto res = isl_map_read_from_str(ctx.release(), str.c_str());
   ptr = res;
 }
-map::map(isl::basic_map bmap)
+map::map(basic_map bmap)
 {
   auto res = isl_map_from_basic_map(bmap.release());
   ptr = res;
 }
 
-map &map::operator=(isl::map obj) {
+map &map::operator=(map obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -8011,8 +8011,8 @@
 }
 
 
-isl::ctx map::get_ctx() const {
-  return isl::ctx(isl_map_get_ctx(ptr));
+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());
@@ -8029,103 +8029,103 @@
 }
 
 
-isl::map map::add_constraint(isl::constraint constraint) const
+map map::add_constraint(constraint constraint) const
 {
   auto res = isl_map_add_constraint(copy(), constraint.release());
   return manage(res);
 }
 
-isl::map map::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::basic_map map::affine_hull() const
+basic_map map::affine_hull() const
 {
   auto res = isl_map_affine_hull(copy());
   return manage(res);
 }
 
-isl::map map::align_params(isl::space model) const
+map map::align_params(space model) const
 {
   auto res = isl_map_align_params(copy(), model.release());
   return manage(res);
 }
 
-isl::map map::apply_domain(isl::map map2) const
+map map::apply_domain(map map2) const
 {
   auto res = isl_map_apply_domain(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::apply_range(isl::map map2) const
+map map::apply_range(map map2) const
 {
   auto res = isl_map_apply_range(copy(), map2.release());
   return manage(res);
 }
 
-isl::boolean map::can_curry() const
+boolean map::can_curry() const
 {
   auto res = isl_map_can_curry(get());
   return manage(res);
 }
 
-isl::boolean map::can_range_curry() const
+boolean map::can_range_curry() const
 {
   auto res = isl_map_can_range_curry(get());
   return manage(res);
 }
 
-isl::boolean map::can_uncurry() const
+boolean map::can_uncurry() const
 {
   auto res = isl_map_can_uncurry(get());
   return manage(res);
 }
 
-isl::boolean map::can_zip() const
+boolean map::can_zip() const
 {
   auto res = isl_map_can_zip(get());
   return manage(res);
 }
 
-isl::map map::coalesce() const
+map map::coalesce() const
 {
   auto res = isl_map_coalesce(copy());
   return manage(res);
 }
 
-isl::map map::complement() const
+map map::complement() const
 {
   auto res = isl_map_complement(copy());
   return manage(res);
 }
 
-isl::basic_map map::convex_hull() const
+basic_map map::convex_hull() const
 {
   auto res = isl_map_convex_hull(copy());
   return manage(res);
 }
 
-isl::map map::curry() const
+map map::curry() const
 {
   auto res = isl_map_curry(copy());
   return manage(res);
 }
 
-isl::set map::deltas() const
+set map::deltas() const
 {
   auto res = isl_map_deltas(copy());
   return manage(res);
 }
 
-isl::map map::deltas_map() const
+map map::deltas_map() const
 {
   auto res = isl_map_deltas_map(copy());
   return manage(res);
 }
 
-isl::map map::detect_equalities() const
+map map::detect_equalities() const
 {
   auto res = isl_map_detect_equalities(copy());
   return manage(res);
@@ -8137,103 +8137,103 @@
   return res;
 }
 
-isl::pw_aff map::dim_max(int pos) const
+pw_aff map::dim_max(int pos) const
 {
   auto res = isl_map_dim_max(copy(), pos);
   return manage(res);
 }
 
-isl::pw_aff map::dim_min(int pos) const
+pw_aff map::dim_min(int pos) const
 {
   auto res = isl_map_dim_min(copy(), pos);
   return manage(res);
 }
 
-isl::set map::domain() const
+set map::domain() const
 {
   auto res = isl_map_domain(copy());
   return manage(res);
 }
 
-isl::map map::domain_factor_domain() const
+map map::domain_factor_domain() const
 {
   auto res = isl_map_domain_factor_domain(copy());
   return manage(res);
 }
 
-isl::map map::domain_factor_range() const
+map map::domain_factor_range() const
 {
   auto res = isl_map_domain_factor_range(copy());
   return manage(res);
 }
 
-isl::boolean map::domain_is_wrapping() const
+boolean map::domain_is_wrapping() const
 {
   auto res = isl_map_domain_is_wrapping(get());
   return manage(res);
 }
 
-isl::map map::domain_map() const
+map map::domain_map() const
 {
   auto res = isl_map_domain_map(copy());
   return manage(res);
 }
 
-isl::map map::domain_product(isl::map map2) const
+map map::domain_product(map map2) const
 {
   auto res = isl_map_domain_product(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::map map::drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::map map::drop_unused_params() const
+map map::drop_unused_params() const
 {
   auto res = isl_map_drop_unused_params(copy());
   return manage(res);
 }
 
-isl::map map::eliminate(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::map map::empty(isl::space space)
+map map::empty(space space)
 {
   auto res = isl_map_empty(space.release());
   return manage(res);
 }
 
-isl::map map::equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const
+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);
 }
 
-isl::map map::factor_domain() const
+map map::factor_domain() const
 {
   auto res = isl_map_factor_domain(copy());
   return manage(res);
 }
 
-isl::map map::factor_range() const
+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 isl::id &id) const
+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;
@@ -8245,141 +8245,141 @@
   return res;
 }
 
-isl::map map::fix_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::map map::fix_val(isl::dim type, unsigned int pos, isl::val v) const
+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);
 }
 
-isl::map map::fixed_power_val(isl::val exp) const
+map map::fixed_power_val(val exp) const
 {
   auto res = isl_map_fixed_power_val(copy(), exp.release());
   return manage(res);
 }
 
-isl::map map::flat_domain_product(isl::map map2) const
+map map::flat_domain_product(map map2) const
 {
   auto res = isl_map_flat_domain_product(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::flat_product(isl::map map2) const
+map map::flat_product(map map2) const
 {
   auto res = isl_map_flat_product(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::flat_range_product(isl::map map2) const
+map map::flat_range_product(map map2) const
 {
   auto res = isl_map_flat_range_product(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::flatten() const
+map map::flatten() const
 {
   auto res = isl_map_flatten(copy());
   return manage(res);
 }
 
-isl::map map::flatten_domain() const
+map map::flatten_domain() const
 {
   auto res = isl_map_flatten_domain(copy());
   return manage(res);
 }
 
-isl::map map::flatten_range() const
+map map::flatten_range() const
 {
   auto res = isl_map_flatten_range(copy());
   return manage(res);
 }
 
-isl::map map::floordiv_val(isl::val d) const
+map map::floordiv_val(val d) const
 {
   auto res = isl_map_floordiv_val(copy(), d.release());
   return manage(res);
 }
 
-isl::stat map::foreach_basic_map(const std::function<isl::stat(isl::basic_map)> &fn) const
+stat map::foreach_basic_map(const std::function<stat(basic_map)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::basic_map)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::map map::from_aff(isl::aff aff)
+map map::from_aff(aff aff)
 {
   auto res = isl_map_from_aff(aff.release());
   return manage(res);
 }
 
-isl::map map::from_domain(isl::set set)
+map map::from_domain(set set)
 {
   auto res = isl_map_from_domain(set.release());
   return manage(res);
 }
 
-isl::map map::from_domain_and_range(isl::set domain, isl::set range)
+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);
 }
 
-isl::map map::from_multi_aff(isl::multi_aff maff)
+map map::from_multi_aff(multi_aff maff)
 {
   auto res = isl_map_from_multi_aff(maff.release());
   return manage(res);
 }
 
-isl::map map::from_multi_pw_aff(isl::multi_pw_aff mpa)
+map map::from_multi_pw_aff(multi_pw_aff mpa)
 {
   auto res = isl_map_from_multi_pw_aff(mpa.release());
   return manage(res);
 }
 
-isl::map map::from_pw_aff(isl::pw_aff pwaff)
+map map::from_pw_aff(pw_aff pwaff)
 {
   auto res = isl_map_from_pw_aff(pwaff.release());
   return manage(res);
 }
 
-isl::map map::from_pw_multi_aff(isl::pw_multi_aff pma)
+map map::from_pw_multi_aff(pw_multi_aff pma)
 {
   auto res = isl_map_from_pw_multi_aff(pma.release());
   return manage(res);
 }
 
-isl::map map::from_range(isl::set set)
+map map::from_range(set set)
 {
   auto res = isl_map_from_range(set.release());
   return manage(res);
 }
 
-isl::map map::from_union_map(isl::union_map umap)
+map map::from_union_map(union_map umap)
 {
   auto res = isl_map_from_union_map(umap.release());
   return manage(res);
 }
 
-isl::basic_map_list map::get_basic_map_list() const
+basic_map_list map::get_basic_map_list() const
 {
   auto res = isl_map_get_basic_map_list(get());
   return manage(res);
 }
 
-isl::id map::get_dim_id(isl::dim type, unsigned int pos) const
+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);
@@ -8398,19 +8398,19 @@
   return res;
 }
 
-isl::fixed_box map::get_range_simple_fixed_box_hull() const
+fixed_box map::get_range_simple_fixed_box_hull() const
 {
   auto res = isl_map_get_range_simple_fixed_box_hull(get());
   return manage(res);
 }
 
-isl::space map::get_space() const
+space map::get_space() const
 {
   auto res = isl_map_get_space(get());
   return manage(res);
 }
 
-isl::id map::get_tuple_id(isl::dim type) const
+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);
@@ -8423,175 +8423,175 @@
   return tmp;
 }
 
-isl::map map::gist(isl::map context) const
+map map::gist(map context) const
 {
   auto res = isl_map_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::map map::gist_basic_map(isl::basic_map context) const
+map map::gist_basic_map(basic_map context) const
 {
   auto res = isl_map_gist_basic_map(copy(), context.release());
   return manage(res);
 }
 
-isl::map map::gist_domain(isl::set context) const
+map map::gist_domain(set context) const
 {
   auto res = isl_map_gist_domain(copy(), context.release());
   return manage(res);
 }
 
-isl::map map::gist_params(isl::set context) const
+map map::gist_params(set context) const
 {
   auto res = isl_map_gist_params(copy(), context.release());
   return manage(res);
 }
 
-isl::map map::gist_range(isl::set context) const
+map map::gist_range(set context) const
 {
   auto res = isl_map_gist_range(copy(), context.release());
   return manage(res);
 }
 
-isl::boolean map::has_dim_id(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean map::has_dim_name(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean map::has_equal_space(const isl::map &map2) const
+boolean map::has_equal_space(const map &map2) const
 {
   auto res = isl_map_has_equal_space(get(), map2.get());
   return manage(res);
 }
 
-isl::boolean map::has_tuple_id(isl::dim type) const
+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);
 }
 
-isl::boolean map::has_tuple_name(isl::dim type) const
+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);
 }
 
-isl::map map::identity(isl::space dim)
+map map::identity(space dim)
 {
   auto res = isl_map_identity(dim.release());
   return manage(res);
 }
 
-isl::map map::insert_dims(isl::dim type, unsigned int pos, unsigned int n) const
+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);
 }
 
-isl::map map::intersect(isl::map map2) const
+map map::intersect(map map2) const
 {
   auto res = isl_map_intersect(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::intersect_domain(isl::set set) const
+map map::intersect_domain(set set) const
 {
   auto res = isl_map_intersect_domain(copy(), set.release());
   return manage(res);
 }
 
-isl::map map::intersect_domain_factor_range(isl::map factor) const
+map map::intersect_domain_factor_range(map factor) const
 {
   auto res = isl_map_intersect_domain_factor_range(copy(), factor.release());
   return manage(res);
 }
 
-isl::map map::intersect_params(isl::set params) const
+map map::intersect_params(set params) const
 {
   auto res = isl_map_intersect_params(copy(), params.release());
   return manage(res);
 }
 
-isl::map map::intersect_range(isl::set set) const
+map map::intersect_range(set set) const
 {
   auto res = isl_map_intersect_range(copy(), set.release());
   return manage(res);
 }
 
-isl::map map::intersect_range_factor_range(isl::map factor) const
+map map::intersect_range_factor_range(map factor) const
 {
   auto res = isl_map_intersect_range_factor_range(copy(), factor.release());
   return manage(res);
 }
 
-isl::boolean map::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean map::is_bijective() const
+boolean map::is_bijective() const
 {
   auto res = isl_map_is_bijective(get());
   return manage(res);
 }
 
-isl::boolean map::is_disjoint(const isl::map &map2) const
+boolean map::is_disjoint(const map &map2) const
 {
   auto res = isl_map_is_disjoint(get(), map2.get());
   return manage(res);
 }
 
-isl::boolean map::is_empty() const
+boolean map::is_empty() const
 {
   auto res = isl_map_is_empty(get());
   return manage(res);
 }
 
-isl::boolean map::is_equal(const isl::map &map2) const
+boolean map::is_equal(const map &map2) const
 {
   auto res = isl_map_is_equal(get(), map2.get());
   return manage(res);
 }
 
-isl::boolean map::is_identity() const
+boolean map::is_identity() const
 {
   auto res = isl_map_is_identity(get());
   return manage(res);
 }
 
-isl::boolean map::is_injective() const
+boolean map::is_injective() const
 {
   auto res = isl_map_is_injective(get());
   return manage(res);
 }
 
-isl::boolean map::is_product() const
+boolean map::is_product() const
 {
   auto res = isl_map_is_product(get());
   return manage(res);
 }
 
-isl::boolean map::is_single_valued() const
+boolean map::is_single_valued() const
 {
   auto res = isl_map_is_single_valued(get());
   return manage(res);
 }
 
-isl::boolean map::is_strict_subset(const isl::map &map2) const
+boolean map::is_strict_subset(const map &map2) const
 {
   auto res = isl_map_is_strict_subset(get(), map2.get());
   return manage(res);
 }
 
-isl::boolean map::is_subset(const isl::map &map2) const
+boolean map::is_subset(const map &map2) const
 {
   auto res = isl_map_is_subset(get(), map2.get());
   return manage(res);
@@ -8603,109 +8603,109 @@
   return res;
 }
 
-isl::map map::lex_ge(isl::space set_dim)
+map map::lex_ge(space set_dim)
 {
   auto res = isl_map_lex_ge(set_dim.release());
   return manage(res);
 }
 
-isl::map map::lex_ge_first(isl::space dim, unsigned int n)
+map map::lex_ge_first(space dim, unsigned int n)
 {
   auto res = isl_map_lex_ge_first(dim.release(), n);
   return manage(res);
 }
 
-isl::map map::lex_ge_map(isl::map map2) const
+map map::lex_ge_map(map map2) const
 {
   auto res = isl_map_lex_ge_map(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::lex_gt(isl::space set_dim)
+map map::lex_gt(space set_dim)
 {
   auto res = isl_map_lex_gt(set_dim.release());
   return manage(res);
 }
 
-isl::map map::lex_gt_first(isl::space dim, unsigned int n)
+map map::lex_gt_first(space dim, unsigned int n)
 {
   auto res = isl_map_lex_gt_first(dim.release(), n);
   return manage(res);
 }
 
-isl::map map::lex_gt_map(isl::map map2) const
+map map::lex_gt_map(map map2) const
 {
   auto res = isl_map_lex_gt_map(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::lex_le(isl::space set_dim)
+map map::lex_le(space set_dim)
 {
   auto res = isl_map_lex_le(set_dim.release());
   return manage(res);
 }
 
-isl::map map::lex_le_first(isl::space dim, unsigned int n)
+map map::lex_le_first(space dim, unsigned int n)
 {
   auto res = isl_map_lex_le_first(dim.release(), n);
   return manage(res);
 }
 
-isl::map map::lex_le_map(isl::map map2) const
+map map::lex_le_map(map map2) const
 {
   auto res = isl_map_lex_le_map(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::lex_lt(isl::space set_dim)
+map map::lex_lt(space set_dim)
 {
   auto res = isl_map_lex_lt(set_dim.release());
   return manage(res);
 }
 
-isl::map map::lex_lt_first(isl::space dim, unsigned int n)
+map map::lex_lt_first(space dim, unsigned int n)
 {
   auto res = isl_map_lex_lt_first(dim.release(), n);
   return manage(res);
 }
 
-isl::map map::lex_lt_map(isl::map map2) const
+map map::lex_lt_map(map map2) const
 {
   auto res = isl_map_lex_lt_map(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::lexmax() const
+map map::lexmax() const
 {
   auto res = isl_map_lexmax(copy());
   return manage(res);
 }
 
-isl::pw_multi_aff map::lexmax_pw_multi_aff() const
+pw_multi_aff map::lexmax_pw_multi_aff() const
 {
   auto res = isl_map_lexmax_pw_multi_aff(copy());
   return manage(res);
 }
 
-isl::map map::lexmin() const
+map map::lexmin() const
 {
   auto res = isl_map_lexmin(copy());
   return manage(res);
 }
 
-isl::pw_multi_aff map::lexmin_pw_multi_aff() const
+pw_multi_aff map::lexmin_pw_multi_aff() const
 {
   auto res = isl_map_lexmin_pw_multi_aff(copy());
   return manage(res);
 }
 
-isl::map map::lower_bound_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::map map::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
+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);
@@ -8717,341 +8717,341 @@
   return res;
 }
 
-isl::map map::nat_universe(isl::space dim)
+map map::nat_universe(space dim)
 {
   auto res = isl_map_nat_universe(dim.release());
   return manage(res);
 }
 
-isl::map map::neg() const
+map map::neg() const
 {
   auto res = isl_map_neg(copy());
   return manage(res);
 }
 
-isl::map map::oppose(isl::dim type1, int pos1, isl::dim type2, int pos2) const
+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);
 }
 
-isl::map map::order_ge(isl::dim type1, int pos1, isl::dim type2, int pos2) const
+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);
 }
 
-isl::map map::order_gt(isl::dim type1, int pos1, isl::dim type2, int pos2) const
+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);
 }
 
-isl::map map::order_le(isl::dim type1, int pos1, isl::dim type2, int pos2) const
+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);
 }
 
-isl::map map::order_lt(isl::dim type1, int pos1, isl::dim type2, int pos2) const
+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);
 }
 
-isl::set map::params() const
+set map::params() const
 {
   auto res = isl_map_params(copy());
   return manage(res);
 }
 
-isl::val map::plain_get_val_if_fixed(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean map::plain_is_empty() const
+boolean map::plain_is_empty() const
 {
   auto res = isl_map_plain_is_empty(get());
   return manage(res);
 }
 
-isl::boolean map::plain_is_equal(const isl::map &map2) const
+boolean map::plain_is_equal(const map &map2) const
 {
   auto res = isl_map_plain_is_equal(get(), map2.get());
   return manage(res);
 }
 
-isl::boolean map::plain_is_injective() const
+boolean map::plain_is_injective() const
 {
   auto res = isl_map_plain_is_injective(get());
   return manage(res);
 }
 
-isl::boolean map::plain_is_single_valued() const
+boolean map::plain_is_single_valued() const
 {
   auto res = isl_map_plain_is_single_valued(get());
   return manage(res);
 }
 
-isl::boolean map::plain_is_universe() const
+boolean map::plain_is_universe() const
 {
   auto res = isl_map_plain_is_universe(get());
   return manage(res);
 }
 
-isl::basic_map map::plain_unshifted_simple_hull() const
+basic_map map::plain_unshifted_simple_hull() const
 {
   auto res = isl_map_plain_unshifted_simple_hull(copy());
   return manage(res);
 }
 
-isl::basic_map map::polyhedral_hull() const
+basic_map map::polyhedral_hull() const
 {
   auto res = isl_map_polyhedral_hull(copy());
   return manage(res);
 }
 
-isl::map map::preimage_domain_multi_aff(isl::multi_aff ma) const
+map map::preimage_domain_multi_aff(multi_aff ma) const
 {
   auto res = isl_map_preimage_domain_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-isl::map map::preimage_domain_multi_pw_aff(isl::multi_pw_aff mpa) const
+map map::preimage_domain_multi_pw_aff(multi_pw_aff mpa) const
 {
   auto res = isl_map_preimage_domain_multi_pw_aff(copy(), mpa.release());
   return manage(res);
 }
 
-isl::map map::preimage_domain_pw_multi_aff(isl::pw_multi_aff pma) const
+map map::preimage_domain_pw_multi_aff(pw_multi_aff pma) const
 {
   auto res = isl_map_preimage_domain_pw_multi_aff(copy(), pma.release());
   return manage(res);
 }
 
-isl::map map::preimage_range_multi_aff(isl::multi_aff ma) const
+map map::preimage_range_multi_aff(multi_aff ma) const
 {
   auto res = isl_map_preimage_range_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-isl::map map::preimage_range_pw_multi_aff(isl::pw_multi_aff pma) const
+map map::preimage_range_pw_multi_aff(pw_multi_aff pma) const
 {
   auto res = isl_map_preimage_range_pw_multi_aff(copy(), pma.release());
   return manage(res);
 }
 
-isl::map map::product(isl::map map2) const
+map map::product(map map2) const
 {
   auto res = isl_map_product(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::project_out(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::set map::range() const
+set map::range() const
 {
   auto res = isl_map_range(copy());
   return manage(res);
 }
 
-isl::map map::range_curry() const
+map map::range_curry() const
 {
   auto res = isl_map_range_curry(copy());
   return manage(res);
 }
 
-isl::map map::range_factor_domain() const
+map map::range_factor_domain() const
 {
   auto res = isl_map_range_factor_domain(copy());
   return manage(res);
 }
 
-isl::map map::range_factor_range() const
+map map::range_factor_range() const
 {
   auto res = isl_map_range_factor_range(copy());
   return manage(res);
 }
 
-isl::boolean map::range_is_wrapping() const
+boolean map::range_is_wrapping() const
 {
   auto res = isl_map_range_is_wrapping(get());
   return manage(res);
 }
 
-isl::map map::range_map() const
+map map::range_map() const
 {
   auto res = isl_map_range_map(copy());
   return manage(res);
 }
 
-isl::map map::range_product(isl::map map2) const
+map map::range_product(map map2) const
 {
   auto res = isl_map_range_product(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::remove_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::map map::remove_divs() const
+map map::remove_divs() const
 {
   auto res = isl_map_remove_divs(copy());
   return manage(res);
 }
 
-isl::map map::remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::map map::remove_redundancies() const
+map map::remove_redundancies() const
 {
   auto res = isl_map_remove_redundancies(copy());
   return manage(res);
 }
 
-isl::map map::remove_unknown_divs() const
+map map::remove_unknown_divs() const
 {
   auto res = isl_map_remove_unknown_divs(copy());
   return manage(res);
 }
 
-isl::map map::reset_tuple_id(isl::dim type) const
+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);
 }
 
-isl::map map::reset_user() const
+map map::reset_user() const
 {
   auto res = isl_map_reset_user(copy());
   return manage(res);
 }
 
-isl::map map::reverse() const
+map map::reverse() const
 {
   auto res = isl_map_reverse(copy());
   return manage(res);
 }
 
-isl::basic_map map::sample() const
+basic_map map::sample() const
 {
   auto res = isl_map_sample(copy());
   return manage(res);
 }
 
-isl::map map::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::map map::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::map map::set_tuple_name(isl::dim type, const std::string &s) const
+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);
 }
 
-isl::basic_map map::simple_hull() const
+basic_map map::simple_hull() const
 {
   auto res = isl_map_simple_hull(copy());
   return manage(res);
 }
 
-isl::map map::subtract(isl::map map2) const
+map map::subtract(map map2) const
 {
   auto res = isl_map_subtract(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::subtract_domain(isl::set dom) const
+map map::subtract_domain(set dom) const
 {
   auto res = isl_map_subtract_domain(copy(), dom.release());
   return manage(res);
 }
 
-isl::map map::subtract_range(isl::set dom) const
+map map::subtract_range(set dom) const
 {
   auto res = isl_map_subtract_range(copy(), dom.release());
   return manage(res);
 }
 
-isl::map map::sum(isl::map map2) const
+map map::sum(map map2) const
 {
   auto res = isl_map_sum(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::uncurry() const
+map map::uncurry() const
 {
   auto res = isl_map_uncurry(copy());
   return manage(res);
 }
 
-isl::map map::unite(isl::map map2) const
+map map::unite(map map2) const
 {
   auto res = isl_map_union(copy(), map2.release());
   return manage(res);
 }
 
-isl::map map::universe(isl::space space)
+map map::universe(space space)
 {
   auto res = isl_map_universe(space.release());
   return manage(res);
 }
 
-isl::basic_map map::unshifted_simple_hull() const
+basic_map map::unshifted_simple_hull() const
 {
   auto res = isl_map_unshifted_simple_hull(copy());
   return manage(res);
 }
 
-isl::basic_map map::unshifted_simple_hull_from_map_list(isl::map_list list) const
+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);
 }
 
-isl::map map::upper_bound_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::set map::wrap() const
+set map::wrap() const
 {
   auto res = isl_map_wrap(copy());
   return manage(res);
 }
 
-isl::map map::zip() const
+map map::zip() const
 {
   auto res = isl_map_zip(copy());
   return manage(res);
 }
 
 // implementations for isl::map_list
-isl::map_list manage(__isl_take isl_map_list *ptr) {
+map_list manage(__isl_take isl_map_list *ptr) {
   return map_list(ptr);
 }
-isl::map_list manage_copy(__isl_keep isl_map_list *ptr) {
+map_list manage_copy(__isl_keep isl_map_list *ptr) {
   ptr = isl_map_list_copy(ptr);
   return map_list(ptr);
 }
@@ -9059,7 +9059,7 @@
 map_list::map_list()
     : ptr(nullptr) {}
 
-map_list::map_list(const isl::map_list &obj)
+map_list::map_list(const map_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -9072,7 +9072,7 @@
     : ptr(ptr) {}
 
 
-map_list &map_list::operator=(isl::map_list obj) {
+map_list &map_list::operator=(map_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -9104,8 +9104,8 @@
 }
 
 
-isl::ctx map_list::get_ctx() const {
-  return isl::ctx(isl_map_list_get_ctx(ptr));
+ctx map_list::get_ctx() const {
+  return ctx(isl_map_list_get_ctx(ptr));
 }
 
 void map_list::dump() const {
@@ -9113,63 +9113,63 @@
 }
 
 
-isl::map_list map_list::add(isl::map el) const
+map_list map_list::add(map el) const
 {
   auto res = isl_map_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::map_list map_list::alloc(isl::ctx ctx, int n)
+map_list map_list::alloc(ctx ctx, int n)
 {
   auto res = isl_map_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::map_list map_list::concat(isl::map_list list2) const
+map_list map_list::concat(map_list list2) const
 {
   auto res = isl_map_list_concat(copy(), list2.release());
   return manage(res);
 }
 
-isl::map_list map_list::drop(unsigned int first, unsigned int n) const
+map_list map_list::drop(unsigned int first, unsigned int n) const
 {
   auto res = isl_map_list_drop(copy(), first, n);
   return manage(res);
 }
 
-isl::stat map_list::foreach(const std::function<isl::stat(isl::map)> &fn) const
+stat map_list::foreach(const std::function<stat(map)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::map)> *func;
+    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)(isl::manage(arg_0));
+    stat ret = (*data->func)(manage(arg_0));
     return ret.release();
   };
   auto res = isl_map_list_foreach(get(), fn_lambda, &fn_data);
   return manage(res);
 }
 
-isl::map_list map_list::from_map(isl::map el)
+map_list map_list::from_map(map el)
 {
   auto res = isl_map_list_from_map(el.release());
   return manage(res);
 }
 
-isl::map map_list::get_at(int index) const
+map map_list::get_at(int index) const
 {
   auto res = isl_map_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::map map_list::get_map(int index) const
+map map_list::get_map(int index) const
 {
   auto res = isl_map_list_get_map(get(), index);
   return manage(res);
 }
 
-isl::map_list map_list::insert(unsigned int pos, isl::map el) const
+map_list map_list::insert(unsigned int pos, map el) const
 {
   auto res = isl_map_list_insert(copy(), pos, el.release());
   return manage(res);
@@ -9181,13 +9181,13 @@
   return res;
 }
 
-isl::map_list map_list::reverse() const
+map_list map_list::reverse() const
 {
   auto res = isl_map_list_reverse(copy());
   return manage(res);
 }
 
-isl::map_list map_list::set_map(int index, isl::map el) const
+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);
@@ -9199,17 +9199,17 @@
   return res;
 }
 
-isl::map_list map_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::mat manage(__isl_take isl_mat *ptr) {
+mat manage(__isl_take isl_mat *ptr) {
   return mat(ptr);
 }
-isl::mat manage_copy(__isl_keep isl_mat *ptr) {
+mat manage_copy(__isl_keep isl_mat *ptr) {
   ptr = isl_mat_copy(ptr);
   return mat(ptr);
 }
@@ -9217,7 +9217,7 @@
 mat::mat()
     : ptr(nullptr) {}
 
-mat::mat(const isl::mat &obj)
+mat::mat(const mat &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -9230,7 +9230,7 @@
     : ptr(ptr) {}
 
 
-mat &mat::operator=(isl::mat obj) {
+mat &mat::operator=(mat obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -9262,8 +9262,8 @@
 }
 
 
-isl::ctx mat::get_ctx() const {
-  return isl::ctx(isl_mat_get_ctx(ptr));
+ctx mat::get_ctx() const {
+  return ctx(isl_mat_get_ctx(ptr));
 }
 
 void mat::dump() const {
@@ -9271,31 +9271,31 @@
 }
 
 
-isl::mat mat::add_rows(unsigned int n) const
+mat mat::add_rows(unsigned int n) const
 {
   auto res = isl_mat_add_rows(copy(), n);
   return manage(res);
 }
 
-isl::mat mat::add_zero_cols(unsigned int n) const
+mat mat::add_zero_cols(unsigned int n) const
 {
   auto res = isl_mat_add_zero_cols(copy(), n);
   return manage(res);
 }
 
-isl::mat mat::add_zero_rows(unsigned int n) const
+mat mat::add_zero_rows(unsigned int n) const
 {
   auto res = isl_mat_add_zero_rows(copy(), n);
   return manage(res);
 }
 
-isl::mat mat::aff_direct_sum(isl::mat right) const
+mat mat::aff_direct_sum(mat right) const
 {
   auto res = isl_mat_aff_direct_sum(copy(), right.release());
   return manage(res);
 }
 
-isl::mat mat::alloc(isl::ctx ctx, unsigned int n_row, unsigned int n_col)
+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);
@@ -9307,43 +9307,43 @@
   return res;
 }
 
-isl::mat mat::concat(isl::mat bot) const
+mat mat::concat(mat bot) const
 {
   auto res = isl_mat_concat(copy(), bot.release());
   return manage(res);
 }
 
-isl::mat mat::diagonal(isl::mat mat2) const
+mat mat::diagonal(mat mat2) const
 {
   auto res = isl_mat_diagonal(copy(), mat2.release());
   return manage(res);
 }
 
-isl::mat mat::drop_cols(unsigned int col, unsigned int n) const
+mat mat::drop_cols(unsigned int col, unsigned int n) const
 {
   auto res = isl_mat_drop_cols(copy(), col, n);
   return manage(res);
 }
 
-isl::mat mat::drop_rows(unsigned int row, unsigned int n) const
+mat mat::drop_rows(unsigned int row, unsigned int n) const
 {
   auto res = isl_mat_drop_rows(copy(), row, n);
   return manage(res);
 }
 
-isl::mat mat::from_row_vec(isl::vec vec)
+mat mat::from_row_vec(vec vec)
 {
   auto res = isl_mat_from_row_vec(vec.release());
   return manage(res);
 }
 
-isl::val mat::get_element_val(int row, int col) const
+val mat::get_element_val(int row, int col) const
 {
   auto res = isl_mat_get_element_val(get(), row, col);
   return manage(res);
 }
 
-isl::boolean mat::has_linearly_independent_rows(const isl::mat &mat2) const
+boolean mat::has_linearly_independent_rows(const mat &mat2) const
 {
   auto res = isl_mat_has_linearly_independent_rows(get(), mat2.get());
   return manage(res);
@@ -9355,67 +9355,67 @@
   return res;
 }
 
-isl::mat mat::insert_cols(unsigned int col, unsigned int n) const
+mat mat::insert_cols(unsigned int col, unsigned int n) const
 {
   auto res = isl_mat_insert_cols(copy(), col, n);
   return manage(res);
 }
 
-isl::mat mat::insert_rows(unsigned int row, unsigned int n) const
+mat mat::insert_rows(unsigned int row, unsigned int n) const
 {
   auto res = isl_mat_insert_rows(copy(), row, n);
   return manage(res);
 }
 
-isl::mat mat::insert_zero_cols(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::mat mat::insert_zero_rows(unsigned int row, unsigned int n) const
+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);
 }
 
-isl::mat mat::inverse_product(isl::mat right) const
+mat mat::inverse_product(mat right) const
 {
   auto res = isl_mat_inverse_product(copy(), right.release());
   return manage(res);
 }
 
-isl::boolean mat::is_equal(const isl::mat &mat2) const
+boolean mat::is_equal(const mat &mat2) const
 {
   auto res = isl_mat_is_equal(get(), mat2.get());
   return manage(res);
 }
 
-isl::mat mat::lin_to_aff() const
+mat mat::lin_to_aff() const
 {
   auto res = isl_mat_lin_to_aff(copy());
   return manage(res);
 }
 
-isl::mat mat::move_cols(unsigned int dst_col, unsigned int src_col, unsigned int n) const
+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);
 }
 
-isl::mat mat::normalize() const
+mat mat::normalize() const
 {
   auto res = isl_mat_normalize(copy());
   return manage(res);
 }
 
-isl::mat mat::normalize_row(int row) const
+mat mat::normalize_row(int row) const
 {
   auto res = isl_mat_normalize_row(copy(), row);
   return manage(res);
 }
 
-isl::mat mat::product(isl::mat right) const
+mat mat::product(mat right) const
 {
   auto res = isl_mat_product(copy(), right.release());
   return manage(res);
@@ -9427,25 +9427,25 @@
   return res;
 }
 
-isl::mat mat::right_inverse() const
+mat mat::right_inverse() const
 {
   auto res = isl_mat_right_inverse(copy());
   return manage(res);
 }
 
-isl::mat mat::right_kernel() const
+mat mat::right_kernel() const
 {
   auto res = isl_mat_right_kernel(copy());
   return manage(res);
 }
 
-isl::mat mat::row_basis() const
+mat mat::row_basis() const
 {
   auto res = isl_mat_row_basis(copy());
   return manage(res);
 }
 
-isl::mat mat::row_basis_extension(isl::mat mat2) const
+mat mat::row_basis_extension(mat mat2) const
 {
   auto res = isl_mat_row_basis_extension(copy(), mat2.release());
   return manage(res);
@@ -9457,65 +9457,65 @@
   return res;
 }
 
-isl::mat mat::set_element_si(int row, int col, int v) const
+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);
 }
 
-isl::mat mat::set_element_val(int row, int col, isl::val v) const
+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);
 }
 
-isl::mat mat::swap_cols(unsigned int i, unsigned int j) const
+mat mat::swap_cols(unsigned int i, unsigned int j) const
 {
   auto res = isl_mat_swap_cols(copy(), i, j);
   return manage(res);
 }
 
-isl::mat mat::swap_rows(unsigned int i, unsigned int j) const
+mat mat::swap_rows(unsigned int i, unsigned int j) const
 {
   auto res = isl_mat_swap_rows(copy(), i, j);
   return manage(res);
 }
 
-isl::mat mat::transpose() const
+mat mat::transpose() const
 {
   auto res = isl_mat_transpose(copy());
   return manage(res);
 }
 
-isl::mat mat::unimodular_complete(int row) const
+mat mat::unimodular_complete(int row) const
 {
   auto res = isl_mat_unimodular_complete(copy(), row);
   return manage(res);
 }
 
-isl::mat mat::vec_concat(isl::vec bot) const
+mat mat::vec_concat(vec bot) const
 {
   auto res = isl_mat_vec_concat(copy(), bot.release());
   return manage(res);
 }
 
-isl::vec mat::vec_inverse_product(isl::vec vec) const
+vec mat::vec_inverse_product(vec vec) const
 {
   auto res = isl_mat_vec_inverse_product(copy(), vec.release());
   return manage(res);
 }
 
-isl::vec mat::vec_product(isl::vec vec) const
+vec mat::vec_product(vec vec) const
 {
   auto res = isl_mat_vec_product(copy(), vec.release());
   return manage(res);
 }
 
 // implementations for isl::multi_aff
-isl::multi_aff manage(__isl_take isl_multi_aff *ptr) {
+multi_aff manage(__isl_take isl_multi_aff *ptr) {
   return multi_aff(ptr);
 }
-isl::multi_aff manage_copy(__isl_keep isl_multi_aff *ptr) {
+multi_aff manage_copy(__isl_keep isl_multi_aff *ptr) {
   ptr = isl_multi_aff_copy(ptr);
   return multi_aff(ptr);
 }
@@ -9523,7 +9523,7 @@
 multi_aff::multi_aff()
     : ptr(nullptr) {}
 
-multi_aff::multi_aff(const isl::multi_aff &obj)
+multi_aff::multi_aff(const multi_aff &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -9535,18 +9535,18 @@
 multi_aff::multi_aff(__isl_take isl_multi_aff *ptr)
     : ptr(ptr) {}
 
-multi_aff::multi_aff(isl::aff aff)
+multi_aff::multi_aff(aff aff)
 {
   auto res = isl_multi_aff_from_aff(aff.release());
   ptr = res;
 }
-multi_aff::multi_aff(isl::ctx ctx, const std::string &str)
+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=(isl::multi_aff obj) {
+multi_aff &multi_aff::operator=(multi_aff obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -9578,8 +9578,8 @@
 }
 
 
-isl::ctx multi_aff::get_ctx() const {
-  return isl::ctx(isl_multi_aff_get_ctx(ptr));
+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());
@@ -9596,19 +9596,19 @@
 }
 
 
-isl::multi_aff multi_aff::add(isl::multi_aff multi2) const
+multi_aff multi_aff::add(multi_aff multi2) const
 {
   auto res = isl_multi_aff_add(copy(), multi2.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::multi_aff multi_aff::align_params(isl::space model) const
+multi_aff multi_aff::align_params(space model) const
 {
   auto res = isl_multi_aff_align_params(copy(), model.release());
   return manage(res);
@@ -9620,25 +9620,25 @@
   return res;
 }
 
-isl::multi_aff multi_aff::domain_map(isl::space space)
+multi_aff multi_aff::domain_map(space space)
 {
   auto res = isl_multi_aff_domain_map(space.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::multi_aff multi_aff::factor_range() const
+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 isl::id &id) const
+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;
@@ -9650,67 +9650,67 @@
   return res;
 }
 
-isl::multi_aff multi_aff::flat_range_product(isl::multi_aff multi2) const
+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);
 }
 
-isl::multi_aff multi_aff::flatten_domain() const
+multi_aff multi_aff::flatten_domain() const
 {
   auto res = isl_multi_aff_flatten_domain(copy());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::flatten_range() const
+multi_aff multi_aff::flatten_range() const
 {
   auto res = isl_multi_aff_flatten_range(copy());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::floor() const
+multi_aff multi_aff::floor() const
 {
   auto res = isl_multi_aff_floor(copy());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::from_aff_list(isl::space space, isl::aff_list list)
+multi_aff multi_aff::from_aff_list(space space, aff_list list)
 {
   auto res = isl_multi_aff_from_aff_list(space.release(), list.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::from_range() const
+multi_aff multi_aff::from_range() const
 {
   auto res = isl_multi_aff_from_range(copy());
   return manage(res);
 }
 
-isl::aff multi_aff::get_aff(int pos) const
+aff multi_aff::get_aff(int pos) const
 {
   auto res = isl_multi_aff_get_aff(get(), pos);
   return manage(res);
 }
 
-isl::id multi_aff::get_dim_id(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::space multi_aff::get_domain_space() const
+space multi_aff::get_domain_space() const
 {
   auto res = isl_multi_aff_get_domain_space(get());
   return manage(res);
 }
 
-isl::space multi_aff::get_space() const
+space multi_aff::get_space() const
 {
   auto res = isl_multi_aff_get_space(get());
   return manage(res);
 }
 
-isl::id multi_aff::get_tuple_id(isl::dim type) const
+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);
@@ -9723,251 +9723,251 @@
   return tmp;
 }
 
-isl::multi_aff multi_aff::gist(isl::set context) const
+multi_aff multi_aff::gist(set context) const
 {
   auto res = isl_multi_aff_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::gist_params(isl::set context) const
+multi_aff multi_aff::gist_params(set context) const
 {
   auto res = isl_multi_aff_gist_params(copy(), context.release());
   return manage(res);
 }
 
-isl::boolean multi_aff::has_tuple_id(isl::dim type) const
+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);
 }
 
-isl::multi_aff multi_aff::identity(isl::space space)
+multi_aff multi_aff::identity(space space)
 {
   auto res = isl_multi_aff_identity(space.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean multi_aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean multi_aff::involves_nan() const
+boolean multi_aff::involves_nan() const
 {
   auto res = isl_multi_aff_involves_nan(get());
   return manage(res);
 }
 
-isl::set multi_aff::lex_ge_set(isl::multi_aff ma2) const
+set multi_aff::lex_ge_set(multi_aff ma2) const
 {
   auto res = isl_multi_aff_lex_ge_set(copy(), ma2.release());
   return manage(res);
 }
 
-isl::set multi_aff::lex_gt_set(isl::multi_aff ma2) const
+set multi_aff::lex_gt_set(multi_aff ma2) const
 {
   auto res = isl_multi_aff_lex_gt_set(copy(), ma2.release());
   return manage(res);
 }
 
-isl::set multi_aff::lex_le_set(isl::multi_aff ma2) const
+set multi_aff::lex_le_set(multi_aff ma2) const
 {
   auto res = isl_multi_aff_lex_le_set(copy(), ma2.release());
   return manage(res);
 }
 
-isl::set multi_aff::lex_lt_set(isl::multi_aff ma2) const
+set multi_aff::lex_lt_set(multi_aff ma2) const
 {
   auto res = isl_multi_aff_lex_lt_set(copy(), ma2.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::mod_multi_val(isl::multi_val mv) const
+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);
 }
 
-isl::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
+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);
 }
 
-isl::multi_aff multi_aff::multi_val_on_space(isl::space space, isl::multi_val mv)
+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);
 }
 
-isl::multi_aff multi_aff::neg() const
+multi_aff multi_aff::neg() const
 {
   auto res = isl_multi_aff_neg(copy());
   return manage(res);
 }
 
-int multi_aff::plain_cmp(const isl::multi_aff &multi2) const
+int multi_aff::plain_cmp(const multi_aff &multi2) const
 {
   auto res = isl_multi_aff_plain_cmp(get(), multi2.get());
   return res;
 }
 
-isl::boolean multi_aff::plain_is_equal(const isl::multi_aff &multi2) const
+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);
 }
 
-isl::multi_aff multi_aff::product(isl::multi_aff multi2) const
+multi_aff multi_aff::product(multi_aff multi2) const
 {
   auto res = isl_multi_aff_product(copy(), multi2.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::project_domain_on_params() const
+multi_aff multi_aff::project_domain_on_params() const
 {
   auto res = isl_multi_aff_project_domain_on_params(copy());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::project_out_map(isl::space space, isl::dim type, unsigned int first, unsigned int n)
+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);
 }
 
-isl::multi_aff multi_aff::pullback(isl::multi_aff ma2) const
+multi_aff multi_aff::pullback(multi_aff ma2) const
 {
   auto res = isl_multi_aff_pullback_multi_aff(copy(), ma2.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::range_factor_domain() const
+multi_aff multi_aff::range_factor_domain() const
 {
   auto res = isl_multi_aff_range_factor_domain(copy());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::range_factor_range() const
+multi_aff multi_aff::range_factor_range() const
 {
   auto res = isl_multi_aff_range_factor_range(copy());
   return manage(res);
 }
 
-isl::boolean multi_aff::range_is_wrapping() const
+boolean multi_aff::range_is_wrapping() const
 {
   auto res = isl_multi_aff_range_is_wrapping(get());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::range_map(isl::space space)
+multi_aff multi_aff::range_map(space space)
 {
   auto res = isl_multi_aff_range_map(space.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::range_product(isl::multi_aff multi2) const
+multi_aff multi_aff::range_product(multi_aff multi2) const
 {
   auto res = isl_multi_aff_range_product(copy(), multi2.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::range_splice(unsigned int pos, isl::multi_aff multi2) const
+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);
 }
 
-isl::multi_aff multi_aff::reset_tuple_id(isl::dim type) const
+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);
 }
 
-isl::multi_aff multi_aff::reset_user() const
+multi_aff multi_aff::reset_user() const
 {
   auto res = isl_multi_aff_reset_user(copy());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::scale_down_multi_val(isl::multi_val mv) const
+multi_aff multi_aff::scale_down_multi_val(multi_val mv) const
 {
   auto res = isl_multi_aff_scale_down_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::scale_down_val(isl::val v) const
+multi_aff multi_aff::scale_down_val(val v) const
 {
   auto res = isl_multi_aff_scale_down_val(copy(), v.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::scale_multi_val(isl::multi_val mv) const
+multi_aff multi_aff::scale_multi_val(multi_val mv) const
 {
   auto res = isl_multi_aff_scale_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::scale_val(isl::val v) const
+multi_aff multi_aff::scale_val(val v) const
 {
   auto res = isl_multi_aff_scale_val(copy(), v.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::set_aff(int pos, isl::aff el) const
+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);
 }
 
-isl::multi_aff multi_aff::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::multi_aff multi_aff::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::multi_aff multi_aff::set_tuple_name(isl::dim type, const std::string &s) const
+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::multi_aff multi_aff::splice(unsigned int in_pos, unsigned int out_pos, isl::multi_aff multi2) const
+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);
 }
 
-isl::multi_aff multi_aff::sub(isl::multi_aff multi2) const
+multi_aff multi_aff::sub(multi_aff multi2) const
 {
   auto res = isl_multi_aff_sub(copy(), multi2.release());
   return manage(res);
 }
 
-isl::multi_aff multi_aff::zero(isl::space space)
+multi_aff multi_aff::zero(space space)
 {
   auto res = isl_multi_aff_zero(space.release());
   return manage(res);
 }
 
 // implementations for isl::multi_pw_aff
-isl::multi_pw_aff manage(__isl_take isl_multi_pw_aff *ptr) {
+multi_pw_aff manage(__isl_take isl_multi_pw_aff *ptr) {
   return multi_pw_aff(ptr);
 }
-isl::multi_pw_aff manage_copy(__isl_keep isl_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);
 }
@@ -9975,7 +9975,7 @@
 multi_pw_aff::multi_pw_aff()
     : ptr(nullptr) {}
 
-multi_pw_aff::multi_pw_aff(const isl::multi_pw_aff &obj)
+multi_pw_aff::multi_pw_aff(const multi_pw_aff &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -9987,28 +9987,28 @@
 multi_pw_aff::multi_pw_aff(__isl_take isl_multi_pw_aff *ptr)
     : ptr(ptr) {}
 
-multi_pw_aff::multi_pw_aff(isl::multi_aff ma)
+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(isl::pw_aff pa)
+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(isl::pw_multi_aff pma)
+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(isl::ctx ctx, const std::string &str)
+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=(isl::multi_pw_aff obj) {
+multi_pw_aff &multi_pw_aff::operator=(multi_pw_aff obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -10040,8 +10040,8 @@
 }
 
 
-isl::ctx multi_pw_aff::get_ctx() const {
-  return isl::ctx(isl_multi_pw_aff_get_ctx(ptr));
+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());
@@ -10058,25 +10058,25 @@
 }
 
 
-isl::multi_pw_aff multi_pw_aff::add(isl::multi_pw_aff multi2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::align_params(isl::space model) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::coalesce() const
+multi_pw_aff multi_pw_aff::coalesce() const
 {
   auto res = isl_multi_pw_aff_coalesce(copy());
   return manage(res);
@@ -10088,31 +10088,31 @@
   return res;
 }
 
-isl::set multi_pw_aff::domain() const
+set multi_pw_aff::domain() const
 {
   auto res = isl_multi_pw_aff_domain(copy());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::map multi_pw_aff::eq_map(isl::multi_pw_aff mpa2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::factor_range() const
+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 isl::id &id) const
+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;
@@ -10124,37 +10124,37 @@
   return res;
 }
 
-isl::multi_pw_aff multi_pw_aff::flat_range_product(isl::multi_pw_aff multi2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::flatten_range() const
+multi_pw_aff multi_pw_aff::flatten_range() const
 {
   auto res = isl_multi_pw_aff_flatten_range(copy());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::from_pw_aff_list(isl::space space, isl::pw_aff_list list)
+multi_pw_aff multi_pw_aff::from_pw_aff_list(space space, pw_aff_list list)
 {
   auto res = isl_multi_pw_aff_from_pw_aff_list(space.release(), list.release());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::from_range() const
+multi_pw_aff multi_pw_aff::from_range() const
 {
   auto res = isl_multi_pw_aff_from_range(copy());
   return manage(res);
 }
 
-isl::id multi_pw_aff::get_dim_id(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::space multi_pw_aff::get_domain_space() const
+space multi_pw_aff::get_domain_space() const
 {
   auto res = isl_multi_pw_aff_get_domain_space(get());
   return manage(res);
@@ -10166,19 +10166,19 @@
   return res;
 }
 
-isl::pw_aff multi_pw_aff::get_pw_aff(int pos) const
+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);
 }
 
-isl::space multi_pw_aff::get_space() const
+space multi_pw_aff::get_space() const
 {
   auto res = isl_multi_pw_aff_get_space(get());
   return manage(res);
 }
 
-isl::id multi_pw_aff::get_tuple_id(isl::dim type) const
+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);
@@ -10191,251 +10191,251 @@
   return tmp;
 }
 
-isl::multi_pw_aff multi_pw_aff::gist(isl::set set) const
+multi_pw_aff multi_pw_aff::gist(set set) const
 {
   auto res = isl_multi_pw_aff_gist(copy(), set.release());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::gist_params(isl::set set) const
+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);
 }
 
-isl::boolean multi_pw_aff::has_tuple_id(isl::dim type) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::identity(isl::space space)
+multi_pw_aff multi_pw_aff::identity(space space)
 {
   auto res = isl_multi_pw_aff_identity(space.release());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::intersect_domain(isl::set domain) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::intersect_params(isl::set set) const
+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);
 }
 
-isl::boolean multi_pw_aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean multi_pw_aff::involves_nan() const
+boolean multi_pw_aff::involves_nan() const
 {
   auto res = isl_multi_pw_aff_involves_nan(get());
   return manage(res);
 }
 
-isl::boolean multi_pw_aff::is_cst() const
+boolean multi_pw_aff::is_cst() const
 {
   auto res = isl_multi_pw_aff_is_cst(get());
   return manage(res);
 }
 
-isl::boolean multi_pw_aff::is_equal(const isl::multi_pw_aff &mpa2) const
+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);
 }
 
-isl::map multi_pw_aff::lex_gt_map(isl::multi_pw_aff mpa2) const
+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);
 }
 
-isl::map multi_pw_aff::lex_lt_map(isl::multi_pw_aff mpa2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::mod_multi_val(isl::multi_val mv) const
+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);
 }
 
-isl::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
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::neg() const
+multi_pw_aff multi_pw_aff::neg() const
 {
   auto res = isl_multi_pw_aff_neg(copy());
   return manage(res);
 }
 
-isl::boolean multi_pw_aff::plain_is_equal(const isl::multi_pw_aff &multi2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::product(isl::multi_pw_aff multi2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::project_domain_on_params() const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::pullback(isl::multi_aff ma) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::pullback(isl::pw_multi_aff pma) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::pullback(isl::multi_pw_aff mpa2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::range_factor_domain() const
+multi_pw_aff multi_pw_aff::range_factor_domain() const
 {
   auto res = isl_multi_pw_aff_range_factor_domain(copy());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::range_factor_range() const
+multi_pw_aff multi_pw_aff::range_factor_range() const
 {
   auto res = isl_multi_pw_aff_range_factor_range(copy());
   return manage(res);
 }
 
-isl::boolean multi_pw_aff::range_is_wrapping() const
+boolean multi_pw_aff::range_is_wrapping() const
 {
   auto res = isl_multi_pw_aff_range_is_wrapping(get());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::range_product(isl::multi_pw_aff multi2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::range_splice(unsigned int pos, isl::multi_pw_aff multi2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::reset_tuple_id(isl::dim type) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::reset_user() const
+multi_pw_aff multi_pw_aff::reset_user() const
 {
   auto res = isl_multi_pw_aff_reset_user(copy());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::scale_down_multi_val(isl::multi_val mv) const
+multi_pw_aff multi_pw_aff::scale_down_multi_val(multi_val mv) const
 {
   auto res = isl_multi_pw_aff_scale_down_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::scale_down_val(isl::val v) const
+multi_pw_aff multi_pw_aff::scale_down_val(val v) const
 {
   auto res = isl_multi_pw_aff_scale_down_val(copy(), v.release());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::scale_multi_val(isl::multi_val mv) const
+multi_pw_aff multi_pw_aff::scale_multi_val(multi_val mv) const
 {
   auto res = isl_multi_pw_aff_scale_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::scale_val(isl::val v) const
+multi_pw_aff multi_pw_aff::scale_val(val v) const
 {
   auto res = isl_multi_pw_aff_scale_val(copy(), v.release());
   return manage(res);
 }
 
-isl::multi_pw_aff multi_pw_aff::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::set_pw_aff(int pos, isl::pw_aff el) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::set_tuple_name(isl::dim type, const std::string &s) const
+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::multi_pw_aff multi_pw_aff::splice(unsigned int in_pos, unsigned int out_pos, isl::multi_pw_aff multi2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::sub(isl::multi_pw_aff multi2) const
+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);
 }
 
-isl::multi_pw_aff multi_pw_aff::zero(isl::space space)
+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
-isl::multi_union_pw_aff manage(__isl_take isl_multi_union_pw_aff *ptr) {
+multi_union_pw_aff manage(__isl_take isl_multi_union_pw_aff *ptr) {
   return multi_union_pw_aff(ptr);
 }
-isl::multi_union_pw_aff manage_copy(__isl_keep isl_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);
 }
@@ -10443,7 +10443,7 @@
 multi_union_pw_aff::multi_union_pw_aff()
     : ptr(nullptr) {}
 
-multi_union_pw_aff::multi_union_pw_aff(const isl::multi_union_pw_aff &obj)
+multi_union_pw_aff::multi_union_pw_aff(const multi_union_pw_aff &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -10455,28 +10455,28 @@
 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(isl::union_pw_aff upa)
+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(isl::multi_pw_aff mpa)
+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(isl::union_pw_multi_aff upma)
+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(isl::ctx ctx, const std::string &str)
+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=(isl::multi_union_pw_aff obj) {
+multi_union_pw_aff &multi_union_pw_aff::operator=(multi_union_pw_aff obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -10508,8 +10508,8 @@
 }
 
 
-isl::ctx multi_union_pw_aff::get_ctx() const {
-  return isl::ctx(isl_multi_union_pw_aff_get_ctx(ptr));
+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());
@@ -10526,37 +10526,37 @@
 }
 
 
-isl::multi_union_pw_aff multi_union_pw_aff::add(isl::multi_union_pw_aff multi2) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::align_params(isl::space model) const
+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);
 }
 
-isl::union_pw_aff multi_union_pw_aff::apply_aff(isl::aff aff) const
+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);
 }
 
-isl::union_pw_aff multi_union_pw_aff::apply_pw_aff(isl::pw_aff pa) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::apply_pw_multi_aff(isl::pw_multi_aff pma) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::coalesce() const
+multi_union_pw_aff multi_union_pw_aff::coalesce() const
 {
   auto res = isl_multi_union_pw_aff_coalesce(copy());
   return manage(res);
@@ -10568,31 +10568,31 @@
   return res;
 }
 
-isl::union_set multi_union_pw_aff::domain() const
+union_set multi_union_pw_aff::domain() const
 {
   auto res = isl_multi_union_pw_aff_domain(copy());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::multi_pw_aff multi_union_pw_aff::extract_multi_pw_aff(isl::space space) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::factor_range() const
+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 isl::id &id) const
+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;
@@ -10604,67 +10604,67 @@
   return res;
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::flat_range_product(isl::multi_union_pw_aff multi2) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::flatten_range() const
+multi_union_pw_aff multi_union_pw_aff::flatten_range() const
 {
   auto res = isl_multi_union_pw_aff_flatten_range(copy());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::floor() const
+multi_union_pw_aff multi_union_pw_aff::floor() const
 {
   auto res = isl_multi_union_pw_aff_floor(copy());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::from_multi_aff(isl::multi_aff ma)
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::from_range() const
+multi_union_pw_aff multi_union_pw_aff::from_range() const
 {
   auto res = isl_multi_union_pw_aff_from_range(copy());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::from_union_map(isl::union_map umap)
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::from_union_pw_aff_list(isl::space space, isl::union_pw_aff_list list)
+multi_union_pw_aff multi_union_pw_aff::from_union_pw_aff_list(space space, union_pw_aff_list list)
 {
   auto res = isl_multi_union_pw_aff_from_union_pw_aff_list(space.release(), list.release());
   return manage(res);
 }
 
-isl::id multi_union_pw_aff::get_dim_id(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::space multi_union_pw_aff::get_domain_space() const
+space multi_union_pw_aff::get_domain_space() const
 {
   auto res = isl_multi_union_pw_aff_get_domain_space(get());
   return manage(res);
 }
 
-isl::space multi_union_pw_aff::get_space() const
+space multi_union_pw_aff::get_space() const
 {
   auto res = isl_multi_union_pw_aff_get_space(get());
   return manage(res);
 }
 
-isl::id multi_union_pw_aff::get_tuple_id(isl::dim type) const
+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);
@@ -10677,227 +10677,227 @@
   return tmp;
 }
 
-isl::union_pw_aff multi_union_pw_aff::get_union_pw_aff(int pos) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::gist(isl::union_set context) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::gist_params(isl::set context) const
+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);
 }
 
-isl::boolean multi_union_pw_aff::has_tuple_id(isl::dim type) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::intersect_domain(isl::union_set uset) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::intersect_params(isl::set params) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::intersect_range(isl::set set) const
+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);
 }
 
-isl::boolean multi_union_pw_aff::involves_nan() const
+boolean multi_union_pw_aff::involves_nan() const
 {
   auto res = isl_multi_union_pw_aff_involves_nan(get());
   return manage(res);
 }
 
-isl::multi_val multi_union_pw_aff::max_multi_val() const
+multi_val multi_union_pw_aff::max_multi_val() const
 {
   auto res = isl_multi_union_pw_aff_max_multi_val(copy());
   return manage(res);
 }
 
-isl::multi_val multi_union_pw_aff::min_multi_val() const
+multi_val multi_union_pw_aff::min_multi_val() const
 {
   auto res = isl_multi_union_pw_aff_min_multi_val(copy());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::mod_multi_val(isl::multi_val mv) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::multi_aff_on_domain(isl::union_set domain, isl::multi_aff ma)
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::multi_val_on_domain(isl::union_set domain, isl::multi_val mv)
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::neg() const
+multi_union_pw_aff multi_union_pw_aff::neg() const
 {
   auto res = isl_multi_union_pw_aff_neg(copy());
   return manage(res);
 }
 
-isl::boolean multi_union_pw_aff::plain_is_equal(const isl::multi_union_pw_aff &multi2) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::pullback(isl::union_pw_multi_aff upma) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::pw_multi_aff_on_domain(isl::union_set domain, isl::pw_multi_aff pma)
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::range_factor_domain() const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::range_factor_range() const
+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);
 }
 
-isl::boolean multi_union_pw_aff::range_is_wrapping() const
+boolean multi_union_pw_aff::range_is_wrapping() const
 {
   auto res = isl_multi_union_pw_aff_range_is_wrapping(get());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::range_product(isl::multi_union_pw_aff multi2) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::range_splice(unsigned int pos, isl::multi_union_pw_aff multi2) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::reset_tuple_id(isl::dim type) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::reset_user() const
+multi_union_pw_aff multi_union_pw_aff::reset_user() const
 {
   auto res = isl_multi_union_pw_aff_reset_user(copy());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::scale_down_multi_val(isl::multi_val mv) const
+multi_union_pw_aff multi_union_pw_aff::scale_down_multi_val(multi_val mv) const
 {
   auto res = isl_multi_union_pw_aff_scale_down_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::scale_down_val(isl::val v) const
+multi_union_pw_aff multi_union_pw_aff::scale_down_val(val v) const
 {
   auto res = isl_multi_union_pw_aff_scale_down_val(copy(), v.release());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::scale_multi_val(isl::multi_val mv) const
+multi_union_pw_aff multi_union_pw_aff::scale_multi_val(multi_val mv) const
 {
   auto res = isl_multi_union_pw_aff_scale_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::scale_val(isl::val v) const
+multi_union_pw_aff multi_union_pw_aff::scale_val(val v) const
 {
   auto res = isl_multi_union_pw_aff_scale_val(copy(), v.release());
   return manage(res);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::set_tuple_name(isl::dim type, const std::string &s) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::set_union_pw_aff(int pos, isl::union_pw_aff el) const
+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::multi_union_pw_aff multi_union_pw_aff::sub(isl::multi_union_pw_aff multi2) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::union_add(isl::multi_union_pw_aff mupa2) const
+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);
 }
 
-isl::multi_union_pw_aff multi_union_pw_aff::zero(isl::space space)
+multi_union_pw_aff multi_union_pw_aff::zero(space space)
 {
   auto res = isl_multi_union_pw_aff_zero(space.release());
   return manage(res);
 }
 
-isl::union_set multi_union_pw_aff::zero_union_set() const
+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
-isl::multi_val manage(__isl_take isl_multi_val *ptr) {
+multi_val manage(__isl_take isl_multi_val *ptr) {
   return multi_val(ptr);
 }
-isl::multi_val manage_copy(__isl_keep isl_multi_val *ptr) {
+multi_val manage_copy(__isl_keep isl_multi_val *ptr) {
   ptr = isl_multi_val_copy(ptr);
   return multi_val(ptr);
 }
@@ -10905,7 +10905,7 @@
 multi_val::multi_val()
     : ptr(nullptr) {}
 
-multi_val::multi_val(const isl::multi_val &obj)
+multi_val::multi_val(const multi_val &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -10918,7 +10918,7 @@
     : ptr(ptr) {}
 
 
-multi_val &multi_val::operator=(isl::multi_val obj) {
+multi_val &multi_val::operator=(multi_val obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -10950,8 +10950,8 @@
 }
 
 
-isl::ctx multi_val::get_ctx() const {
-  return isl::ctx(isl_multi_val_get_ctx(ptr));
+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());
@@ -10968,25 +10968,25 @@
 }
 
 
-isl::multi_val multi_val::add(isl::multi_val multi2) const
+multi_val multi_val::add(multi_val multi2) const
 {
   auto res = isl_multi_val_add(copy(), multi2.release());
   return manage(res);
 }
 
-isl::multi_val multi_val::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::multi_val multi_val::add_val(isl::val v) const
+multi_val multi_val::add_val(val v) const
 {
   auto res = isl_multi_val_add_val(copy(), v.release());
   return manage(res);
 }
 
-isl::multi_val multi_val::align_params(isl::space model) const
+multi_val multi_val::align_params(space model) const
 {
   auto res = isl_multi_val_align_params(copy(), model.release());
   return manage(res);
@@ -10998,19 +10998,19 @@
   return res;
 }
 
-isl::multi_val multi_val::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::multi_val multi_val::factor_range() const
+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 isl::id &id) const
+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;
@@ -11022,49 +11022,49 @@
   return res;
 }
 
-isl::multi_val multi_val::flat_range_product(isl::multi_val multi2) const
+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);
 }
 
-isl::multi_val multi_val::flatten_range() const
+multi_val multi_val::flatten_range() const
 {
   auto res = isl_multi_val_flatten_range(copy());
   return manage(res);
 }
 
-isl::multi_val multi_val::from_range() const
+multi_val multi_val::from_range() const
 {
   auto res = isl_multi_val_from_range(copy());
   return manage(res);
 }
 
-isl::multi_val multi_val::from_val_list(isl::space space, isl::val_list list)
+multi_val multi_val::from_val_list(space space, val_list list)
 {
   auto res = isl_multi_val_from_val_list(space.release(), list.release());
   return manage(res);
 }
 
-isl::id multi_val::get_dim_id(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::space multi_val::get_domain_space() const
+space multi_val::get_domain_space() const
 {
   auto res = isl_multi_val_get_domain_space(get());
   return manage(res);
 }
 
-isl::space multi_val::get_space() const
+space multi_val::get_space() const
 {
   auto res = isl_multi_val_get_space(get());
   return manage(res);
 }
 
-isl::id multi_val::get_tuple_id(isl::dim type) const
+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);
@@ -11077,191 +11077,191 @@
   return tmp;
 }
 
-isl::val multi_val::get_val(int pos) const
+val multi_val::get_val(int pos) const
 {
   auto res = isl_multi_val_get_val(get(), pos);
   return manage(res);
 }
 
-isl::boolean multi_val::has_tuple_id(isl::dim type) const
+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);
 }
 
-isl::multi_val multi_val::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean multi_val::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean multi_val::involves_nan() const
+boolean multi_val::involves_nan() const
 {
   auto res = isl_multi_val_involves_nan(get());
   return manage(res);
 }
 
-isl::multi_val multi_val::mod_multi_val(isl::multi_val mv) const
+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);
 }
 
-isl::multi_val multi_val::mod_val(isl::val v) const
+multi_val multi_val::mod_val(val v) const
 {
   auto res = isl_multi_val_mod_val(copy(), v.release());
   return manage(res);
 }
 
-isl::multi_val multi_val::neg() const
+multi_val multi_val::neg() const
 {
   auto res = isl_multi_val_neg(copy());
   return manage(res);
 }
 
-isl::boolean multi_val::plain_is_equal(const isl::multi_val &multi2) const
+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);
 }
 
-isl::multi_val multi_val::product(isl::multi_val multi2) const
+multi_val multi_val::product(multi_val multi2) const
 {
   auto res = isl_multi_val_product(copy(), multi2.release());
   return manage(res);
 }
 
-isl::multi_val multi_val::project_domain_on_params() const
+multi_val multi_val::project_domain_on_params() const
 {
   auto res = isl_multi_val_project_domain_on_params(copy());
   return manage(res);
 }
 
-isl::multi_val multi_val::range_factor_domain() const
+multi_val multi_val::range_factor_domain() const
 {
   auto res = isl_multi_val_range_factor_domain(copy());
   return manage(res);
 }
 
-isl::multi_val multi_val::range_factor_range() const
+multi_val multi_val::range_factor_range() const
 {
   auto res = isl_multi_val_range_factor_range(copy());
   return manage(res);
 }
 
-isl::boolean multi_val::range_is_wrapping() const
+boolean multi_val::range_is_wrapping() const
 {
   auto res = isl_multi_val_range_is_wrapping(get());
   return manage(res);
 }
 
-isl::multi_val multi_val::range_product(isl::multi_val multi2) const
+multi_val multi_val::range_product(multi_val multi2) const
 {
   auto res = isl_multi_val_range_product(copy(), multi2.release());
   return manage(res);
 }
 
-isl::multi_val multi_val::range_splice(unsigned int pos, isl::multi_val multi2) const
+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);
 }
 
-isl::multi_val multi_val::read_from_str(isl::ctx ctx, const std::string &str)
+multi_val multi_val::read_from_str(ctx ctx, const std::string &str)
 {
   auto res = isl_multi_val_read_from_str(ctx.release(), str.c_str());
   return manage(res);
 }
 
-isl::multi_val multi_val::reset_tuple_id(isl::dim type) const
+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);
 }
 
-isl::multi_val multi_val::reset_user() const
+multi_val multi_val::reset_user() const
 {
   auto res = isl_multi_val_reset_user(copy());
   return manage(res);
 }
 
-isl::multi_val multi_val::scale_down_multi_val(isl::multi_val mv) const
+multi_val multi_val::scale_down_multi_val(multi_val mv) const
 {
   auto res = isl_multi_val_scale_down_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-isl::multi_val multi_val::scale_down_val(isl::val v) const
+multi_val multi_val::scale_down_val(val v) const
 {
   auto res = isl_multi_val_scale_down_val(copy(), v.release());
   return manage(res);
 }
 
-isl::multi_val multi_val::scale_multi_val(isl::multi_val mv) const
+multi_val multi_val::scale_multi_val(multi_val mv) const
 {
   auto res = isl_multi_val_scale_multi_val(copy(), mv.release());
   return manage(res);
 }
 
-isl::multi_val multi_val::scale_val(isl::val v) const
+multi_val multi_val::scale_val(val v) const
 {
   auto res = isl_multi_val_scale_val(copy(), v.release());
   return manage(res);
 }
 
-isl::multi_val multi_val::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::multi_val multi_val::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::multi_val multi_val::set_tuple_name(isl::dim type, const std::string &s) const
+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);
 }
 
-isl::multi_val multi_val::set_val(int pos, isl::val el) const
+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::multi_val multi_val::splice(unsigned int in_pos, unsigned int out_pos, isl::multi_val multi2) const
+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);
 }
 
-isl::multi_val multi_val::sub(isl::multi_val multi2) const
+multi_val multi_val::sub(multi_val multi2) const
 {
   auto res = isl_multi_val_sub(copy(), multi2.release());
   return manage(res);
 }
 
-isl::multi_val multi_val::zero(isl::space space)
+multi_val multi_val::zero(space space)
 {
   auto res = isl_multi_val_zero(space.release());
   return manage(res);
 }
 
 // implementations for isl::point
-isl::point manage(__isl_take isl_point *ptr) {
+point manage(__isl_take isl_point *ptr) {
   return point(ptr);
 }
-isl::point manage_copy(__isl_keep isl_point *ptr) {
+point manage_copy(__isl_keep isl_point *ptr) {
   ptr = isl_point_copy(ptr);
   return point(ptr);
 }
@@ -11269,7 +11269,7 @@
 point::point()
     : ptr(nullptr) {}
 
-point::point(const isl::point &obj)
+point::point(const point &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -11281,13 +11281,13 @@
 point::point(__isl_take isl_point *ptr)
     : ptr(ptr) {}
 
-point::point(isl::space dim)
+point::point(space dim)
 {
   auto res = isl_point_zero(dim.release());
   ptr = res;
 }
 
-point &point::operator=(isl::point obj) {
+point &point::operator=(point obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -11319,8 +11319,8 @@
 }
 
 
-isl::ctx point::get_ctx() const {
-  return isl::ctx(isl_point_get_ctx(ptr));
+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());
@@ -11337,41 +11337,41 @@
 }
 
 
-isl::point point::add_ui(isl::dim type, int pos, unsigned int val) const
+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);
 }
 
-isl::val point::get_coordinate_val(isl::dim type, int pos) const
+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);
 }
 
-isl::space point::get_space() const
+space point::get_space() const
 {
   auto res = isl_point_get_space(get());
   return manage(res);
 }
 
-isl::point point::set_coordinate_val(isl::dim type, int pos, isl::val v) const
+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);
 }
 
-isl::point point::sub_ui(isl::dim type, int pos, unsigned int val) const
+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
-isl::pw_aff manage(__isl_take isl_pw_aff *ptr) {
+pw_aff manage(__isl_take isl_pw_aff *ptr) {
   return pw_aff(ptr);
 }
-isl::pw_aff manage_copy(__isl_keep isl_pw_aff *ptr) {
+pw_aff manage_copy(__isl_keep isl_pw_aff *ptr) {
   ptr = isl_pw_aff_copy(ptr);
   return pw_aff(ptr);
 }
@@ -11379,7 +11379,7 @@
 pw_aff::pw_aff()
     : ptr(nullptr) {}
 
-pw_aff::pw_aff(const isl::pw_aff &obj)
+pw_aff::pw_aff(const pw_aff &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -11391,28 +11391,28 @@
 pw_aff::pw_aff(__isl_take isl_pw_aff *ptr)
     : ptr(ptr) {}
 
-pw_aff::pw_aff(isl::aff aff)
+pw_aff::pw_aff(aff aff)
 {
   auto res = isl_pw_aff_from_aff(aff.release());
   ptr = res;
 }
-pw_aff::pw_aff(isl::local_space ls)
+pw_aff::pw_aff(local_space ls)
 {
   auto res = isl_pw_aff_zero_on_domain(ls.release());
   ptr = res;
 }
-pw_aff::pw_aff(isl::set domain, isl::val v)
+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(isl::ctx ctx, const std::string &str)
+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::operator=(isl::pw_aff obj) {
+pw_aff &pw_aff::operator=(pw_aff obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -11444,8 +11444,8 @@
 }
 
 
-isl::ctx pw_aff::get_ctx() const {
-  return isl::ctx(isl_pw_aff_get_ctx(ptr));
+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());
@@ -11462,43 +11462,43 @@
 }
 
 
-isl::pw_aff pw_aff::add(isl::pw_aff pwaff2) const
+pw_aff pw_aff::add(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_add(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::pw_aff pw_aff::align_params(isl::space model) const
+pw_aff pw_aff::align_params(space model) const
 {
   auto res = isl_pw_aff_align_params(copy(), model.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::alloc(isl::set set, isl::aff aff)
+pw_aff pw_aff::alloc(set set, aff aff)
 {
   auto res = isl_pw_aff_alloc(set.release(), aff.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::ceil() const
+pw_aff pw_aff::ceil() const
 {
   auto res = isl_pw_aff_ceil(copy());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::coalesce() const
+pw_aff pw_aff::coalesce() const
 {
   auto res = isl_pw_aff_coalesce(copy());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::cond(isl::pw_aff pwaff_true, isl::pw_aff pwaff_false) const
+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);
@@ -11510,49 +11510,49 @@
   return res;
 }
 
-isl::pw_aff pw_aff::div(isl::pw_aff pa2) const
+pw_aff pw_aff::div(pw_aff pa2) const
 {
   auto res = isl_pw_aff_div(copy(), pa2.release());
   return manage(res);
 }
 
-isl::set pw_aff::domain() const
+set pw_aff::domain() const
 {
   auto res = isl_pw_aff_domain(copy());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::pw_aff pw_aff::drop_unused_params() const
+pw_aff pw_aff::drop_unused_params() const
 {
   auto res = isl_pw_aff_drop_unused_params(copy());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::empty(isl::space dim)
+pw_aff pw_aff::empty(space dim)
 {
   auto res = isl_pw_aff_empty(dim.release());
   return manage(res);
 }
 
-isl::map pw_aff::eq_map(isl::pw_aff pa2) const
+map pw_aff::eq_map(pw_aff pa2) const
 {
   auto res = isl_pw_aff_eq_map(copy(), pa2.release());
   return manage(res);
 }
 
-isl::set pw_aff::eq_set(isl::pw_aff pwaff2) const
+set pw_aff::eq_set(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_eq_set(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::val pw_aff::eval(isl::point pnt) const
+val pw_aff::eval(point pnt) const
 {
   auto res = isl_pw_aff_eval(copy(), pnt.release());
   return manage(res);
@@ -11564,39 +11564,39 @@
   return res;
 }
 
-isl::pw_aff pw_aff::floor() const
+pw_aff pw_aff::floor() const
 {
   auto res = isl_pw_aff_floor(copy());
   return manage(res);
 }
 
-isl::stat pw_aff::foreach_piece(const std::function<isl::stat(isl::set, isl::aff)> &fn) const
+stat pw_aff::foreach_piece(const std::function<stat(set, aff)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::set, isl::aff)> *func;
+    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)(isl::manage(arg_0), isl::manage(arg_1));
+    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);
 }
 
-isl::pw_aff pw_aff::from_range() const
+pw_aff pw_aff::from_range() const
 {
   auto res = isl_pw_aff_from_range(copy());
   return manage(res);
 }
 
-isl::set pw_aff::ge_set(isl::pw_aff pwaff2) const
+set pw_aff::ge_set(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_ge_set(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::id pw_aff::get_dim_id(isl::dim type, unsigned int pos) const
+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);
@@ -11609,7 +11609,7 @@
   return tmp;
 }
 
-isl::space pw_aff::get_domain_space() const
+space pw_aff::get_domain_space() const
 {
   auto res = isl_pw_aff_get_domain_space(get());
   return manage(res);
@@ -11621,145 +11621,145 @@
   return res;
 }
 
-isl::space pw_aff::get_space() const
+space pw_aff::get_space() const
 {
   auto res = isl_pw_aff_get_space(get());
   return manage(res);
 }
 
-isl::id pw_aff::get_tuple_id(isl::dim type) const
+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);
 }
 
-isl::pw_aff pw_aff::gist(isl::set context) const
+pw_aff pw_aff::gist(set context) const
 {
   auto res = isl_pw_aff_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::gist_params(isl::set context) const
+pw_aff pw_aff::gist_params(set context) const
 {
   auto res = isl_pw_aff_gist_params(copy(), context.release());
   return manage(res);
 }
 
-isl::map pw_aff::gt_map(isl::pw_aff pa2) const
+map pw_aff::gt_map(pw_aff pa2) const
 {
   auto res = isl_pw_aff_gt_map(copy(), pa2.release());
   return manage(res);
 }
 
-isl::set pw_aff::gt_set(isl::pw_aff pwaff2) const
+set pw_aff::gt_set(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_gt_set(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::boolean pw_aff::has_dim_id(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean pw_aff::has_tuple_id(isl::dim type) const
+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);
 }
 
-isl::pw_aff pw_aff::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::pw_aff pw_aff::intersect_domain(isl::set set) const
+pw_aff pw_aff::intersect_domain(set set) const
 {
   auto res = isl_pw_aff_intersect_domain(copy(), set.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::intersect_params(isl::set set) const
+pw_aff pw_aff::intersect_params(set set) const
 {
   auto res = isl_pw_aff_intersect_params(copy(), set.release());
   return manage(res);
 }
 
-isl::boolean pw_aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean pw_aff::involves_nan() const
+boolean pw_aff::involves_nan() const
 {
   auto res = isl_pw_aff_involves_nan(get());
   return manage(res);
 }
 
-isl::boolean pw_aff::is_cst() const
+boolean pw_aff::is_cst() const
 {
   auto res = isl_pw_aff_is_cst(get());
   return manage(res);
 }
 
-isl::boolean pw_aff::is_empty() const
+boolean pw_aff::is_empty() const
 {
   auto res = isl_pw_aff_is_empty(get());
   return manage(res);
 }
 
-isl::boolean pw_aff::is_equal(const isl::pw_aff &pa2) const
+boolean pw_aff::is_equal(const pw_aff &pa2) const
 {
   auto res = isl_pw_aff_is_equal(get(), pa2.get());
   return manage(res);
 }
 
-isl::set pw_aff::le_set(isl::pw_aff pwaff2) const
+set pw_aff::le_set(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_le_set(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::map pw_aff::lt_map(isl::pw_aff pa2) const
+map pw_aff::lt_map(pw_aff pa2) const
 {
   auto res = isl_pw_aff_lt_map(copy(), pa2.release());
   return manage(res);
 }
 
-isl::set pw_aff::lt_set(isl::pw_aff pwaff2) const
+set pw_aff::lt_set(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_lt_set(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::max(isl::pw_aff pwaff2) const
+pw_aff pw_aff::max(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_max(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::min(isl::pw_aff pwaff2) const
+pw_aff pw_aff::min(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_min(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::mod(isl::val mod) const
+pw_aff pw_aff::mod(val mod) const
 {
   auto res = isl_pw_aff_mod_val(copy(), mod.release());
   return manage(res);
 }
 
-isl::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
+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);
 }
 
-isl::pw_aff pw_aff::mul(isl::pw_aff pwaff2) const
+pw_aff pw_aff::mul(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_mul(copy(), pwaff2.release());
   return manage(res);
@@ -11771,179 +11771,179 @@
   return res;
 }
 
-isl::pw_aff pw_aff::nan_on_domain(isl::local_space ls)
+pw_aff pw_aff::nan_on_domain(local_space ls)
 {
   auto res = isl_pw_aff_nan_on_domain(ls.release());
   return manage(res);
 }
 
-isl::set pw_aff::ne_set(isl::pw_aff pwaff2) const
+set pw_aff::ne_set(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_ne_set(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::neg() const
+pw_aff pw_aff::neg() const
 {
   auto res = isl_pw_aff_neg(copy());
   return manage(res);
 }
 
-isl::set pw_aff::non_zero_set() const
+set pw_aff::non_zero_set() const
 {
   auto res = isl_pw_aff_non_zero_set(copy());
   return manage(res);
 }
 
-isl::set pw_aff::nonneg_set() const
+set pw_aff::nonneg_set() const
 {
   auto res = isl_pw_aff_nonneg_set(copy());
   return manage(res);
 }
 
-isl::set pw_aff::params() const
+set pw_aff::params() const
 {
   auto res = isl_pw_aff_params(copy());
   return manage(res);
 }
 
-int pw_aff::plain_cmp(const isl::pw_aff &pa2) const
+int pw_aff::plain_cmp(const pw_aff &pa2) const
 {
   auto res = isl_pw_aff_plain_cmp(get(), pa2.get());
   return res;
 }
 
-isl::boolean pw_aff::plain_is_equal(const isl::pw_aff &pwaff2) const
+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);
 }
 
-isl::set pw_aff::pos_set() const
+set pw_aff::pos_set() const
 {
   auto res = isl_pw_aff_pos_set(copy());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::project_domain_on_params() const
+pw_aff pw_aff::project_domain_on_params() const
 {
   auto res = isl_pw_aff_project_domain_on_params(copy());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::pullback(isl::multi_aff ma) const
+pw_aff pw_aff::pullback(multi_aff ma) const
 {
   auto res = isl_pw_aff_pullback_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::pullback(isl::pw_multi_aff pma) const
+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);
 }
 
-isl::pw_aff pw_aff::pullback(isl::multi_pw_aff mpa) const
+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);
 }
 
-isl::pw_aff pw_aff::reset_tuple_id(isl::dim type) const
+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);
 }
 
-isl::pw_aff pw_aff::reset_user() const
+pw_aff pw_aff::reset_user() const
 {
   auto res = isl_pw_aff_reset_user(copy());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::scale(isl::val v) const
+pw_aff pw_aff::scale(val v) const
 {
   auto res = isl_pw_aff_scale_val(copy(), v.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::scale_down(isl::val f) const
+pw_aff pw_aff::scale_down(val f) const
 {
   auto res = isl_pw_aff_scale_down_val(copy(), f.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::pw_aff pw_aff::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::pw_aff pw_aff::sub(isl::pw_aff pwaff2) const
+pw_aff pw_aff::sub(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_sub(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::subtract_domain(isl::set set) const
+pw_aff pw_aff::subtract_domain(set set) const
 {
   auto res = isl_pw_aff_subtract_domain(copy(), set.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::tdiv_q(isl::pw_aff pa2) const
+pw_aff pw_aff::tdiv_q(pw_aff pa2) const
 {
   auto res = isl_pw_aff_tdiv_q(copy(), pa2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::tdiv_r(isl::pw_aff pa2) const
+pw_aff pw_aff::tdiv_r(pw_aff pa2) const
 {
   auto res = isl_pw_aff_tdiv_r(copy(), pa2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::union_add(isl::pw_aff pwaff2) const
+pw_aff pw_aff::union_add(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_union_add(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::union_max(isl::pw_aff pwaff2) const
+pw_aff pw_aff::union_max(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_union_max(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::union_min(isl::pw_aff pwaff2) const
+pw_aff pw_aff::union_min(pw_aff pwaff2) const
 {
   auto res = isl_pw_aff_union_min(copy(), pwaff2.release());
   return manage(res);
 }
 
-isl::pw_aff pw_aff::var_on_domain(isl::local_space ls, isl::dim type, unsigned int pos)
+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);
 }
 
-isl::set pw_aff::zero_set() const
+set pw_aff::zero_set() const
 {
   auto res = isl_pw_aff_zero_set(copy());
   return manage(res);
 }
 
 // implementations for isl::pw_aff_list
-isl::pw_aff_list manage(__isl_take isl_pw_aff_list *ptr) {
+pw_aff_list manage(__isl_take isl_pw_aff_list *ptr) {
   return pw_aff_list(ptr);
 }
-isl::pw_aff_list manage_copy(__isl_keep isl_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);
 }
@@ -11951,7 +11951,7 @@
 pw_aff_list::pw_aff_list()
     : ptr(nullptr) {}
 
-pw_aff_list::pw_aff_list(const isl::pw_aff_list &obj)
+pw_aff_list::pw_aff_list(const pw_aff_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -11964,7 +11964,7 @@
     : ptr(ptr) {}
 
 
-pw_aff_list &pw_aff_list::operator=(isl::pw_aff_list obj) {
+pw_aff_list &pw_aff_list::operator=(pw_aff_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -11996,8 +11996,8 @@
 }
 
 
-isl::ctx pw_aff_list::get_ctx() const {
-  return isl::ctx(isl_pw_aff_list_get_ctx(ptr));
+ctx pw_aff_list::get_ctx() const {
+  return ctx(isl_pw_aff_list_get_ctx(ptr));
 }
 
 void pw_aff_list::dump() const {
@@ -12005,105 +12005,105 @@
 }
 
 
-isl::pw_aff_list pw_aff_list::add(isl::pw_aff el) const
+pw_aff_list pw_aff_list::add(pw_aff el) const
 {
   auto res = isl_pw_aff_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::pw_aff_list pw_aff_list::alloc(isl::ctx ctx, int n)
+pw_aff_list pw_aff_list::alloc(ctx ctx, int n)
 {
   auto res = isl_pw_aff_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::pw_aff_list pw_aff_list::concat(isl::pw_aff_list list2) const
+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);
 }
 
-isl::pw_aff_list pw_aff_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::set pw_aff_list::eq_set(isl::pw_aff_list list2) const
+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);
 }
 
-isl::stat pw_aff_list::foreach(const std::function<isl::stat(isl::pw_aff)> &fn) const
+stat pw_aff_list::foreach(const std::function<stat(pw_aff)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::pw_aff)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::pw_aff_list pw_aff_list::from_pw_aff(isl::pw_aff el)
+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);
 }
 
-isl::set pw_aff_list::ge_set(isl::pw_aff_list list2) const
+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);
 }
 
-isl::pw_aff pw_aff_list::get_at(int index) const
+pw_aff pw_aff_list::get_at(int index) const
 {
   auto res = isl_pw_aff_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::pw_aff pw_aff_list::get_pw_aff(int index) const
+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);
 }
 
-isl::set pw_aff_list::gt_set(isl::pw_aff_list list2) const
+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);
 }
 
-isl::pw_aff_list pw_aff_list::insert(unsigned int pos, isl::pw_aff el) const
+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);
 }
 
-isl::set pw_aff_list::le_set(isl::pw_aff_list list2) const
+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);
 }
 
-isl::set pw_aff_list::lt_set(isl::pw_aff_list list2) const
+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);
 }
 
-isl::pw_aff pw_aff_list::max() const
+pw_aff pw_aff_list::max() const
 {
   auto res = isl_pw_aff_list_max(copy());
   return manage(res);
 }
 
-isl::pw_aff pw_aff_list::min() const
+pw_aff pw_aff_list::min() const
 {
   auto res = isl_pw_aff_list_min(copy());
   return manage(res);
@@ -12115,19 +12115,19 @@
   return res;
 }
 
-isl::set pw_aff_list::ne_set(isl::pw_aff_list list2) const
+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);
 }
 
-isl::pw_aff_list pw_aff_list::reverse() const
+pw_aff_list pw_aff_list::reverse() const
 {
   auto res = isl_pw_aff_list_reverse(copy());
   return manage(res);
 }
 
-isl::pw_aff_list pw_aff_list::set_pw_aff(int index, isl::pw_aff el) const
+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);
@@ -12139,17 +12139,17 @@
   return res;
 }
 
-isl::pw_aff_list pw_aff_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::pw_multi_aff manage(__isl_take isl_pw_multi_aff *ptr) {
+pw_multi_aff manage(__isl_take isl_pw_multi_aff *ptr) {
   return pw_multi_aff(ptr);
 }
-isl::pw_multi_aff manage_copy(__isl_keep isl_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);
 }
@@ -12157,7 +12157,7 @@
 pw_multi_aff::pw_multi_aff()
     : ptr(nullptr) {}
 
-pw_multi_aff::pw_multi_aff(const isl::pw_multi_aff &obj)
+pw_multi_aff::pw_multi_aff(const pw_multi_aff &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -12169,23 +12169,23 @@
 pw_multi_aff::pw_multi_aff(__isl_take isl_pw_multi_aff *ptr)
     : ptr(ptr) {}
 
-pw_multi_aff::pw_multi_aff(isl::multi_aff ma)
+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(isl::pw_aff pa)
+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(isl::ctx ctx, const std::string &str)
+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=(isl::pw_multi_aff obj) {
+pw_multi_aff &pw_multi_aff::operator=(pw_multi_aff obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -12217,8 +12217,8 @@
 }
 
 
-isl::ctx pw_multi_aff::get_ctx() const {
-  return isl::ctx(isl_pw_multi_aff_get_ctx(ptr));
+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());
@@ -12235,25 +12235,25 @@
 }
 
 
-isl::pw_multi_aff pw_multi_aff::add(isl::pw_multi_aff pma2) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::align_params(isl::space model) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::alloc(isl::set set, isl::multi_aff maff)
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::coalesce() const
+pw_multi_aff pw_multi_aff::coalesce() const
 {
   auto res = isl_pw_multi_aff_coalesce(copy());
   return manage(res);
@@ -12265,25 +12265,25 @@
   return res;
 }
 
-isl::set pw_multi_aff::domain() const
+set pw_multi_aff::domain() const
 {
   auto res = isl_pw_multi_aff_domain(copy());
   return manage(res);
 }
 
-isl::pw_multi_aff pw_multi_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::drop_unused_params() const
+pw_multi_aff pw_multi_aff::drop_unused_params() const
 {
   auto res = isl_pw_multi_aff_drop_unused_params(copy());
   return manage(res);
 }
 
-isl::pw_multi_aff pw_multi_aff::empty(isl::space space)
+pw_multi_aff pw_multi_aff::empty(space space)
 {
   auto res = isl_pw_multi_aff_empty(space.release());
   return manage(res);
@@ -12295,57 +12295,57 @@
   return res;
 }
 
-isl::pw_multi_aff pw_multi_aff::fix_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::flat_range_product(isl::pw_multi_aff pma2) const
+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);
 }
 
-isl::stat pw_multi_aff::foreach_piece(const std::function<isl::stat(isl::set, isl::multi_aff)> &fn) const
+stat pw_multi_aff::foreach_piece(const std::function<stat(set, multi_aff)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::set, isl::multi_aff)> *func;
+    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)(isl::manage(arg_0), isl::manage(arg_1));
+    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);
 }
 
-isl::pw_multi_aff pw_multi_aff::from_domain(isl::set set)
+pw_multi_aff pw_multi_aff::from_domain(set set)
 {
   auto res = isl_pw_multi_aff_from_domain(set.release());
   return manage(res);
 }
 
-isl::pw_multi_aff pw_multi_aff::from_map(isl::map map)
+pw_multi_aff pw_multi_aff::from_map(map map)
 {
   auto res = isl_pw_multi_aff_from_map(map.release());
   return manage(res);
 }
 
-isl::pw_multi_aff pw_multi_aff::from_multi_pw_aff(isl::multi_pw_aff mpa)
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::from_set(isl::set set)
+pw_multi_aff pw_multi_aff::from_set(set set)
 {
   auto res = isl_pw_multi_aff_from_set(set.release());
   return manage(res);
 }
 
-isl::id pw_multi_aff::get_dim_id(isl::dim type, unsigned int pos) const
+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);
@@ -12358,25 +12358,25 @@
   return tmp;
 }
 
-isl::space pw_multi_aff::get_domain_space() const
+space pw_multi_aff::get_domain_space() const
 {
   auto res = isl_pw_multi_aff_get_domain_space(get());
   return manage(res);
 }
 
-isl::pw_aff pw_multi_aff::get_pw_aff(int pos) const
+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);
 }
 
-isl::space pw_multi_aff::get_space() const
+space pw_multi_aff::get_space() const
 {
   auto res = isl_pw_multi_aff_get_space(get());
   return manage(res);
 }
 
-isl::id pw_multi_aff::get_tuple_id(isl::dim type) const
+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);
@@ -12389,67 +12389,67 @@
   return tmp;
 }
 
-isl::pw_multi_aff pw_multi_aff::gist(isl::set set) const
+pw_multi_aff pw_multi_aff::gist(set set) const
 {
   auto res = isl_pw_multi_aff_gist(copy(), set.release());
   return manage(res);
 }
 
-isl::pw_multi_aff pw_multi_aff::gist_params(isl::set set) const
+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);
 }
 
-isl::boolean pw_multi_aff::has_tuple_id(isl::dim type) const
+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);
 }
 
-isl::boolean pw_multi_aff::has_tuple_name(isl::dim type) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::identity(isl::space space)
+pw_multi_aff pw_multi_aff::identity(space space)
 {
   auto res = isl_pw_multi_aff_identity(space.release());
   return manage(res);
 }
 
-isl::pw_multi_aff pw_multi_aff::intersect_domain(isl::set set) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::intersect_params(isl::set set) const
+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);
 }
 
-isl::boolean pw_multi_aff::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean pw_multi_aff::involves_nan() const
+boolean pw_multi_aff::involves_nan() const
 {
   auto res = isl_pw_multi_aff_involves_nan(get());
   return manage(res);
 }
 
-isl::boolean pw_multi_aff::is_equal(const isl::pw_multi_aff &pma2) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::multi_val_on_domain(isl::set domain, isl::multi_val mv)
+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);
@@ -12461,149 +12461,149 @@
   return res;
 }
 
-isl::pw_multi_aff pw_multi_aff::neg() const
+pw_multi_aff pw_multi_aff::neg() const
 {
   auto res = isl_pw_multi_aff_neg(copy());
   return manage(res);
 }
 
-isl::boolean pw_multi_aff::plain_is_equal(const isl::pw_multi_aff &pma2) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::product(isl::pw_multi_aff pma2) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::project_domain_on_params() const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::project_out_map(isl::space space, isl::dim type, unsigned int first, unsigned int n)
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::pullback(isl::multi_aff ma) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::pullback(isl::pw_multi_aff pma2) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::range_map(isl::space space)
+pw_multi_aff pw_multi_aff::range_map(space space)
 {
   auto res = isl_pw_multi_aff_range_map(space.release());
   return manage(res);
 }
 
-isl::pw_multi_aff pw_multi_aff::range_product(isl::pw_multi_aff pma2) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::reset_tuple_id(isl::dim type) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::reset_user() const
+pw_multi_aff pw_multi_aff::reset_user() const
 {
   auto res = isl_pw_multi_aff_reset_user(copy());
   return manage(res);
 }
 
-isl::pw_multi_aff pw_multi_aff::scale_down_val(isl::val v) const
+pw_multi_aff pw_multi_aff::scale_down_val(val v) const
 {
   auto res = isl_pw_multi_aff_scale_down_val(copy(), v.release());
   return manage(res);
 }
 
-isl::pw_multi_aff pw_multi_aff::scale_multi_val(isl::multi_val mv) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::scale_val(isl::val v) const
+pw_multi_aff pw_multi_aff::scale_val(val v) const
 {
   auto res = isl_pw_multi_aff_scale_val(copy(), v.release());
   return manage(res);
 }
 
-isl::pw_multi_aff pw_multi_aff::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::set_pw_aff(unsigned int pos, isl::pw_aff pa) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::sub(isl::pw_multi_aff pma2) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::subtract_domain(isl::set set) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::union_add(isl::pw_multi_aff pma2) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::union_lexmax(isl::pw_multi_aff pma2) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::union_lexmin(isl::pw_multi_aff pma2) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff::zero(isl::space space)
+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
-isl::pw_multi_aff_list manage(__isl_take isl_pw_multi_aff_list *ptr) {
+pw_multi_aff_list manage(__isl_take isl_pw_multi_aff_list *ptr) {
   return pw_multi_aff_list(ptr);
 }
-isl::pw_multi_aff_list manage_copy(__isl_keep isl_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);
 }
@@ -12611,7 +12611,7 @@
 pw_multi_aff_list::pw_multi_aff_list()
     : ptr(nullptr) {}
 
-pw_multi_aff_list::pw_multi_aff_list(const isl::pw_multi_aff_list &obj)
+pw_multi_aff_list::pw_multi_aff_list(const pw_multi_aff_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -12624,7 +12624,7 @@
     : ptr(ptr) {}
 
 
-pw_multi_aff_list &pw_multi_aff_list::operator=(isl::pw_multi_aff_list obj) {
+pw_multi_aff_list &pw_multi_aff_list::operator=(pw_multi_aff_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -12656,8 +12656,8 @@
 }
 
 
-isl::ctx pw_multi_aff_list::get_ctx() const {
-  return isl::ctx(isl_pw_multi_aff_list_get_ctx(ptr));
+ctx pw_multi_aff_list::get_ctx() const {
+  return ctx(isl_pw_multi_aff_list_get_ctx(ptr));
 }
 
 void pw_multi_aff_list::dump() const {
@@ -12665,63 +12665,63 @@
 }
 
 
-isl::pw_multi_aff_list pw_multi_aff_list::add(isl::pw_multi_aff el) const
+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);
 }
 
-isl::pw_multi_aff_list pw_multi_aff_list::alloc(isl::ctx ctx, int n)
+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);
 }
 
-isl::pw_multi_aff_list pw_multi_aff_list::concat(isl::pw_multi_aff_list list2) const
+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);
 }
 
-isl::pw_multi_aff_list pw_multi_aff_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::stat pw_multi_aff_list::foreach(const std::function<isl::stat(isl::pw_multi_aff)> &fn) const
+stat pw_multi_aff_list::foreach(const std::function<stat(pw_multi_aff)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::pw_multi_aff)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::pw_multi_aff_list pw_multi_aff_list::from_pw_multi_aff(isl::pw_multi_aff el)
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff_list::get_at(int index) const
+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);
 }
 
-isl::pw_multi_aff pw_multi_aff_list::get_pw_multi_aff(int index) const
+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);
 }
 
-isl::pw_multi_aff_list pw_multi_aff_list::insert(unsigned int pos, isl::pw_multi_aff el) const
+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);
@@ -12733,13 +12733,13 @@
   return res;
 }
 
-isl::pw_multi_aff_list pw_multi_aff_list::reverse() const
+pw_multi_aff_list pw_multi_aff_list::reverse() const
 {
   auto res = isl_pw_multi_aff_list_reverse(copy());
   return manage(res);
 }
 
-isl::pw_multi_aff_list pw_multi_aff_list::set_pw_multi_aff(int index, isl::pw_multi_aff el) const
+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);
@@ -12751,17 +12751,17 @@
   return res;
 }
 
-isl::pw_multi_aff_list pw_multi_aff_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::pw_qpolynomial manage(__isl_take isl_pw_qpolynomial *ptr) {
+pw_qpolynomial manage(__isl_take isl_pw_qpolynomial *ptr) {
   return pw_qpolynomial(ptr);
 }
-isl::pw_qpolynomial manage_copy(__isl_keep isl_pw_qpolynomial *ptr) {
+pw_qpolynomial manage_copy(__isl_keep isl_pw_qpolynomial *ptr) {
   ptr = isl_pw_qpolynomial_copy(ptr);
   return pw_qpolynomial(ptr);
 }
@@ -12769,7 +12769,7 @@
 pw_qpolynomial::pw_qpolynomial()
     : ptr(nullptr) {}
 
-pw_qpolynomial::pw_qpolynomial(const isl::pw_qpolynomial &obj)
+pw_qpolynomial::pw_qpolynomial(const pw_qpolynomial &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -12781,13 +12781,13 @@
 pw_qpolynomial::pw_qpolynomial(__isl_take isl_pw_qpolynomial *ptr)
     : ptr(ptr) {}
 
-pw_qpolynomial::pw_qpolynomial(isl::ctx ctx, const std::string &str)
+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=(isl::pw_qpolynomial obj) {
+pw_qpolynomial &pw_qpolynomial::operator=(pw_qpolynomial obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -12819,8 +12819,8 @@
 }
 
 
-isl::ctx pw_qpolynomial::get_ctx() const {
-  return isl::ctx(isl_pw_qpolynomial_get_ctx(ptr));
+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());
@@ -12837,25 +12837,25 @@
 }
 
 
-isl::pw_qpolynomial pw_qpolynomial::add(isl::pw_qpolynomial pwqp2) const
+pw_qpolynomial pw_qpolynomial::add(pw_qpolynomial pwqp2) const
 {
   auto res = isl_pw_qpolynomial_add(copy(), pwqp2.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::alloc(isl::set set, isl::qpolynomial qp)
+pw_qpolynomial pw_qpolynomial::alloc(set set, qpolynomial qp)
 {
   auto res = isl_pw_qpolynomial_alloc(set.release(), qp.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::coalesce() const
+pw_qpolynomial pw_qpolynomial::coalesce() const
 {
   auto res = isl_pw_qpolynomial_coalesce(copy());
   return manage(res);
@@ -12867,25 +12867,25 @@
   return res;
 }
 
-isl::set pw_qpolynomial::domain() const
+set pw_qpolynomial::domain() const
 {
   auto res = isl_pw_qpolynomial_domain(copy());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::drop_unused_params() const
+pw_qpolynomial pw_qpolynomial::drop_unused_params() const
 {
   auto res = isl_pw_qpolynomial_drop_unused_params(copy());
   return manage(res);
 }
 
-isl::val pw_qpolynomial::eval(isl::point pnt) const
+val pw_qpolynomial::eval(point pnt) const
 {
   auto res = isl_pw_qpolynomial_eval(copy(), pnt.release());
   return manage(res);
@@ -12897,129 +12897,129 @@
   return res;
 }
 
-isl::pw_qpolynomial pw_qpolynomial::fix_val(isl::dim type, unsigned int n, isl::val v) const
+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);
 }
 
-isl::stat pw_qpolynomial::foreach_piece(const std::function<isl::stat(isl::set, isl::qpolynomial)> &fn) const
+stat pw_qpolynomial::foreach_piece(const std::function<stat(set, qpolynomial)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::set, isl::qpolynomial)> *func;
+    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)(isl::manage(arg_0), isl::manage(arg_1));
+    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);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::from_pw_aff(isl::pw_aff pwaff)
+pw_qpolynomial pw_qpolynomial::from_pw_aff(pw_aff pwaff)
 {
   auto res = isl_pw_qpolynomial_from_pw_aff(pwaff.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::from_qpolynomial(isl::qpolynomial qp)
+pw_qpolynomial pw_qpolynomial::from_qpolynomial(qpolynomial qp)
 {
   auto res = isl_pw_qpolynomial_from_qpolynomial(qp.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::from_range() const
+pw_qpolynomial pw_qpolynomial::from_range() const
 {
   auto res = isl_pw_qpolynomial_from_range(copy());
   return manage(res);
 }
 
-isl::space pw_qpolynomial::get_domain_space() const
+space pw_qpolynomial::get_domain_space() const
 {
   auto res = isl_pw_qpolynomial_get_domain_space(get());
   return manage(res);
 }
 
-isl::space pw_qpolynomial::get_space() const
+space pw_qpolynomial::get_space() const
 {
   auto res = isl_pw_qpolynomial_get_space(get());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::gist(isl::set context) const
+pw_qpolynomial pw_qpolynomial::gist(set context) const
 {
   auto res = isl_pw_qpolynomial_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::gist_params(isl::set context) const
+pw_qpolynomial pw_qpolynomial::gist_params(set context) const
 {
   auto res = isl_pw_qpolynomial_gist_params(copy(), context.release());
   return manage(res);
 }
 
-isl::boolean pw_qpolynomial::has_equal_space(const isl::pw_qpolynomial &pwqp2) const
+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);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::intersect_domain(isl::set set) const
+pw_qpolynomial pw_qpolynomial::intersect_domain(set set) const
 {
   auto res = isl_pw_qpolynomial_intersect_domain(copy(), set.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::intersect_params(isl::set set) const
+pw_qpolynomial pw_qpolynomial::intersect_params(set set) const
 {
   auto res = isl_pw_qpolynomial_intersect_params(copy(), set.release());
   return manage(res);
 }
 
-isl::boolean pw_qpolynomial::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean pw_qpolynomial::involves_nan() const
+boolean pw_qpolynomial::involves_nan() const
 {
   auto res = isl_pw_qpolynomial_involves_nan(get());
   return manage(res);
 }
 
-isl::boolean pw_qpolynomial::is_zero() const
+boolean pw_qpolynomial::is_zero() const
 {
   auto res = isl_pw_qpolynomial_is_zero(get());
   return manage(res);
 }
 
-isl::val pw_qpolynomial::max() const
+val pw_qpolynomial::max() const
 {
   auto res = isl_pw_qpolynomial_max(copy());
   return manage(res);
 }
 
-isl::val pw_qpolynomial::min() const
+val pw_qpolynomial::min() const
 {
   auto res = isl_pw_qpolynomial_min(copy());
   return manage(res);
 }
 
-isl::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
+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);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::mul(isl::pw_qpolynomial pwqp2) const
+pw_qpolynomial pw_qpolynomial::mul(pw_qpolynomial pwqp2) const
 {
   auto res = isl_pw_qpolynomial_mul(copy(), pwqp2.release());
   return manage(res);
@@ -13031,95 +13031,95 @@
   return res;
 }
 
-isl::pw_qpolynomial pw_qpolynomial::neg() const
+pw_qpolynomial pw_qpolynomial::neg() const
 {
   auto res = isl_pw_qpolynomial_neg(copy());
   return manage(res);
 }
 
-isl::boolean pw_qpolynomial::plain_is_equal(const isl::pw_qpolynomial &pwqp2) const
+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);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::pow(unsigned int exponent) const
+pw_qpolynomial pw_qpolynomial::pow(unsigned int exponent) const
 {
   auto res = isl_pw_qpolynomial_pow(copy(), exponent);
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::project_domain_on_params() const
+pw_qpolynomial pw_qpolynomial::project_domain_on_params() const
 {
   auto res = isl_pw_qpolynomial_project_domain_on_params(copy());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::reset_domain_space(isl::space dim) const
+pw_qpolynomial pw_qpolynomial::reset_domain_space(space dim) const
 {
   auto res = isl_pw_qpolynomial_reset_domain_space(copy(), dim.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::reset_user() const
+pw_qpolynomial pw_qpolynomial::reset_user() const
 {
   auto res = isl_pw_qpolynomial_reset_user(copy());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::scale_down_val(isl::val v) const
+pw_qpolynomial pw_qpolynomial::scale_down_val(val v) const
 {
   auto res = isl_pw_qpolynomial_scale_down_val(copy(), v.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::scale_val(isl::val v) const
+pw_qpolynomial pw_qpolynomial::scale_val(val v) const
 {
   auto res = isl_pw_qpolynomial_scale_val(copy(), v.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::split_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::split_periods(int max_periods) const
+pw_qpolynomial pw_qpolynomial::split_periods(int max_periods) const
 {
   auto res = isl_pw_qpolynomial_split_periods(copy(), max_periods);
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::sub(isl::pw_qpolynomial pwqp2) const
+pw_qpolynomial pw_qpolynomial::sub(pw_qpolynomial pwqp2) const
 {
   auto res = isl_pw_qpolynomial_sub(copy(), pwqp2.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::subtract_domain(isl::set set) const
+pw_qpolynomial pw_qpolynomial::subtract_domain(set set) const
 {
   auto res = isl_pw_qpolynomial_subtract_domain(copy(), set.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::to_polynomial(int sign) const
+pw_qpolynomial pw_qpolynomial::to_polynomial(int sign) const
 {
   auto res = isl_pw_qpolynomial_to_polynomial(copy(), sign);
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial::zero(isl::space dim)
+pw_qpolynomial pw_qpolynomial::zero(space dim)
 {
   auto res = isl_pw_qpolynomial_zero(dim.release());
   return manage(res);
 }
 
 // implementations for isl::pw_qpolynomial_fold_list
-isl::pw_qpolynomial_fold_list manage(__isl_take isl_pw_qpolynomial_fold_list *ptr) {
+pw_qpolynomial_fold_list manage(__isl_take isl_pw_qpolynomial_fold_list *ptr) {
   return pw_qpolynomial_fold_list(ptr);
 }
-isl::pw_qpolynomial_fold_list manage_copy(__isl_keep isl_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);
 }
@@ -13127,7 +13127,7 @@
 pw_qpolynomial_fold_list::pw_qpolynomial_fold_list()
     : ptr(nullptr) {}
 
-pw_qpolynomial_fold_list::pw_qpolynomial_fold_list(const isl::pw_qpolynomial_fold_list &obj)
+pw_qpolynomial_fold_list::pw_qpolynomial_fold_list(const pw_qpolynomial_fold_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -13140,7 +13140,7 @@
     : ptr(ptr) {}
 
 
-pw_qpolynomial_fold_list &pw_qpolynomial_fold_list::operator=(isl::pw_qpolynomial_fold_list obj) {
+pw_qpolynomial_fold_list &pw_qpolynomial_fold_list::operator=(pw_qpolynomial_fold_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -13172,8 +13172,8 @@
 }
 
 
-isl::ctx pw_qpolynomial_fold_list::get_ctx() const {
-  return isl::ctx(isl_pw_qpolynomial_fold_list_get_ctx(ptr));
+ctx pw_qpolynomial_fold_list::get_ctx() const {
+  return ctx(isl_pw_qpolynomial_fold_list_get_ctx(ptr));
 }
 
 void pw_qpolynomial_fold_list::dump() const {
@@ -13183,10 +13183,10 @@
 
 
 // implementations for isl::pw_qpolynomial_list
-isl::pw_qpolynomial_list manage(__isl_take isl_pw_qpolynomial_list *ptr) {
+pw_qpolynomial_list manage(__isl_take isl_pw_qpolynomial_list *ptr) {
   return pw_qpolynomial_list(ptr);
 }
-isl::pw_qpolynomial_list manage_copy(__isl_keep isl_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);
 }
@@ -13194,7 +13194,7 @@
 pw_qpolynomial_list::pw_qpolynomial_list()
     : ptr(nullptr) {}
 
-pw_qpolynomial_list::pw_qpolynomial_list(const isl::pw_qpolynomial_list &obj)
+pw_qpolynomial_list::pw_qpolynomial_list(const pw_qpolynomial_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -13207,7 +13207,7 @@
     : ptr(ptr) {}
 
 
-pw_qpolynomial_list &pw_qpolynomial_list::operator=(isl::pw_qpolynomial_list obj) {
+pw_qpolynomial_list &pw_qpolynomial_list::operator=(pw_qpolynomial_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -13239,8 +13239,8 @@
 }
 
 
-isl::ctx pw_qpolynomial_list::get_ctx() const {
-  return isl::ctx(isl_pw_qpolynomial_list_get_ctx(ptr));
+ctx pw_qpolynomial_list::get_ctx() const {
+  return ctx(isl_pw_qpolynomial_list_get_ctx(ptr));
 }
 
 void pw_qpolynomial_list::dump() const {
@@ -13248,63 +13248,63 @@
 }
 
 
-isl::pw_qpolynomial_list pw_qpolynomial_list::add(isl::pw_qpolynomial el) const
+pw_qpolynomial_list pw_qpolynomial_list::add(pw_qpolynomial el) const
 {
   auto res = isl_pw_qpolynomial_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial_list pw_qpolynomial_list::alloc(isl::ctx ctx, int n)
+pw_qpolynomial_list pw_qpolynomial_list::alloc(ctx ctx, int n)
 {
   auto res = isl_pw_qpolynomial_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::pw_qpolynomial_list pw_qpolynomial_list::concat(isl::pw_qpolynomial_list list2) const
+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);
 }
 
-isl::pw_qpolynomial_list pw_qpolynomial_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::stat pw_qpolynomial_list::foreach(const std::function<isl::stat(isl::pw_qpolynomial)> &fn) const
+stat pw_qpolynomial_list::foreach(const std::function<stat(pw_qpolynomial)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::pw_qpolynomial)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::pw_qpolynomial_list pw_qpolynomial_list::from_pw_qpolynomial(isl::pw_qpolynomial el)
+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);
 }
 
-isl::pw_qpolynomial pw_qpolynomial_list::get_at(int index) const
+pw_qpolynomial pw_qpolynomial_list::get_at(int index) const
 {
   auto res = isl_pw_qpolynomial_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::pw_qpolynomial pw_qpolynomial_list::get_pw_qpolynomial(int index) const
+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);
 }
 
-isl::pw_qpolynomial_list pw_qpolynomial_list::insert(unsigned int pos, isl::pw_qpolynomial el) const
+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);
@@ -13316,13 +13316,13 @@
   return res;
 }
 
-isl::pw_qpolynomial_list pw_qpolynomial_list::reverse() const
+pw_qpolynomial_list pw_qpolynomial_list::reverse() const
 {
   auto res = isl_pw_qpolynomial_list_reverse(copy());
   return manage(res);
 }
 
-isl::pw_qpolynomial_list pw_qpolynomial_list::set_pw_qpolynomial(int index, isl::pw_qpolynomial el) const
+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);
@@ -13334,17 +13334,17 @@
   return res;
 }
 
-isl::pw_qpolynomial_list pw_qpolynomial_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::qpolynomial manage(__isl_take isl_qpolynomial *ptr) {
+qpolynomial manage(__isl_take isl_qpolynomial *ptr) {
   return qpolynomial(ptr);
 }
-isl::qpolynomial manage_copy(__isl_keep isl_qpolynomial *ptr) {
+qpolynomial manage_copy(__isl_keep isl_qpolynomial *ptr) {
   ptr = isl_qpolynomial_copy(ptr);
   return qpolynomial(ptr);
 }
@@ -13352,7 +13352,7 @@
 qpolynomial::qpolynomial()
     : ptr(nullptr) {}
 
-qpolynomial::qpolynomial(const isl::qpolynomial &obj)
+qpolynomial::qpolynomial(const qpolynomial &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -13365,7 +13365,7 @@
     : ptr(ptr) {}
 
 
-qpolynomial &qpolynomial::operator=(isl::qpolynomial obj) {
+qpolynomial &qpolynomial::operator=(qpolynomial obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -13397,8 +13397,8 @@
 }
 
 
-isl::ctx qpolynomial::get_ctx() const {
-  return isl::ctx(isl_qpolynomial_get_ctx(ptr));
+ctx qpolynomial::get_ctx() const {
+  return ctx(isl_qpolynomial_get_ctx(ptr));
 }
 
 void qpolynomial::dump() const {
@@ -13406,32 +13406,32 @@
 }
 
 
-isl::qpolynomial qpolynomial::add(isl::qpolynomial qp2) const
+qpolynomial qpolynomial::add(qpolynomial qp2) const
 {
   auto res = isl_qpolynomial_add(copy(), qp2.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::qpolynomial qpolynomial::align_params(isl::space model) const
+qpolynomial qpolynomial::align_params(space model) const
 {
   auto res = isl_qpolynomial_align_params(copy(), model.release());
   return manage(res);
 }
 
-isl::stat qpolynomial::as_polynomial_on_domain(const isl::basic_set &bset, const std::function<isl::stat(isl::basic_set, isl::qpolynomial)> &fn) const
+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<isl::stat(isl::basic_set, isl::qpolynomial)> *func;
+    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)(isl::manage(arg_0), isl::manage(arg_1));
+    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);
@@ -13444,189 +13444,189 @@
   return res;
 }
 
-isl::qpolynomial qpolynomial::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::val qpolynomial::eval(isl::point pnt) const
+val qpolynomial::eval(point pnt) const
 {
   auto res = isl_qpolynomial_eval(copy(), pnt.release());
   return manage(res);
 }
 
-isl::stat qpolynomial::foreach_term(const std::function<isl::stat(isl::term)> &fn) const
+stat qpolynomial::foreach_term(const std::function<stat(term)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::term)> *func;
+    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)(isl::manage(arg_0));
+    stat ret = (*data->func)(manage(arg_0));
     return ret.release();
   };
   auto res = isl_qpolynomial_foreach_term(get(), fn_lambda, &fn_data);
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::from_aff(isl::aff aff)
+qpolynomial qpolynomial::from_aff(aff aff)
 {
   auto res = isl_qpolynomial_from_aff(aff.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::from_constraint(isl::constraint c, isl::dim type, unsigned int pos)
+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);
 }
 
-isl::qpolynomial qpolynomial::from_term(isl::term term)
+qpolynomial qpolynomial::from_term(term term)
 {
   auto res = isl_qpolynomial_from_term(term.release());
   return manage(res);
 }
 
-isl::val qpolynomial::get_constant_val() const
+val qpolynomial::get_constant_val() const
 {
   auto res = isl_qpolynomial_get_constant_val(get());
   return manage(res);
 }
 
-isl::space qpolynomial::get_domain_space() const
+space qpolynomial::get_domain_space() const
 {
   auto res = isl_qpolynomial_get_domain_space(get());
   return manage(res);
 }
 
-isl::space qpolynomial::get_space() const
+space qpolynomial::get_space() const
 {
   auto res = isl_qpolynomial_get_space(get());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::gist(isl::set context) const
+qpolynomial qpolynomial::gist(set context) const
 {
   auto res = isl_qpolynomial_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::gist_params(isl::set context) const
+qpolynomial qpolynomial::gist_params(set context) const
 {
   auto res = isl_qpolynomial_gist_params(copy(), context.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::homogenize() const
+qpolynomial qpolynomial::homogenize() const
 {
   auto res = isl_qpolynomial_homogenize(copy());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::infty_on_domain(isl::space dim)
+qpolynomial qpolynomial::infty_on_domain(space dim)
 {
   auto res = isl_qpolynomial_infty_on_domain(dim.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::insert_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean qpolynomial::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean qpolynomial::is_infty() const
+boolean qpolynomial::is_infty() const
 {
   auto res = isl_qpolynomial_is_infty(get());
   return manage(res);
 }
 
-isl::boolean qpolynomial::is_nan() const
+boolean qpolynomial::is_nan() const
 {
   auto res = isl_qpolynomial_is_nan(get());
   return manage(res);
 }
 
-isl::boolean qpolynomial::is_neginfty() const
+boolean qpolynomial::is_neginfty() const
 {
   auto res = isl_qpolynomial_is_neginfty(get());
   return manage(res);
 }
 
-isl::boolean qpolynomial::is_zero() const
+boolean qpolynomial::is_zero() const
 {
   auto res = isl_qpolynomial_is_zero(get());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
+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);
 }
 
-isl::qpolynomial qpolynomial::mul(isl::qpolynomial qp2) const
+qpolynomial qpolynomial::mul(qpolynomial qp2) const
 {
   auto res = isl_qpolynomial_mul(copy(), qp2.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::nan_on_domain(isl::space dim)
+qpolynomial qpolynomial::nan_on_domain(space dim)
 {
   auto res = isl_qpolynomial_nan_on_domain(dim.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::neg() const
+qpolynomial qpolynomial::neg() const
 {
   auto res = isl_qpolynomial_neg(copy());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::neginfty_on_domain(isl::space dim)
+qpolynomial qpolynomial::neginfty_on_domain(space dim)
 {
   auto res = isl_qpolynomial_neginfty_on_domain(dim.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::one_on_domain(isl::space dim)
+qpolynomial qpolynomial::one_on_domain(space dim)
 {
   auto res = isl_qpolynomial_one_on_domain(dim.release());
   return manage(res);
 }
 
-isl::boolean qpolynomial::plain_is_equal(const isl::qpolynomial &qp2) const
+boolean qpolynomial::plain_is_equal(const qpolynomial &qp2) const
 {
   auto res = isl_qpolynomial_plain_is_equal(get(), qp2.get());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::pow(unsigned int power) const
+qpolynomial qpolynomial::pow(unsigned int power) const
 {
   auto res = isl_qpolynomial_pow(copy(), power);
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::project_domain_on_params() const
+qpolynomial qpolynomial::project_domain_on_params() const
 {
   auto res = isl_qpolynomial_project_domain_on_params(copy());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::scale_down_val(isl::val v) const
+qpolynomial qpolynomial::scale_down_val(val v) const
 {
   auto res = isl_qpolynomial_scale_down_val(copy(), v.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::scale_val(isl::val v) const
+qpolynomial qpolynomial::scale_val(val v) const
 {
   auto res = isl_qpolynomial_scale_val(copy(), v.release());
   return manage(res);
@@ -13638,35 +13638,35 @@
   return res;
 }
 
-isl::qpolynomial qpolynomial::sub(isl::qpolynomial qp2) const
+qpolynomial qpolynomial::sub(qpolynomial qp2) const
 {
   auto res = isl_qpolynomial_sub(copy(), qp2.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::val_on_domain(isl::space space, isl::val val)
+qpolynomial qpolynomial::val_on_domain(space space, val val)
 {
   auto res = isl_qpolynomial_val_on_domain(space.release(), val.release());
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::var_on_domain(isl::space dim, isl::dim type, unsigned int pos)
+qpolynomial qpolynomial::var_on_domain(space dim, isl::dim type, unsigned int pos)
 {
   auto res = isl_qpolynomial_var_on_domain(dim.release(), static_cast<enum isl_dim_type>(type), pos);
   return manage(res);
 }
 
-isl::qpolynomial qpolynomial::zero_on_domain(isl::space dim)
+qpolynomial qpolynomial::zero_on_domain(space dim)
 {
   auto res = isl_qpolynomial_zero_on_domain(dim.release());
   return manage(res);
 }
 
 // implementations for isl::schedule
-isl::schedule manage(__isl_take isl_schedule *ptr) {
+schedule manage(__isl_take isl_schedule *ptr) {
   return schedule(ptr);
 }
-isl::schedule manage_copy(__isl_keep isl_schedule *ptr) {
+schedule manage_copy(__isl_keep isl_schedule *ptr) {
   ptr = isl_schedule_copy(ptr);
   return schedule(ptr);
 }
@@ -13674,7 +13674,7 @@
 schedule::schedule()
     : ptr(nullptr) {}
 
-schedule::schedule(const isl::schedule &obj)
+schedule::schedule(const schedule &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -13686,13 +13686,13 @@
 schedule::schedule(__isl_take isl_schedule *ptr)
     : ptr(ptr) {}
 
-schedule::schedule(isl::ctx ctx, const std::string &str)
+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=(isl::schedule obj) {
+schedule &schedule::operator=(schedule obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -13724,8 +13724,8 @@
 }
 
 
-isl::ctx schedule::get_ctx() const {
-  return isl::ctx(isl_schedule_get_ctx(ptr));
+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());
@@ -13742,101 +13742,101 @@
 }
 
 
-isl::schedule schedule::align_params(isl::space space) const
+schedule schedule::align_params(space space) const
 {
   auto res = isl_schedule_align_params(copy(), space.release());
   return manage(res);
 }
 
-isl::schedule schedule::empty(isl::space space)
+schedule schedule::empty(space space)
 {
   auto res = isl_schedule_empty(space.release());
   return manage(res);
 }
 
-isl::schedule schedule::from_domain(isl::union_set domain)
+schedule schedule::from_domain(union_set domain)
 {
   auto res = isl_schedule_from_domain(domain.release());
   return manage(res);
 }
 
-isl::union_set schedule::get_domain() const
+union_set schedule::get_domain() const
 {
   auto res = isl_schedule_get_domain(get());
   return manage(res);
 }
 
-isl::union_map schedule::get_map() const
+union_map schedule::get_map() const
 {
   auto res = isl_schedule_get_map(get());
   return manage(res);
 }
 
-isl::schedule_node schedule::get_root() const
+schedule_node schedule::get_root() const
 {
   auto res = isl_schedule_get_root(get());
   return manage(res);
 }
 
-isl::schedule schedule::gist_domain_params(isl::set context) const
+schedule schedule::gist_domain_params(set context) const
 {
   auto res = isl_schedule_gist_domain_params(copy(), context.release());
   return manage(res);
 }
 
-isl::schedule schedule::insert_context(isl::set context) const
+schedule schedule::insert_context(set context) const
 {
   auto res = isl_schedule_insert_context(copy(), context.release());
   return manage(res);
 }
 
-isl::schedule schedule::insert_guard(isl::set guard) const
+schedule schedule::insert_guard(set guard) const
 {
   auto res = isl_schedule_insert_guard(copy(), guard.release());
   return manage(res);
 }
 
-isl::schedule schedule::insert_partial_schedule(isl::multi_union_pw_aff partial) const
+schedule schedule::insert_partial_schedule(multi_union_pw_aff partial) const
 {
   auto res = isl_schedule_insert_partial_schedule(copy(), partial.release());
   return manage(res);
 }
 
-isl::schedule schedule::intersect_domain(isl::union_set domain) const
+schedule schedule::intersect_domain(union_set domain) const
 {
   auto res = isl_schedule_intersect_domain(copy(), domain.release());
   return manage(res);
 }
 
-isl::boolean schedule::plain_is_equal(const isl::schedule &schedule2) const
+boolean schedule::plain_is_equal(const schedule &schedule2) const
 {
   auto res = isl_schedule_plain_is_equal(get(), schedule2.get());
   return manage(res);
 }
 
-isl::schedule schedule::pullback(isl::union_pw_multi_aff upma) const
+schedule schedule::pullback(union_pw_multi_aff upma) const
 {
   auto res = isl_schedule_pullback_union_pw_multi_aff(copy(), upma.release());
   return manage(res);
 }
 
-isl::schedule schedule::reset_user() const
+schedule schedule::reset_user() const
 {
   auto res = isl_schedule_reset_user(copy());
   return manage(res);
 }
 
-isl::schedule schedule::sequence(isl::schedule schedule2) const
+schedule schedule::sequence(schedule schedule2) const
 {
   auto res = isl_schedule_sequence(copy(), schedule2.release());
   return manage(res);
 }
 
 // implementations for isl::schedule_constraints
-isl::schedule_constraints manage(__isl_take isl_schedule_constraints *ptr) {
+schedule_constraints manage(__isl_take isl_schedule_constraints *ptr) {
   return schedule_constraints(ptr);
 }
-isl::schedule_constraints manage_copy(__isl_keep isl_schedule_constraints *ptr) {
+schedule_constraints manage_copy(__isl_keep isl_schedule_constraints *ptr) {
   ptr = isl_schedule_constraints_copy(ptr);
   return schedule_constraints(ptr);
 }
@@ -13844,7 +13844,7 @@
 schedule_constraints::schedule_constraints()
     : ptr(nullptr) {}
 
-schedule_constraints::schedule_constraints(const isl::schedule_constraints &obj)
+schedule_constraints::schedule_constraints(const schedule_constraints &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -13856,13 +13856,13 @@
 schedule_constraints::schedule_constraints(__isl_take isl_schedule_constraints *ptr)
     : ptr(ptr) {}
 
-schedule_constraints::schedule_constraints(isl::ctx ctx, const std::string &str)
+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=(isl::schedule_constraints obj) {
+schedule_constraints &schedule_constraints::operator=(schedule_constraints obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -13894,8 +13894,8 @@
 }
 
 
-isl::ctx schedule_constraints::get_ctx() const {
-  return isl::ctx(isl_schedule_constraints_get_ctx(ptr));
+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());
@@ -13912,101 +13912,101 @@
 }
 
 
-isl::schedule_constraints schedule_constraints::apply(isl::union_map umap) const
+schedule_constraints schedule_constraints::apply(union_map umap) const
 {
   auto res = isl_schedule_constraints_apply(copy(), umap.release());
   return manage(res);
 }
 
-isl::schedule schedule_constraints::compute_schedule() const
+schedule schedule_constraints::compute_schedule() const
 {
   auto res = isl_schedule_constraints_compute_schedule(copy());
   return manage(res);
 }
 
-isl::union_map schedule_constraints::get_coincidence() const
+union_map schedule_constraints::get_coincidence() const
 {
   auto res = isl_schedule_constraints_get_coincidence(get());
   return manage(res);
 }
 
-isl::union_map schedule_constraints::get_conditional_validity() const
+union_map schedule_constraints::get_conditional_validity() const
 {
   auto res = isl_schedule_constraints_get_conditional_validity(get());
   return manage(res);
 }
 
-isl::union_map schedule_constraints::get_conditional_validity_condition() const
+union_map schedule_constraints::get_conditional_validity_condition() const
 {
   auto res = isl_schedule_constraints_get_conditional_validity_condition(get());
   return manage(res);
 }
 
-isl::set schedule_constraints::get_context() const
+set schedule_constraints::get_context() const
 {
   auto res = isl_schedule_constraints_get_context(get());
   return manage(res);
 }
 
-isl::union_set schedule_constraints::get_domain() const
+union_set schedule_constraints::get_domain() const
 {
   auto res = isl_schedule_constraints_get_domain(get());
   return manage(res);
 }
 
-isl::union_map schedule_constraints::get_proximity() const
+union_map schedule_constraints::get_proximity() const
 {
   auto res = isl_schedule_constraints_get_proximity(get());
   return manage(res);
 }
 
-isl::union_map schedule_constraints::get_validity() const
+union_map schedule_constraints::get_validity() const
 {
   auto res = isl_schedule_constraints_get_validity(get());
   return manage(res);
 }
 
-isl::schedule_constraints schedule_constraints::on_domain(isl::union_set domain)
+schedule_constraints schedule_constraints::on_domain(union_set domain)
 {
   auto res = isl_schedule_constraints_on_domain(domain.release());
   return manage(res);
 }
 
-isl::schedule_constraints schedule_constraints::set_coincidence(isl::union_map coincidence) const
+schedule_constraints schedule_constraints::set_coincidence(union_map coincidence) const
 {
   auto res = isl_schedule_constraints_set_coincidence(copy(), coincidence.release());
   return manage(res);
 }
 
-isl::schedule_constraints schedule_constraints::set_conditional_validity(isl::union_map condition, isl::union_map validity) const
+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);
 }
 
-isl::schedule_constraints schedule_constraints::set_context(isl::set context) const
+schedule_constraints schedule_constraints::set_context(set context) const
 {
   auto res = isl_schedule_constraints_set_context(copy(), context.release());
   return manage(res);
 }
 
-isl::schedule_constraints schedule_constraints::set_proximity(isl::union_map proximity) const
+schedule_constraints schedule_constraints::set_proximity(union_map proximity) const
 {
   auto res = isl_schedule_constraints_set_proximity(copy(), proximity.release());
   return manage(res);
 }
 
-isl::schedule_constraints schedule_constraints::set_validity(isl::union_map validity) const
+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
-isl::schedule_node manage(__isl_take isl_schedule_node *ptr) {
+schedule_node manage(__isl_take isl_schedule_node *ptr) {
   return schedule_node(ptr);
 }
-isl::schedule_node manage_copy(__isl_keep isl_schedule_node *ptr) {
+schedule_node manage_copy(__isl_keep isl_schedule_node *ptr) {
   ptr = isl_schedule_node_copy(ptr);
   return schedule_node(ptr);
 }
@@ -14014,7 +14014,7 @@
 schedule_node::schedule_node()
     : ptr(nullptr) {}
 
-schedule_node::schedule_node(const isl::schedule_node &obj)
+schedule_node::schedule_node(const schedule_node &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -14027,7 +14027,7 @@
     : ptr(ptr) {}
 
 
-schedule_node &schedule_node::operator=(isl::schedule_node obj) {
+schedule_node &schedule_node::operator=(schedule_node obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -14059,8 +14059,8 @@
 }
 
 
-isl::ctx schedule_node::get_ctx() const {
-  return isl::ctx(isl_schedule_node_get_ctx(ptr));
+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());
@@ -14077,123 +14077,123 @@
 }
 
 
-isl::schedule_node schedule_node::align_params(isl::space space) const
+schedule_node schedule_node::align_params(space space) const
 {
   auto res = isl_schedule_node_align_params(copy(), space.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::ancestor(int generation) const
+schedule_node schedule_node::ancestor(int generation) const
 {
   auto res = isl_schedule_node_ancestor(copy(), generation);
   return manage(res);
 }
 
-isl::boolean schedule_node::band_member_get_coincident(int pos) const
+boolean schedule_node::band_member_get_coincident(int pos) const
 {
   auto res = isl_schedule_node_band_member_get_coincident(get(), pos);
   return manage(res);
 }
 
-isl::schedule_node schedule_node::band_member_set_coincident(int pos, int coincident) const
+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);
 }
 
-isl::schedule_node schedule_node::band_set_ast_build_options(isl::union_set options) const
+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);
 }
 
-isl::schedule_node schedule_node::child(int pos) const
+schedule_node schedule_node::child(int pos) const
 {
   auto res = isl_schedule_node_child(copy(), pos);
   return manage(res);
 }
 
-isl::set schedule_node::context_get_context() const
+set schedule_node::context_get_context() const
 {
   auto res = isl_schedule_node_context_get_context(get());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::cut() const
+schedule_node schedule_node::cut() const
 {
   auto res = isl_schedule_node_cut(copy());
   return manage(res);
 }
 
-isl::union_set schedule_node::domain_get_domain() const
+union_set schedule_node::domain_get_domain() const
 {
   auto res = isl_schedule_node_domain_get_domain(get());
   return manage(res);
 }
 
-isl::union_pw_multi_aff schedule_node::expansion_get_contraction() const
+union_pw_multi_aff schedule_node::expansion_get_contraction() const
 {
   auto res = isl_schedule_node_expansion_get_contraction(get());
   return manage(res);
 }
 
-isl::union_map schedule_node::expansion_get_expansion() const
+union_map schedule_node::expansion_get_expansion() const
 {
   auto res = isl_schedule_node_expansion_get_expansion(get());
   return manage(res);
 }
 
-isl::union_map schedule_node::extension_get_extension() const
+union_map schedule_node::extension_get_extension() const
 {
   auto res = isl_schedule_node_extension_get_extension(get());
   return manage(res);
 }
 
-isl::union_set schedule_node::filter_get_filter() const
+union_set schedule_node::filter_get_filter() const
 {
   auto res = isl_schedule_node_filter_get_filter(get());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::first_child() const
+schedule_node schedule_node::first_child() const
 {
   auto res = isl_schedule_node_first_child(copy());
   return manage(res);
 }
 
-isl::stat schedule_node::foreach_ancestor_top_down(const std::function<isl::stat(isl::schedule_node)> &fn) const
+stat schedule_node::foreach_ancestor_top_down(const std::function<stat(schedule_node)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::schedule_node)> *func;
+    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)(isl::manage(arg_0));
+    stat ret = (*data->func)(manage(arg_0));
     return ret.release();
   };
   auto res = isl_schedule_node_foreach_ancestor_top_down(get(), fn_lambda, &fn_data);
   return manage(res);
 }
 
-isl::schedule_node schedule_node::from_domain(isl::union_set domain)
+schedule_node schedule_node::from_domain(union_set domain)
 {
   auto res = isl_schedule_node_from_domain(domain.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::from_extension(isl::union_map extension)
+schedule_node schedule_node::from_extension(union_map extension)
 {
   auto res = isl_schedule_node_from_extension(extension.release());
   return manage(res);
 }
 
-int schedule_node::get_ancestor_child_position(const isl::schedule_node &ancestor) const
+int 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;
 }
 
-isl::schedule_node schedule_node::get_child(int pos) const
+schedule_node schedule_node::get_child(int pos) const
 {
   auto res = isl_schedule_node_get_child(get(), pos);
   return manage(res);
@@ -14205,37 +14205,37 @@
   return res;
 }
 
-isl::union_set schedule_node::get_domain() const
+union_set schedule_node::get_domain() const
 {
   auto res = isl_schedule_node_get_domain(get());
   return manage(res);
 }
 
-isl::multi_union_pw_aff schedule_node::get_prefix_schedule_multi_union_pw_aff() const
+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);
 }
 
-isl::union_map schedule_node::get_prefix_schedule_relation() const
+union_map schedule_node::get_prefix_schedule_relation() const
 {
   auto res = isl_schedule_node_get_prefix_schedule_relation(get());
   return manage(res);
 }
 
-isl::union_map schedule_node::get_prefix_schedule_union_map() const
+union_map schedule_node::get_prefix_schedule_union_map() const
 {
   auto res = isl_schedule_node_get_prefix_schedule_union_map(get());
   return manage(res);
 }
 
-isl::union_pw_multi_aff schedule_node::get_prefix_schedule_union_pw_multi_aff() const
+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);
 }
 
-isl::schedule schedule_node::get_schedule() const
+schedule schedule_node::get_schedule() const
 {
   auto res = isl_schedule_node_get_schedule(get());
   return manage(res);
@@ -14247,25 +14247,25 @@
   return res;
 }
 
-isl::schedule_node schedule_node::get_shared_ancestor(const isl::schedule_node &node2) const
+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);
 }
 
-isl::union_pw_multi_aff schedule_node::get_subtree_contraction() const
+union_pw_multi_aff schedule_node::get_subtree_contraction() const
 {
   auto res = isl_schedule_node_get_subtree_contraction(get());
   return manage(res);
 }
 
-isl::union_map schedule_node::get_subtree_expansion() const
+union_map schedule_node::get_subtree_expansion() const
 {
   auto res = isl_schedule_node_get_subtree_expansion(get());
   return manage(res);
 }
 
-isl::union_map schedule_node::get_subtree_schedule_union_map() const
+union_map schedule_node::get_subtree_schedule_union_map() const
 {
   auto res = isl_schedule_node_get_subtree_schedule_union_map(get());
   return manage(res);
@@ -14277,115 +14277,115 @@
   return res;
 }
 
-isl::union_set schedule_node::get_universe_domain() const
+union_set schedule_node::get_universe_domain() const
 {
   auto res = isl_schedule_node_get_universe_domain(get());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::graft_after(isl::schedule_node graft) const
+schedule_node schedule_node::graft_after(schedule_node graft) const
 {
   auto res = isl_schedule_node_graft_after(copy(), graft.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::graft_before(isl::schedule_node graft) const
+schedule_node schedule_node::graft_before(schedule_node graft) const
 {
   auto res = isl_schedule_node_graft_before(copy(), graft.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::group(isl::id group_id) const
+schedule_node schedule_node::group(id group_id) const
 {
   auto res = isl_schedule_node_group(copy(), group_id.release());
   return manage(res);
 }
 
-isl::set schedule_node::guard_get_guard() const
+set schedule_node::guard_get_guard() const
 {
   auto res = isl_schedule_node_guard_get_guard(get());
   return manage(res);
 }
 
-isl::boolean schedule_node::has_children() const
+boolean schedule_node::has_children() const
 {
   auto res = isl_schedule_node_has_children(get());
   return manage(res);
 }
 
-isl::boolean schedule_node::has_next_sibling() const
+boolean schedule_node::has_next_sibling() const
 {
   auto res = isl_schedule_node_has_next_sibling(get());
   return manage(res);
 }
 
-isl::boolean schedule_node::has_parent() const
+boolean schedule_node::has_parent() const
 {
   auto res = isl_schedule_node_has_parent(get());
   return manage(res);
 }
 
-isl::boolean schedule_node::has_previous_sibling() const
+boolean schedule_node::has_previous_sibling() const
 {
   auto res = isl_schedule_node_has_previous_sibling(get());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::insert_context(isl::set context) const
+schedule_node schedule_node::insert_context(set context) const
 {
   auto res = isl_schedule_node_insert_context(copy(), context.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::insert_filter(isl::union_set filter) const
+schedule_node schedule_node::insert_filter(union_set filter) const
 {
   auto res = isl_schedule_node_insert_filter(copy(), filter.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::insert_guard(isl::set context) const
+schedule_node schedule_node::insert_guard(set context) const
 {
   auto res = isl_schedule_node_insert_guard(copy(), context.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::insert_mark(isl::id mark) const
+schedule_node schedule_node::insert_mark(id mark) const
 {
   auto res = isl_schedule_node_insert_mark(copy(), mark.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::insert_partial_schedule(isl::multi_union_pw_aff schedule) const
+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);
 }
 
-isl::schedule_node schedule_node::insert_sequence(isl::union_set_list filters) const
+schedule_node schedule_node::insert_sequence(union_set_list filters) const
 {
   auto res = isl_schedule_node_insert_sequence(copy(), filters.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::insert_set(isl::union_set_list filters) const
+schedule_node schedule_node::insert_set(union_set_list filters) const
 {
   auto res = isl_schedule_node_insert_set(copy(), filters.release());
   return manage(res);
 }
 
-isl::boolean schedule_node::is_equal(const isl::schedule_node &node2) const
+boolean schedule_node::is_equal(const schedule_node &node2) const
 {
   auto res = isl_schedule_node_is_equal(get(), node2.get());
   return manage(res);
 }
 
-isl::boolean schedule_node::is_subtree_anchored() const
+boolean schedule_node::is_subtree_anchored() const
 {
   auto res = isl_schedule_node_is_subtree_anchored(get());
   return manage(res);
 }
 
-isl::id schedule_node::mark_get_id() const
+id schedule_node::mark_get_id() const
 {
   auto res = isl_schedule_node_mark_get_id(get());
   return manage(res);
@@ -14397,59 +14397,59 @@
   return res;
 }
 
-isl::schedule_node schedule_node::next_sibling() const
+schedule_node schedule_node::next_sibling() const
 {
   auto res = isl_schedule_node_next_sibling(copy());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::order_after(isl::union_set filter) const
+schedule_node schedule_node::order_after(union_set filter) const
 {
   auto res = isl_schedule_node_order_after(copy(), filter.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::order_before(isl::union_set filter) const
+schedule_node schedule_node::order_before(union_set filter) const
 {
   auto res = isl_schedule_node_order_before(copy(), filter.release());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::parent() const
+schedule_node schedule_node::parent() const
 {
   auto res = isl_schedule_node_parent(copy());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::previous_sibling() const
+schedule_node schedule_node::previous_sibling() const
 {
   auto res = isl_schedule_node_previous_sibling(copy());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::reset_user() const
+schedule_node schedule_node::reset_user() const
 {
   auto res = isl_schedule_node_reset_user(copy());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::root() const
+schedule_node schedule_node::root() const
 {
   auto res = isl_schedule_node_root(copy());
   return manage(res);
 }
 
-isl::schedule_node schedule_node::sequence_splice_child(int pos) const
+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
-isl::set manage(__isl_take isl_set *ptr) {
+set manage(__isl_take isl_set *ptr) {
   return set(ptr);
 }
-isl::set manage_copy(__isl_keep isl_set *ptr) {
+set manage_copy(__isl_keep isl_set *ptr) {
   ptr = isl_set_copy(ptr);
   return set(ptr);
 }
@@ -14457,7 +14457,7 @@
 set::set()
     : ptr(nullptr) {}
 
-set::set(const isl::set &obj)
+set::set(const set &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -14469,28 +14469,28 @@
 set::set(__isl_take isl_set *ptr)
     : ptr(ptr) {}
 
-set::set(isl::ctx ctx, const std::string &str)
+set::set(ctx ctx, const std::string &str)
 {
   auto res = isl_set_read_from_str(ctx.release(), str.c_str());
   ptr = res;
 }
-set::set(isl::basic_set bset)
+set::set(basic_set bset)
 {
   auto res = isl_set_from_basic_set(bset.release());
   ptr = res;
 }
-set::set(isl::point pnt)
+set::set(point pnt)
 {
   auto res = isl_set_from_point(pnt.release());
   ptr = res;
 }
-set::set(isl::union_set uset)
+set::set(union_set uset)
 {
   auto res = isl_set_from_union_set(uset.release());
   ptr = res;
 }
 
-set &set::operator=(isl::set obj) {
+set &set::operator=(set obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -14522,8 +14522,8 @@
 }
 
 
-isl::ctx set::get_ctx() const {
-  return isl::ctx(isl_set_get_ctx(ptr));
+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());
@@ -14540,79 +14540,79 @@
 }
 
 
-isl::set set::add_constraint(isl::constraint constraint) const
+set set::add_constraint(constraint constraint) const
 {
   auto res = isl_set_add_constraint(copy(), constraint.release());
   return manage(res);
 }
 
-isl::set set::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::basic_set set::affine_hull() const
+basic_set set::affine_hull() const
 {
   auto res = isl_set_affine_hull(copy());
   return manage(res);
 }
 
-isl::set set::align_params(isl::space model) const
+set set::align_params(space model) const
 {
   auto res = isl_set_align_params(copy(), model.release());
   return manage(res);
 }
 
-isl::set set::apply(isl::map map) const
+set set::apply(map map) const
 {
   auto res = isl_set_apply(copy(), map.release());
   return manage(res);
 }
 
-isl::basic_set set::bounded_simple_hull() const
+basic_set set::bounded_simple_hull() const
 {
   auto res = isl_set_bounded_simple_hull(copy());
   return manage(res);
 }
 
-isl::set set::box_from_points(isl::point pnt1, isl::point pnt2)
+set set::box_from_points(point pnt1, point pnt2)
 {
   auto res = isl_set_box_from_points(pnt1.release(), pnt2.release());
   return manage(res);
 }
 
-isl::set set::coalesce() const
+set set::coalesce() const
 {
   auto res = isl_set_coalesce(copy());
   return manage(res);
 }
 
-isl::basic_set set::coefficients() const
+basic_set set::coefficients() const
 {
   auto res = isl_set_coefficients(copy());
   return manage(res);
 }
 
-isl::set set::complement() const
+set set::complement() const
 {
   auto res = isl_set_complement(copy());
   return manage(res);
 }
 
-isl::basic_set set::convex_hull() const
+basic_set set::convex_hull() const
 {
   auto res = isl_set_convex_hull(copy());
   return manage(res);
 }
 
-isl::val set::count_val() const
+val set::count_val() const
 {
   auto res = isl_set_count_val(get());
   return manage(res);
 }
 
-isl::set set::detect_equalities() const
+set set::detect_equalities() const
 {
   auto res = isl_set_detect_equalities(copy());
   return manage(res);
@@ -14624,85 +14624,85 @@
   return res;
 }
 
-isl::boolean set::dim_has_any_lower_bound(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean set::dim_has_any_upper_bound(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean set::dim_has_lower_bound(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean set::dim_has_upper_bound(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean set::dim_is_bounded(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::pw_aff set::dim_max(int pos) const
+pw_aff set::dim_max(int pos) const
 {
   auto res = isl_set_dim_max(copy(), pos);
   return manage(res);
 }
 
-isl::pw_aff set::dim_min(int pos) const
+pw_aff set::dim_min(int pos) const
 {
   auto res = isl_set_dim_min(copy(), pos);
   return manage(res);
 }
 
-isl::set set::drop_constraints_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::set set::drop_constraints_not_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::set set::drop_unused_params() const
+set set::drop_unused_params() const
 {
   auto res = isl_set_drop_unused_params(copy());
   return manage(res);
 }
 
-isl::set set::eliminate(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::set set::empty(isl::space space)
+set set::empty(space space)
 {
   auto res = isl_set_empty(space.release());
   return manage(res);
 }
 
-isl::set set::equate(isl::dim type1, int pos1, isl::dim type2, int pos2) const
+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 isl::id &id) const
+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;
@@ -14714,107 +14714,107 @@
   return res;
 }
 
-isl::set set::fix_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::set set::fix_val(isl::dim type, unsigned int pos, isl::val v) const
+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);
 }
 
-isl::set set::flat_product(isl::set set2) const
+set set::flat_product(set set2) const
 {
   auto res = isl_set_flat_product(copy(), set2.release());
   return manage(res);
 }
 
-isl::set set::flatten() const
+set set::flatten() const
 {
   auto res = isl_set_flatten(copy());
   return manage(res);
 }
 
-isl::map set::flatten_map() const
+map set::flatten_map() const
 {
   auto res = isl_set_flatten_map(copy());
   return manage(res);
 }
 
-int set::follows_at(const isl::set &set2, int pos) const
+int set::follows_at(const set &set2, int pos) const
 {
   auto res = isl_set_follows_at(get(), set2.get(), pos);
   return res;
 }
 
-isl::stat set::foreach_basic_set(const std::function<isl::stat(isl::basic_set)> &fn) const
+stat set::foreach_basic_set(const std::function<stat(basic_set)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::basic_set)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::stat set::foreach_point(const std::function<isl::stat(isl::point)> &fn) const
+stat set::foreach_point(const std::function<stat(point)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::point)> *func;
+    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)(isl::manage(arg_0));
+    stat ret = (*data->func)(manage(arg_0));
     return ret.release();
   };
   auto res = isl_set_foreach_point(get(), fn_lambda, &fn_data);
   return manage(res);
 }
 
-isl::set set::from_multi_aff(isl::multi_aff ma)
+set set::from_multi_aff(multi_aff ma)
 {
   auto res = isl_set_from_multi_aff(ma.release());
   return manage(res);
 }
 
-isl::set set::from_multi_pw_aff(isl::multi_pw_aff mpa)
+set set::from_multi_pw_aff(multi_pw_aff mpa)
 {
   auto res = isl_set_from_multi_pw_aff(mpa.release());
   return manage(res);
 }
 
-isl::set set::from_params() const
+set set::from_params() const
 {
   auto res = isl_set_from_params(copy());
   return manage(res);
 }
 
-isl::set set::from_pw_aff(isl::pw_aff pwaff)
+set set::from_pw_aff(pw_aff pwaff)
 {
   auto res = isl_set_from_pw_aff(pwaff.release());
   return manage(res);
 }
 
-isl::set set::from_pw_multi_aff(isl::pw_multi_aff pma)
+set set::from_pw_multi_aff(pw_multi_aff pma)
 {
   auto res = isl_set_from_pw_multi_aff(pma.release());
   return manage(res);
 }
 
-isl::basic_set_list set::get_basic_set_list() const
+basic_set_list set::get_basic_set_list() const
 {
   auto res = isl_set_get_basic_set_list(get());
   return manage(res);
 }
 
-isl::id set::get_dim_id(isl::dim type, unsigned int pos) const
+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);
@@ -14827,19 +14827,19 @@
   return tmp;
 }
 
-isl::space set::get_space() const
+space set::get_space() const
 {
   auto res = isl_set_get_space(get());
   return manage(res);
 }
 
-isl::val set::get_stride(int pos) const
+val set::get_stride(int pos) const
 {
   auto res = isl_set_get_stride(get(), pos);
   return manage(res);
 }
 
-isl::id set::get_tuple_id() const
+id set::get_tuple_id() const
 {
   auto res = isl_set_get_tuple_id(get());
   return manage(res);
@@ -14852,223 +14852,223 @@
   return tmp;
 }
 
-isl::set set::gist(isl::set context) const
+set set::gist(set context) const
 {
   auto res = isl_set_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::set set::gist_basic_set(isl::basic_set context) const
+set set::gist_basic_set(basic_set context) const
 {
   auto res = isl_set_gist_basic_set(copy(), context.release());
   return manage(res);
 }
 
-isl::set set::gist_params(isl::set context) const
+set set::gist_params(set context) const
 {
   auto res = isl_set_gist_params(copy(), context.release());
   return manage(res);
 }
 
-isl::boolean set::has_dim_id(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean set::has_dim_name(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean set::has_equal_space(const isl::set &set2) const
+boolean set::has_equal_space(const set &set2) const
 {
   auto res = isl_set_has_equal_space(get(), set2.get());
   return manage(res);
 }
 
-isl::boolean set::has_tuple_id() const
+boolean set::has_tuple_id() const
 {
   auto res = isl_set_has_tuple_id(get());
   return manage(res);
 }
 
-isl::boolean set::has_tuple_name() const
+boolean set::has_tuple_name() const
 {
   auto res = isl_set_has_tuple_name(get());
   return manage(res);
 }
 
-isl::map set::identity() const
+map set::identity() const
 {
   auto res = isl_set_identity(copy());
   return manage(res);
 }
 
-isl::pw_aff set::indicator_function() const
+pw_aff set::indicator_function() const
 {
   auto res = isl_set_indicator_function(copy());
   return manage(res);
 }
 
-isl::set set::insert_dims(isl::dim type, unsigned int pos, unsigned int n) const
+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);
 }
 
-isl::set set::intersect(isl::set set2) const
+set set::intersect(set set2) const
 {
   auto res = isl_set_intersect(copy(), set2.release());
   return manage(res);
 }
 
-isl::set set::intersect_params(isl::set params) const
+set set::intersect_params(set params) const
 {
   auto res = isl_set_intersect_params(copy(), params.release());
   return manage(res);
 }
 
-isl::boolean set::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean set::is_bounded() const
+boolean set::is_bounded() const
 {
   auto res = isl_set_is_bounded(get());
   return manage(res);
 }
 
-isl::boolean set::is_box() const
+boolean set::is_box() const
 {
   auto res = isl_set_is_box(get());
   return manage(res);
 }
 
-isl::boolean set::is_disjoint(const isl::set &set2) const
+boolean set::is_disjoint(const set &set2) const
 {
   auto res = isl_set_is_disjoint(get(), set2.get());
   return manage(res);
 }
 
-isl::boolean set::is_empty() const
+boolean set::is_empty() const
 {
   auto res = isl_set_is_empty(get());
   return manage(res);
 }
 
-isl::boolean set::is_equal(const isl::set &set2) const
+boolean set::is_equal(const set &set2) const
 {
   auto res = isl_set_is_equal(get(), set2.get());
   return manage(res);
 }
 
-isl::boolean set::is_params() const
+boolean set::is_params() const
 {
   auto res = isl_set_is_params(get());
   return manage(res);
 }
 
-isl::boolean set::is_singleton() const
+boolean set::is_singleton() const
 {
   auto res = isl_set_is_singleton(get());
   return manage(res);
 }
 
-isl::boolean set::is_strict_subset(const isl::set &set2) const
+boolean set::is_strict_subset(const set &set2) const
 {
   auto res = isl_set_is_strict_subset(get(), set2.get());
   return manage(res);
 }
 
-isl::boolean set::is_subset(const isl::set &set2) const
+boolean set::is_subset(const set &set2) const
 {
   auto res = isl_set_is_subset(get(), set2.get());
   return manage(res);
 }
 
-isl::boolean set::is_wrapping() const
+boolean set::is_wrapping() const
 {
   auto res = isl_set_is_wrapping(get());
   return manage(res);
 }
 
-isl::map set::lex_ge_set(isl::set set2) const
+map set::lex_ge_set(set set2) const
 {
   auto res = isl_set_lex_ge_set(copy(), set2.release());
   return manage(res);
 }
 
-isl::map set::lex_gt_set(isl::set set2) const
+map set::lex_gt_set(set set2) const
 {
   auto res = isl_set_lex_gt_set(copy(), set2.release());
   return manage(res);
 }
 
-isl::map set::lex_le_set(isl::set set2) const
+map set::lex_le_set(set set2) const
 {
   auto res = isl_set_lex_le_set(copy(), set2.release());
   return manage(res);
 }
 
-isl::map set::lex_lt_set(isl::set set2) const
+map set::lex_lt_set(set set2) const
 {
   auto res = isl_set_lex_lt_set(copy(), set2.release());
   return manage(res);
 }
 
-isl::set set::lexmax() const
+set set::lexmax() const
 {
   auto res = isl_set_lexmax(copy());
   return manage(res);
 }
 
-isl::pw_multi_aff set::lexmax_pw_multi_aff() const
+pw_multi_aff set::lexmax_pw_multi_aff() const
 {
   auto res = isl_set_lexmax_pw_multi_aff(copy());
   return manage(res);
 }
 
-isl::set set::lexmin() const
+set set::lexmin() const
 {
   auto res = isl_set_lexmin(copy());
   return manage(res);
 }
 
-isl::pw_multi_aff set::lexmin_pw_multi_aff() const
+pw_multi_aff set::lexmin_pw_multi_aff() const
 {
   auto res = isl_set_lexmin_pw_multi_aff(copy());
   return manage(res);
 }
 
-isl::set set::lower_bound_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::set set::lower_bound_val(isl::dim type, unsigned int pos, isl::val value) const
+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);
 }
 
-isl::val set::max_val(const isl::aff &obj) const
+val set::max_val(const aff &obj) const
 {
   auto res = isl_set_max_val(get(), obj.get());
   return manage(res);
 }
 
-isl::val set::min_val(const isl::aff &obj) const
+val set::min_val(const aff &obj) const
 {
   auto res = isl_set_min_val(get(), obj.get());
   return manage(res);
 }
 
-isl::set set::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
+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);
@@ -15086,187 +15086,187 @@
   return res;
 }
 
-isl::set set::nat_universe(isl::space dim)
+set set::nat_universe(space dim)
 {
   auto res = isl_set_nat_universe(dim.release());
   return manage(res);
 }
 
-isl::set set::neg() const
+set set::neg() const
 {
   auto res = isl_set_neg(copy());
   return manage(res);
 }
 
-isl::set set::params() const
+set set::params() const
 {
   auto res = isl_set_params(copy());
   return manage(res);
 }
 
-int set::plain_cmp(const isl::set &set2) const
+int set::plain_cmp(const set &set2) const
 {
   auto res = isl_set_plain_cmp(get(), set2.get());
   return res;
 }
 
-isl::val set::plain_get_val_if_fixed(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean set::plain_is_disjoint(const isl::set &set2) const
+boolean set::plain_is_disjoint(const set &set2) const
 {
   auto res = isl_set_plain_is_disjoint(get(), set2.get());
   return manage(res);
 }
 
-isl::boolean set::plain_is_empty() const
+boolean set::plain_is_empty() const
 {
   auto res = isl_set_plain_is_empty(get());
   return manage(res);
 }
 
-isl::boolean set::plain_is_equal(const isl::set &set2) const
+boolean set::plain_is_equal(const set &set2) const
 {
   auto res = isl_set_plain_is_equal(get(), set2.get());
   return manage(res);
 }
 
-isl::boolean set::plain_is_universe() const
+boolean set::plain_is_universe() const
 {
   auto res = isl_set_plain_is_universe(get());
   return manage(res);
 }
 
-isl::basic_set set::plain_unshifted_simple_hull() const
+basic_set set::plain_unshifted_simple_hull() const
 {
   auto res = isl_set_plain_unshifted_simple_hull(copy());
   return manage(res);
 }
 
-isl::basic_set set::polyhedral_hull() const
+basic_set set::polyhedral_hull() const
 {
   auto res = isl_set_polyhedral_hull(copy());
   return manage(res);
 }
 
-isl::set set::preimage_multi_aff(isl::multi_aff ma) const
+set set::preimage_multi_aff(multi_aff ma) const
 {
   auto res = isl_set_preimage_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-isl::set set::preimage_multi_pw_aff(isl::multi_pw_aff mpa) const
+set set::preimage_multi_pw_aff(multi_pw_aff mpa) const
 {
   auto res = isl_set_preimage_multi_pw_aff(copy(), mpa.release());
   return manage(res);
 }
 
-isl::set set::preimage_pw_multi_aff(isl::pw_multi_aff pma) const
+set set::preimage_pw_multi_aff(pw_multi_aff pma) const
 {
   auto res = isl_set_preimage_pw_multi_aff(copy(), pma.release());
   return manage(res);
 }
 
-isl::set set::product(isl::set set2) const
+set set::product(set set2) const
 {
   auto res = isl_set_product(copy(), set2.release());
   return manage(res);
 }
 
-isl::map set::project_onto_map(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::set set::project_out(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::set set::remove_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::set set::remove_divs() const
+set set::remove_divs() const
 {
   auto res = isl_set_remove_divs(copy());
   return manage(res);
 }
 
-isl::set set::remove_divs_involving_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::set set::remove_redundancies() const
+set set::remove_redundancies() const
 {
   auto res = isl_set_remove_redundancies(copy());
   return manage(res);
 }
 
-isl::set set::remove_unknown_divs() const
+set set::remove_unknown_divs() const
 {
   auto res = isl_set_remove_unknown_divs(copy());
   return manage(res);
 }
 
-isl::set set::reset_space(isl::space dim) const
+set set::reset_space(space dim) const
 {
   auto res = isl_set_reset_space(copy(), dim.release());
   return manage(res);
 }
 
-isl::set set::reset_tuple_id() const
+set set::reset_tuple_id() const
 {
   auto res = isl_set_reset_tuple_id(copy());
   return manage(res);
 }
 
-isl::set set::reset_user() const
+set set::reset_user() const
 {
   auto res = isl_set_reset_user(copy());
   return manage(res);
 }
 
-isl::basic_set set::sample() const
+basic_set set::sample() const
 {
   auto res = isl_set_sample(copy());
   return manage(res);
 }
 
-isl::point set::sample_point() const
+point set::sample_point() const
 {
   auto res = isl_set_sample_point(copy());
   return manage(res);
 }
 
-isl::set set::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::set set::set_tuple_id(isl::id id) const
+set set::set_tuple_id(id id) const
 {
   auto res = isl_set_set_tuple_id(copy(), id.release());
   return manage(res);
 }
 
-isl::set set::set_tuple_name(const std::string &s) const
+set set::set_tuple_name(const std::string &s) const
 {
   auto res = isl_set_set_tuple_name(copy(), s.c_str());
   return manage(res);
 }
 
-isl::basic_set set::simple_hull() const
+basic_set set::simple_hull() const
 {
   auto res = isl_set_simple_hull(copy());
   return manage(res);
@@ -15278,83 +15278,83 @@
   return res;
 }
 
-isl::basic_set set::solutions() const
+basic_set set::solutions() const
 {
   auto res = isl_set_solutions(copy());
   return manage(res);
 }
 
-isl::set set::split_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::set set::subtract(isl::set set2) const
+set set::subtract(set set2) const
 {
   auto res = isl_set_subtract(copy(), set2.release());
   return manage(res);
 }
 
-isl::set set::sum(isl::set set2) const
+set set::sum(set set2) const
 {
   auto res = isl_set_sum(copy(), set2.release());
   return manage(res);
 }
 
-isl::set set::unite(isl::set set2) const
+set set::unite(set set2) const
 {
   auto res = isl_set_union(copy(), set2.release());
   return manage(res);
 }
 
-isl::set set::universe(isl::space space)
+set set::universe(space space)
 {
   auto res = isl_set_universe(space.release());
   return manage(res);
 }
 
-isl::basic_set set::unshifted_simple_hull() const
+basic_set set::unshifted_simple_hull() const
 {
   auto res = isl_set_unshifted_simple_hull(copy());
   return manage(res);
 }
 
-isl::basic_set set::unshifted_simple_hull_from_set_list(isl::set_list list) const
+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);
 }
 
-isl::map set::unwrap() const
+map set::unwrap() const
 {
   auto res = isl_set_unwrap(copy());
   return manage(res);
 }
 
-isl::set set::upper_bound_si(isl::dim type, unsigned int pos, int value) const
+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);
 }
 
-isl::set set::upper_bound_val(isl::dim type, unsigned int pos, isl::val value) const
+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);
 }
 
-isl::map set::wrapped_domain_map() const
+map set::wrapped_domain_map() const
 {
   auto res = isl_set_wrapped_domain_map(copy());
   return manage(res);
 }
 
 // implementations for isl::set_list
-isl::set_list manage(__isl_take isl_set_list *ptr) {
+set_list manage(__isl_take isl_set_list *ptr) {
   return set_list(ptr);
 }
-isl::set_list manage_copy(__isl_keep isl_set_list *ptr) {
+set_list manage_copy(__isl_keep isl_set_list *ptr) {
   ptr = isl_set_list_copy(ptr);
   return set_list(ptr);
 }
@@ -15362,7 +15362,7 @@
 set_list::set_list()
     : ptr(nullptr) {}
 
-set_list::set_list(const isl::set_list &obj)
+set_list::set_list(const set_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -15375,7 +15375,7 @@
     : ptr(ptr) {}
 
 
-set_list &set_list::operator=(isl::set_list obj) {
+set_list &set_list::operator=(set_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -15407,8 +15407,8 @@
 }
 
 
-isl::ctx set_list::get_ctx() const {
-  return isl::ctx(isl_set_list_get_ctx(ptr));
+ctx set_list::get_ctx() const {
+  return ctx(isl_set_list_get_ctx(ptr));
 }
 
 void set_list::dump() const {
@@ -15416,63 +15416,63 @@
 }
 
 
-isl::set_list set_list::add(isl::set el) const
+set_list set_list::add(set el) const
 {
   auto res = isl_set_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::set_list set_list::alloc(isl::ctx ctx, int n)
+set_list set_list::alloc(ctx ctx, int n)
 {
   auto res = isl_set_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::set_list set_list::concat(isl::set_list list2) const
+set_list set_list::concat(set_list list2) const
 {
   auto res = isl_set_list_concat(copy(), list2.release());
   return manage(res);
 }
 
-isl::set_list set_list::drop(unsigned int first, unsigned int n) const
+set_list set_list::drop(unsigned int first, unsigned int n) const
 {
   auto res = isl_set_list_drop(copy(), first, n);
   return manage(res);
 }
 
-isl::stat set_list::foreach(const std::function<isl::stat(isl::set)> &fn) const
+stat set_list::foreach(const std::function<stat(set)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::set)> *func;
+    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)(isl::manage(arg_0));
+    stat ret = (*data->func)(manage(arg_0));
     return ret.release();
   };
   auto res = isl_set_list_foreach(get(), fn_lambda, &fn_data);
   return manage(res);
 }
 
-isl::set_list set_list::from_set(isl::set el)
+set_list set_list::from_set(set el)
 {
   auto res = isl_set_list_from_set(el.release());
   return manage(res);
 }
 
-isl::set set_list::get_at(int index) const
+set set_list::get_at(int index) const
 {
   auto res = isl_set_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::set set_list::get_set(int index) const
+set set_list::get_set(int index) const
 {
   auto res = isl_set_list_get_set(get(), index);
   return manage(res);
 }
 
-isl::set_list set_list::insert(unsigned int pos, isl::set el) const
+set_list set_list::insert(unsigned int pos, set el) const
 {
   auto res = isl_set_list_insert(copy(), pos, el.release());
   return manage(res);
@@ -15484,13 +15484,13 @@
   return res;
 }
 
-isl::set_list set_list::reverse() const
+set_list set_list::reverse() const
 {
   auto res = isl_set_list_reverse(copy());
   return manage(res);
 }
 
-isl::set_list set_list::set_set(int index, isl::set el) const
+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);
@@ -15502,23 +15502,23 @@
   return res;
 }
 
-isl::set_list set_list::swap(unsigned int pos1, unsigned int pos2) const
+set_list set_list::swap(unsigned int pos1, unsigned int pos2) const
 {
   auto res = isl_set_list_swap(copy(), pos1, pos2);
   return manage(res);
 }
 
-isl::set set_list::unite() const
+set set_list::unite() const
 {
   auto res = isl_set_list_union(copy());
   return manage(res);
 }
 
 // implementations for isl::space
-isl::space manage(__isl_take isl_space *ptr) {
+space manage(__isl_take isl_space *ptr) {
   return space(ptr);
 }
-isl::space manage_copy(__isl_keep isl_space *ptr) {
+space manage_copy(__isl_keep isl_space *ptr) {
   ptr = isl_space_copy(ptr);
   return space(ptr);
 }
@@ -15526,7 +15526,7 @@
 space::space()
     : ptr(nullptr) {}
 
-space::space(const isl::space &obj)
+space::space(const space &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -15538,18 +15538,18 @@
 space::space(__isl_take isl_space *ptr)
     : ptr(ptr) {}
 
-space::space(isl::ctx ctx, unsigned int nparam, unsigned int n_in, unsigned int n_out)
+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(isl::ctx ctx, unsigned int nparam, unsigned int dim)
+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=(isl::space obj) {
+space &space::operator=(space obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -15581,8 +15581,8 @@
 }
 
 
-isl::ctx space::get_ctx() const {
-  return isl::ctx(isl_space_get_ctx(ptr));
+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());
@@ -15599,49 +15599,49 @@
 }
 
 
-isl::space space::add_dims(isl::dim type, unsigned int n) const
+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);
 }
 
-isl::space space::add_param_id(isl::id id) const
+space space::add_param_id(id id) const
 {
   auto res = isl_space_add_param_id(copy(), id.release());
   return manage(res);
 }
 
-isl::space space::align_params(isl::space dim2) const
+space space::align_params(space dim2) const
 {
   auto res = isl_space_align_params(copy(), dim2.release());
   return manage(res);
 }
 
-isl::boolean space::can_curry() const
+boolean space::can_curry() const
 {
   auto res = isl_space_can_curry(get());
   return manage(res);
 }
 
-isl::boolean space::can_range_curry() const
+boolean space::can_range_curry() const
 {
   auto res = isl_space_can_range_curry(get());
   return manage(res);
 }
 
-isl::boolean space::can_uncurry() const
+boolean space::can_uncurry() const
 {
   auto res = isl_space_can_uncurry(get());
   return manage(res);
 }
 
-isl::boolean space::can_zip() const
+boolean space::can_zip() const
 {
   auto res = isl_space_can_zip(get());
   return manage(res);
 }
 
-isl::space space::curry() const
+space space::curry() const
 {
   auto res = isl_space_curry(copy());
   return manage(res);
@@ -15653,61 +15653,61 @@
   return res;
 }
 
-isl::space space::domain() const
+space space::domain() const
 {
   auto res = isl_space_domain(copy());
   return manage(res);
 }
 
-isl::space space::domain_factor_domain() const
+space space::domain_factor_domain() const
 {
   auto res = isl_space_domain_factor_domain(copy());
   return manage(res);
 }
 
-isl::space space::domain_factor_range() const
+space space::domain_factor_range() const
 {
   auto res = isl_space_domain_factor_range(copy());
   return manage(res);
 }
 
-isl::boolean space::domain_is_wrapping() const
+boolean space::domain_is_wrapping() const
 {
   auto res = isl_space_domain_is_wrapping(get());
   return manage(res);
 }
 
-isl::space space::domain_map() const
+space space::domain_map() const
 {
   auto res = isl_space_domain_map(copy());
   return manage(res);
 }
 
-isl::space space::domain_product(isl::space right) const
+space space::domain_product(space right) const
 {
   auto res = isl_space_domain_product(copy(), right.release());
   return manage(res);
 }
 
-isl::space space::drop_dims(isl::dim type, unsigned int first, unsigned int num) const
+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);
 }
 
-isl::space space::factor_domain() const
+space space::factor_domain() const
 {
   auto res = isl_space_factor_domain(copy());
   return manage(res);
 }
 
-isl::space space::factor_range() const
+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 isl::id &id) const
+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;
@@ -15719,31 +15719,31 @@
   return res;
 }
 
-isl::space space::flatten_domain() const
+space space::flatten_domain() const
 {
   auto res = isl_space_flatten_domain(copy());
   return manage(res);
 }
 
-isl::space space::flatten_range() const
+space space::flatten_range() const
 {
   auto res = isl_space_flatten_range(copy());
   return manage(res);
 }
 
-isl::space space::from_domain() const
+space space::from_domain() const
 {
   auto res = isl_space_from_domain(copy());
   return manage(res);
 }
 
-isl::space space::from_range() const
+space space::from_range() const
 {
   auto res = isl_space_from_range(copy());
   return manage(res);
 }
 
-isl::id space::get_dim_id(isl::dim type, unsigned int pos) const
+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);
@@ -15756,7 +15756,7 @@
   return tmp;
 }
 
-isl::id space::get_tuple_id(isl::dim type) const
+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);
@@ -15769,257 +15769,257 @@
   return tmp;
 }
 
-isl::boolean space::has_dim_id(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean space::has_dim_name(isl::dim type, unsigned int pos) const
+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);
 }
 
-isl::boolean space::has_equal_params(const isl::space &space2) const
+boolean space::has_equal_params(const space &space2) const
 {
   auto res = isl_space_has_equal_params(get(), space2.get());
   return manage(res);
 }
 
-isl::boolean space::has_equal_tuples(const isl::space &space2) const
+boolean space::has_equal_tuples(const space &space2) const
 {
   auto res = isl_space_has_equal_tuples(get(), space2.get());
   return manage(res);
 }
 
-isl::boolean space::has_tuple_id(isl::dim type) const
+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);
 }
 
-isl::boolean space::has_tuple_name(isl::dim type) const
+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);
 }
 
-isl::space space::insert_dims(isl::dim type, unsigned int pos, unsigned int n) const
+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);
 }
 
-isl::boolean space::is_domain(const isl::space &space2) const
+boolean space::is_domain(const space &space2) const
 {
   auto res = isl_space_is_domain(get(), space2.get());
   return manage(res);
 }
 
-isl::boolean space::is_equal(const isl::space &space2) const
+boolean space::is_equal(const space &space2) const
 {
   auto res = isl_space_is_equal(get(), space2.get());
   return manage(res);
 }
 
-isl::boolean space::is_map() const
+boolean space::is_map() const
 {
   auto res = isl_space_is_map(get());
   return manage(res);
 }
 
-isl::boolean space::is_params() const
+boolean space::is_params() const
 {
   auto res = isl_space_is_params(get());
   return manage(res);
 }
 
-isl::boolean space::is_product() const
+boolean space::is_product() const
 {
   auto res = isl_space_is_product(get());
   return manage(res);
 }
 
-isl::boolean space::is_range(const isl::space &space2) const
+boolean space::is_range(const space &space2) const
 {
   auto res = isl_space_is_range(get(), space2.get());
   return manage(res);
 }
 
-isl::boolean space::is_set() const
+boolean space::is_set() const
 {
   auto res = isl_space_is_set(get());
   return manage(res);
 }
 
-isl::boolean space::is_wrapping() const
+boolean space::is_wrapping() const
 {
   auto res = isl_space_is_wrapping(get());
   return manage(res);
 }
 
-isl::space space::join(isl::space right) const
+space space::join(space right) const
 {
   auto res = isl_space_join(copy(), right.release());
   return manage(res);
 }
 
-isl::space space::map_from_domain_and_range(isl::space range) const
+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);
 }
 
-isl::space space::map_from_set() const
+space space::map_from_set() const
 {
   auto res = isl_space_map_from_set(copy());
   return manage(res);
 }
 
-isl::space space::move_dims(isl::dim dst_type, unsigned int dst_pos, isl::dim src_type, unsigned int src_pos, unsigned int n) const
+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);
 }
 
-isl::space space::params() const
+space space::params() const
 {
   auto res = isl_space_params(copy());
   return manage(res);
 }
 
-isl::space space::params_alloc(isl::ctx ctx, unsigned int nparam)
+space space::params_alloc(ctx ctx, unsigned int nparam)
 {
   auto res = isl_space_params_alloc(ctx.release(), nparam);
   return manage(res);
 }
 
-isl::space space::product(isl::space right) const
+space space::product(space right) const
 {
   auto res = isl_space_product(copy(), right.release());
   return manage(res);
 }
 
-isl::space space::range() const
+space space::range() const
 {
   auto res = isl_space_range(copy());
   return manage(res);
 }
 
-isl::space space::range_curry() const
+space space::range_curry() const
 {
   auto res = isl_space_range_curry(copy());
   return manage(res);
 }
 
-isl::space space::range_factor_domain() const
+space space::range_factor_domain() const
 {
   auto res = isl_space_range_factor_domain(copy());
   return manage(res);
 }
 
-isl::space space::range_factor_range() const
+space space::range_factor_range() const
 {
   auto res = isl_space_range_factor_range(copy());
   return manage(res);
 }
 
-isl::boolean space::range_is_wrapping() const
+boolean space::range_is_wrapping() const
 {
   auto res = isl_space_range_is_wrapping(get());
   return manage(res);
 }
 
-isl::space space::range_map() const
+space space::range_map() const
 {
   auto res = isl_space_range_map(copy());
   return manage(res);
 }
 
-isl::space space::range_product(isl::space right) const
+space space::range_product(space right) const
 {
   auto res = isl_space_range_product(copy(), right.release());
   return manage(res);
 }
 
-isl::space space::reset_tuple_id(isl::dim type) const
+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);
 }
 
-isl::space space::reset_user() const
+space space::reset_user() const
 {
   auto res = isl_space_reset_user(copy());
   return manage(res);
 }
 
-isl::space space::reverse() const
+space space::reverse() const
 {
   auto res = isl_space_reverse(copy());
   return manage(res);
 }
 
-isl::space space::set_dim_id(isl::dim type, unsigned int pos, isl::id id) const
+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);
 }
 
-isl::space space::set_from_params() const
+space space::set_from_params() const
 {
   auto res = isl_space_set_from_params(copy());
   return manage(res);
 }
 
-isl::space space::set_tuple_id(isl::dim type, isl::id id) const
+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);
 }
 
-isl::space space::set_tuple_name(isl::dim type, const std::string &s) const
+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);
 }
 
-isl::boolean space::tuple_is_equal(isl::dim type1, const isl::space &space2, isl::dim type2) const
+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);
 }
 
-isl::space space::uncurry() const
+space space::uncurry() const
 {
   auto res = isl_space_uncurry(copy());
   return manage(res);
 }
 
-isl::space space::unwrap() const
+space space::unwrap() const
 {
   auto res = isl_space_unwrap(copy());
   return manage(res);
 }
 
-isl::space space::wrap() const
+space space::wrap() const
 {
   auto res = isl_space_wrap(copy());
   return manage(res);
 }
 
-isl::space space::zip() const
+space space::zip() const
 {
   auto res = isl_space_zip(copy());
   return manage(res);
 }
 
 // implementations for isl::term
-isl::term manage(__isl_take isl_term *ptr) {
+term manage(__isl_take isl_term *ptr) {
   return term(ptr);
 }
-isl::term manage_copy(__isl_keep isl_term *ptr) {
+term manage_copy(__isl_keep isl_term *ptr) {
   ptr = isl_term_copy(ptr);
   return term(ptr);
 }
@@ -16027,7 +16027,7 @@
 term::term()
     : ptr(nullptr) {}
 
-term::term(const isl::term &obj)
+term::term(const term &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -16040,7 +16040,7 @@
     : ptr(ptr) {}
 
 
-term &term::operator=(isl::term obj) {
+term &term::operator=(term obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -16072,8 +16072,8 @@
 }
 
 
-isl::ctx term::get_ctx() const {
-  return isl::ctx(isl_term_get_ctx(ptr));
+ctx term::get_ctx() const {
+  return ctx(isl_term_get_ctx(ptr));
 }
 
 
@@ -16083,13 +16083,13 @@
   return res;
 }
 
-isl::val term::get_coefficient_val() const
+val term::get_coefficient_val() const
 {
   auto res = isl_term_get_coefficient_val(get());
   return manage(res);
 }
 
-isl::aff term::get_div(unsigned int pos) const
+aff term::get_div(unsigned int pos) const
 {
   auto res = isl_term_get_div(get(), pos);
   return manage(res);
@@ -16102,10 +16102,10 @@
 }
 
 // implementations for isl::union_access_info
-isl::union_access_info manage(__isl_take isl_union_access_info *ptr) {
+union_access_info manage(__isl_take isl_union_access_info *ptr) {
   return union_access_info(ptr);
 }
-isl::union_access_info manage_copy(__isl_keep isl_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);
 }
@@ -16113,7 +16113,7 @@
 union_access_info::union_access_info()
     : ptr(nullptr) {}
 
-union_access_info::union_access_info(const isl::union_access_info &obj)
+union_access_info::union_access_info(const union_access_info &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -16125,13 +16125,13 @@
 union_access_info::union_access_info(__isl_take isl_union_access_info *ptr)
     : ptr(ptr) {}
 
-union_access_info::union_access_info(isl::union_map sink)
+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=(isl::union_access_info obj) {
+union_access_info &union_access_info::operator=(union_access_info obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -16163,8 +16163,8 @@
 }
 
 
-isl::ctx union_access_info::get_ctx() const {
-  return isl::ctx(isl_union_access_info_get_ctx(ptr));
+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());
@@ -16177,47 +16177,47 @@
 
 
 
-isl::union_flow union_access_info::compute_flow() const
+union_flow union_access_info::compute_flow() const
 {
   auto res = isl_union_access_info_compute_flow(copy());
   return manage(res);
 }
 
-isl::union_access_info union_access_info::set_kill(isl::union_map kill) const
+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);
 }
 
-isl::union_access_info union_access_info::set_may_source(isl::union_map may_source) const
+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);
 }
 
-isl::union_access_info union_access_info::set_must_source(isl::union_map must_source) const
+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);
 }
 
-isl::union_access_info union_access_info::set_schedule(isl::schedule schedule) const
+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);
 }
 
-isl::union_access_info union_access_info::set_schedule_map(isl::union_map schedule_map) const
+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
-isl::union_flow manage(__isl_take isl_union_flow *ptr) {
+union_flow manage(__isl_take isl_union_flow *ptr) {
   return union_flow(ptr);
 }
-isl::union_flow manage_copy(__isl_keep isl_union_flow *ptr) {
+union_flow manage_copy(__isl_keep isl_union_flow *ptr) {
   ptr = isl_union_flow_copy(ptr);
   return union_flow(ptr);
 }
@@ -16225,7 +16225,7 @@
 union_flow::union_flow()
     : ptr(nullptr) {}
 
-union_flow::union_flow(const isl::union_flow &obj)
+union_flow::union_flow(const union_flow &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -16238,7 +16238,7 @@
     : ptr(ptr) {}
 
 
-union_flow &union_flow::operator=(isl::union_flow obj) {
+union_flow &union_flow::operator=(union_flow obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -16270,8 +16270,8 @@
 }
 
 
-isl::ctx union_flow::get_ctx() const {
-  return isl::ctx(isl_union_flow_get_ctx(ptr));
+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());
@@ -16284,47 +16284,47 @@
 
 
 
-isl::union_map union_flow::get_full_may_dependence() const
+union_map union_flow::get_full_may_dependence() const
 {
   auto res = isl_union_flow_get_full_may_dependence(get());
   return manage(res);
 }
 
-isl::union_map union_flow::get_full_must_dependence() const
+union_map union_flow::get_full_must_dependence() const
 {
   auto res = isl_union_flow_get_full_must_dependence(get());
   return manage(res);
 }
 
-isl::union_map union_flow::get_may_dependence() const
+union_map union_flow::get_may_dependence() const
 {
   auto res = isl_union_flow_get_may_dependence(get());
   return manage(res);
 }
 
-isl::union_map union_flow::get_may_no_source() const
+union_map union_flow::get_may_no_source() const
 {
   auto res = isl_union_flow_get_may_no_source(get());
   return manage(res);
 }
 
-isl::union_map union_flow::get_must_dependence() const
+union_map union_flow::get_must_dependence() const
 {
   auto res = isl_union_flow_get_must_dependence(get());
   return manage(res);
 }
 
-isl::union_map union_flow::get_must_no_source() const
+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
-isl::union_map manage(__isl_take isl_union_map *ptr) {
+union_map manage(__isl_take isl_union_map *ptr) {
   return union_map(ptr);
 }
-isl::union_map manage_copy(__isl_keep isl_union_map *ptr) {
+union_map manage_copy(__isl_keep isl_union_map *ptr) {
   ptr = isl_union_map_copy(ptr);
   return union_map(ptr);
 }
@@ -16332,7 +16332,7 @@
 union_map::union_map()
     : ptr(nullptr) {}
 
-union_map::union_map(const isl::union_map &obj)
+union_map::union_map(const union_map &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -16344,28 +16344,28 @@
 union_map::union_map(__isl_take isl_union_map *ptr)
     : ptr(ptr) {}
 
-union_map::union_map(isl::union_pw_multi_aff upma)
+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(isl::basic_map bmap)
+union_map::union_map(basic_map bmap)
 {
   auto res = isl_union_map_from_basic_map(bmap.release());
   ptr = res;
 }
-union_map::union_map(isl::map map)
+union_map::union_map(map map)
 {
   auto res = isl_union_map_from_map(map.release());
   ptr = res;
 }
-union_map::union_map(isl::ctx ctx, const std::string &str)
+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=(isl::union_map obj) {
+union_map &union_map::operator=(union_map obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -16397,8 +16397,8 @@
 }
 
 
-isl::ctx union_map::get_ctx() const {
-  return isl::ctx(isl_union_map_get_ctx(ptr));
+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());
@@ -16415,67 +16415,67 @@
 }
 
 
-isl::union_map union_map::add_map(isl::map map) const
+union_map union_map::add_map(map map) const
 {
   auto res = isl_union_map_add_map(copy(), map.release());
   return manage(res);
 }
 
-isl::union_map union_map::affine_hull() const
+union_map union_map::affine_hull() const
 {
   auto res = isl_union_map_affine_hull(copy());
   return manage(res);
 }
 
-isl::union_map union_map::align_params(isl::space model) const
+union_map union_map::align_params(space model) const
 {
   auto res = isl_union_map_align_params(copy(), model.release());
   return manage(res);
 }
 
-isl::union_map union_map::apply_domain(isl::union_map umap2) const
+union_map union_map::apply_domain(union_map umap2) const
 {
   auto res = isl_union_map_apply_domain(copy(), umap2.release());
   return manage(res);
 }
 
-isl::union_map union_map::apply_range(isl::union_map umap2) const
+union_map union_map::apply_range(union_map umap2) const
 {
   auto res = isl_union_map_apply_range(copy(), umap2.release());
   return manage(res);
 }
 
-isl::union_map union_map::coalesce() const
+union_map union_map::coalesce() const
 {
   auto res = isl_union_map_coalesce(copy());
   return manage(res);
 }
 
-isl::boolean union_map::contains(const isl::space &space) const
+boolean union_map::contains(const space &space) const
 {
   auto res = isl_union_map_contains(get(), space.get());
   return manage(res);
 }
 
-isl::union_map union_map::curry() const
+union_map union_map::curry() const
 {
   auto res = isl_union_map_curry(copy());
   return manage(res);
 }
 
-isl::union_set union_map::deltas() const
+union_set union_map::deltas() const
 {
   auto res = isl_union_map_deltas(copy());
   return manage(res);
 }
 
-isl::union_map union_map::deltas_map() const
+union_map union_map::deltas_map() const
 {
   auto res = isl_union_map_deltas_map(copy());
   return manage(res);
 }
 
-isl::union_map union_map::detect_equalities() const
+union_map union_map::detect_equalities() const
 {
   auto res = isl_union_map_detect_equalities(copy());
   return manage(res);
@@ -16487,67 +16487,67 @@
   return res;
 }
 
-isl::union_set union_map::domain() const
+union_set union_map::domain() const
 {
   auto res = isl_union_map_domain(copy());
   return manage(res);
 }
 
-isl::union_map union_map::domain_factor_domain() const
+union_map union_map::domain_factor_domain() const
 {
   auto res = isl_union_map_domain_factor_domain(copy());
   return manage(res);
 }
 
-isl::union_map union_map::domain_factor_range() const
+union_map union_map::domain_factor_range() const
 {
   auto res = isl_union_map_domain_factor_range(copy());
   return manage(res);
 }
 
-isl::union_map union_map::domain_map() const
+union_map union_map::domain_map() const
 {
   auto res = isl_union_map_domain_map(copy());
   return manage(res);
 }
 
-isl::union_pw_multi_aff union_map::domain_map_union_pw_multi_aff() const
+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);
 }
 
-isl::union_map union_map::domain_product(isl::union_map umap2) const
+union_map union_map::domain_product(union_map umap2) const
 {
   auto res = isl_union_map_domain_product(copy(), umap2.release());
   return manage(res);
 }
 
-isl::union_map union_map::empty(isl::space space)
+union_map union_map::empty(space space)
 {
   auto res = isl_union_map_empty(space.release());
   return manage(res);
 }
 
-isl::union_map union_map::eq_at(isl::multi_union_pw_aff mupa) const
+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);
 }
 
-isl::map union_map::extract_map(isl::space dim) const
+map union_map::extract_map(space dim) const
 {
   auto res = isl_union_map_extract_map(get(), dim.release());
   return manage(res);
 }
 
-isl::union_map union_map::factor_domain() const
+union_map union_map::factor_domain() const
 {
   auto res = isl_union_map_factor_domain(copy());
   return manage(res);
 }
 
-isl::union_map union_map::factor_range() const
+union_map union_map::factor_range() const
 {
   auto res = isl_union_map_factor_range(copy());
   return manage(res);
@@ -16559,69 +16559,69 @@
   return res;
 }
 
-isl::union_map union_map::fixed_power(isl::val exp) const
+union_map union_map::fixed_power(val exp) const
 {
   auto res = isl_union_map_fixed_power_val(copy(), exp.release());
   return manage(res);
 }
 
-isl::union_map union_map::flat_domain_product(isl::union_map umap2) const
+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);
 }
 
-isl::union_map union_map::flat_range_product(isl::union_map umap2) const
+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);
 }
 
-isl::stat union_map::foreach_map(const std::function<isl::stat(isl::map)> &fn) const
+stat union_map::foreach_map(const std::function<stat(map)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::map)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::union_map union_map::from(isl::multi_union_pw_aff mupa)
+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);
 }
 
-isl::union_map union_map::from_domain(isl::union_set uset)
+union_map union_map::from_domain(union_set uset)
 {
   auto res = isl_union_map_from_domain(uset.release());
   return manage(res);
 }
 
-isl::union_map union_map::from_domain_and_range(isl::union_set domain, isl::union_set range)
+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);
 }
 
-isl::union_map union_map::from_range(isl::union_set uset)
+union_map union_map::from_range(union_set uset)
 {
   auto res = isl_union_map_from_range(uset.release());
   return manage(res);
 }
 
-isl::union_map union_map::from_union_pw_aff(isl::union_pw_aff upa)
+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);
 }
 
-isl::id union_map::get_dim_id(isl::dim type, unsigned int pos) const
+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);
@@ -16633,175 +16633,175 @@
   return res;
 }
 
-isl::map_list union_map::get_map_list() const
+map_list union_map::get_map_list() const
 {
   auto res = isl_union_map_get_map_list(get());
   return manage(res);
 }
 
-isl::space union_map::get_space() const
+space union_map::get_space() const
 {
   auto res = isl_union_map_get_space(get());
   return manage(res);
 }
 
-isl::union_map union_map::gist(isl::union_map context) const
+union_map union_map::gist(union_map context) const
 {
   auto res = isl_union_map_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::union_map union_map::gist_domain(isl::union_set uset) const
+union_map union_map::gist_domain(union_set uset) const
 {
   auto res = isl_union_map_gist_domain(copy(), uset.release());
   return manage(res);
 }
 
-isl::union_map union_map::gist_params(isl::set set) const
+union_map union_map::gist_params(set set) const
 {
   auto res = isl_union_map_gist_params(copy(), set.release());
   return manage(res);
 }
 
-isl::union_map union_map::gist_range(isl::union_set uset) const
+union_map union_map::gist_range(union_set uset) const
 {
   auto res = isl_union_map_gist_range(copy(), uset.release());
   return manage(res);
 }
 
-isl::union_map union_map::intersect(isl::union_map umap2) const
+union_map union_map::intersect(union_map umap2) const
 {
   auto res = isl_union_map_intersect(copy(), umap2.release());
   return manage(res);
 }
 
-isl::union_map union_map::intersect_domain(isl::union_set uset) const
+union_map union_map::intersect_domain(union_set uset) const
 {
   auto res = isl_union_map_intersect_domain(copy(), uset.release());
   return manage(res);
 }
 
-isl::union_map union_map::intersect_params(isl::set set) const
+union_map union_map::intersect_params(set set) const
 {
   auto res = isl_union_map_intersect_params(copy(), set.release());
   return manage(res);
 }
 
-isl::union_map union_map::intersect_range(isl::union_set uset) const
+union_map union_map::intersect_range(union_set uset) const
 {
   auto res = isl_union_map_intersect_range(copy(), uset.release());
   return manage(res);
 }
 
-isl::union_map union_map::intersect_range_factor_range(isl::union_map factor) const
+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);
 }
 
-isl::boolean union_map::involves_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::boolean union_map::is_bijective() const
+boolean union_map::is_bijective() const
 {
   auto res = isl_union_map_is_bijective(get());
   return manage(res);
 }
 
-isl::boolean union_map::is_disjoint(const isl::union_map &umap2) const
+boolean union_map::is_disjoint(const union_map &umap2) const
 {
   auto res = isl_union_map_is_disjoint(get(), umap2.get());
   return manage(res);
 }
 
-isl::boolean union_map::is_empty() const
+boolean union_map::is_empty() const
 {
   auto res = isl_union_map_is_empty(get());
   return manage(res);
 }
 
-isl::boolean union_map::is_equal(const isl::union_map &umap2) const
+boolean union_map::is_equal(const union_map &umap2) const
 {
   auto res = isl_union_map_is_equal(get(), umap2.get());
   return manage(res);
 }
 
-isl::boolean union_map::is_identity() const
+boolean union_map::is_identity() const
 {
   auto res = isl_union_map_is_identity(get());
   return manage(res);
 }
 
-isl::boolean union_map::is_injective() const
+boolean union_map::is_injective() const
 {
   auto res = isl_union_map_is_injective(get());
   return manage(res);
 }
 
-isl::boolean union_map::is_single_valued() const
+boolean union_map::is_single_valued() const
 {
   auto res = isl_union_map_is_single_valued(get());
   return manage(res);
 }
 
-isl::boolean union_map::is_strict_subset(const isl::union_map &umap2) const
+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);
 }
 
-isl::boolean union_map::is_subset(const isl::union_map &umap2) const
+boolean union_map::is_subset(const union_map &umap2) const
 {
   auto res = isl_union_map_is_subset(get(), umap2.get());
   return manage(res);
 }
 
-isl::union_map union_map::lex_ge_union_map(isl::union_map umap2) const
+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);
 }
 
-isl::union_map union_map::lex_gt_at_multi_union_pw_aff(isl::multi_union_pw_aff mupa) const
+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);
 }
 
-isl::union_map union_map::lex_gt_union_map(isl::union_map umap2) const
+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);
 }
 
-isl::union_map union_map::lex_le_union_map(isl::union_map umap2) const
+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);
 }
 
-isl::union_map union_map::lex_lt_at_multi_union_pw_aff(isl::multi_union_pw_aff mupa) const
+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);
 }
 
-isl::union_map union_map::lex_lt_union_map(isl::union_map umap2) const
+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);
 }
 
-isl::union_map union_map::lexmax() const
+union_map union_map::lexmax() const
 {
   auto res = isl_union_map_lexmax(copy());
   return manage(res);
 }
 
-isl::union_map union_map::lexmin() const
+union_map union_map::lexmin() const
 {
   auto res = isl_union_map_lexmin(copy());
   return manage(res);
@@ -16813,215 +16813,215 @@
   return res;
 }
 
-isl::set union_map::params() const
+set union_map::params() const
 {
   auto res = isl_union_map_params(copy());
   return manage(res);
 }
 
-isl::boolean union_map::plain_is_empty() const
+boolean union_map::plain_is_empty() const
 {
   auto res = isl_union_map_plain_is_empty(get());
   return manage(res);
 }
 
-isl::boolean union_map::plain_is_injective() const
+boolean union_map::plain_is_injective() const
 {
   auto res = isl_union_map_plain_is_injective(get());
   return manage(res);
 }
 
-isl::union_map union_map::polyhedral_hull() const
+union_map union_map::polyhedral_hull() const
 {
   auto res = isl_union_map_polyhedral_hull(copy());
   return manage(res);
 }
 
-isl::union_map union_map::preimage_domain_multi_aff(isl::multi_aff ma) const
+union_map union_map::preimage_domain_multi_aff(multi_aff ma) const
 {
   auto res = isl_union_map_preimage_domain_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-isl::union_map union_map::preimage_domain_multi_pw_aff(isl::multi_pw_aff mpa) const
+union_map union_map::preimage_domain_multi_pw_aff(multi_pw_aff mpa) const
 {
   auto res = isl_union_map_preimage_domain_multi_pw_aff(copy(), mpa.release());
   return manage(res);
 }
 
-isl::union_map union_map::preimage_domain_pw_multi_aff(isl::pw_multi_aff pma) const
+union_map union_map::preimage_domain_pw_multi_aff(pw_multi_aff pma) const
 {
   auto res = isl_union_map_preimage_domain_pw_multi_aff(copy(), pma.release());
   return manage(res);
 }
 
-isl::union_map union_map::preimage_domain_union_pw_multi_aff(isl::union_pw_multi_aff upma) const
+union_map union_map::preimage_domain_union_pw_multi_aff(union_pw_multi_aff upma) const
 {
   auto res = isl_union_map_preimage_domain_union_pw_multi_aff(copy(), upma.release());
   return manage(res);
 }
 
-isl::union_map union_map::preimage_range_multi_aff(isl::multi_aff ma) const
+union_map union_map::preimage_range_multi_aff(multi_aff ma) const
 {
   auto res = isl_union_map_preimage_range_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-isl::union_map union_map::preimage_range_pw_multi_aff(isl::pw_multi_aff pma) const
+union_map union_map::preimage_range_pw_multi_aff(pw_multi_aff pma) const
 {
   auto res = isl_union_map_preimage_range_pw_multi_aff(copy(), pma.release());
   return manage(res);
 }
 
-isl::union_map union_map::preimage_range_union_pw_multi_aff(isl::union_pw_multi_aff upma) const
+union_map union_map::preimage_range_union_pw_multi_aff(union_pw_multi_aff upma) const
 {
   auto res = isl_union_map_preimage_range_union_pw_multi_aff(copy(), upma.release());
   return manage(res);
 }
 
-isl::union_map union_map::product(isl::union_map umap2) const
+union_map union_map::product(union_map umap2) const
 {
   auto res = isl_union_map_product(copy(), umap2.release());
   return manage(res);
 }
 
-isl::union_map union_map::project_out(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::union_map union_map::project_out_all_params() const
+union_map union_map::project_out_all_params() const
 {
   auto res = isl_union_map_project_out_all_params(copy());
   return manage(res);
 }
 
-isl::union_set union_map::range() const
+union_set union_map::range() const
 {
   auto res = isl_union_map_range(copy());
   return manage(res);
 }
 
-isl::union_map union_map::range_curry() const
+union_map union_map::range_curry() const
 {
   auto res = isl_union_map_range_curry(copy());
   return manage(res);
 }
 
-isl::union_map union_map::range_factor_domain() const
+union_map union_map::range_factor_domain() const
 {
   auto res = isl_union_map_range_factor_domain(copy());
   return manage(res);
 }
 
-isl::union_map union_map::range_factor_range() const
+union_map union_map::range_factor_range() const
 {
   auto res = isl_union_map_range_factor_range(copy());
   return manage(res);
 }
 
-isl::union_map union_map::range_map() const
+union_map union_map::range_map() const
 {
   auto res = isl_union_map_range_map(copy());
   return manage(res);
 }
 
-isl::union_map union_map::range_product(isl::union_map umap2) const
+union_map union_map::range_product(union_map umap2) const
 {
   auto res = isl_union_map_range_product(copy(), umap2.release());
   return manage(res);
 }
 
-isl::union_map union_map::remove_divs() const
+union_map union_map::remove_divs() const
 {
   auto res = isl_union_map_remove_divs(copy());
   return manage(res);
 }
 
-isl::union_map union_map::remove_redundancies() const
+union_map union_map::remove_redundancies() const
 {
   auto res = isl_union_map_remove_redundancies(copy());
   return manage(res);
 }
 
-isl::union_map union_map::reset_user() const
+union_map union_map::reset_user() const
 {
   auto res = isl_union_map_reset_user(copy());
   return manage(res);
 }
 
-isl::union_map union_map::reverse() const
+union_map union_map::reverse() const
 {
   auto res = isl_union_map_reverse(copy());
   return manage(res);
 }
 
-isl::basic_map union_map::sample() const
+basic_map union_map::sample() const
 {
   auto res = isl_union_map_sample(copy());
   return manage(res);
 }
 
-isl::union_map union_map::simple_hull() const
+union_map union_map::simple_hull() const
 {
   auto res = isl_union_map_simple_hull(copy());
   return manage(res);
 }
 
-isl::union_map union_map::subtract(isl::union_map umap2) const
+union_map union_map::subtract(union_map umap2) const
 {
   auto res = isl_union_map_subtract(copy(), umap2.release());
   return manage(res);
 }
 
-isl::union_map union_map::subtract_domain(isl::union_set dom) const
+union_map union_map::subtract_domain(union_set dom) const
 {
   auto res = isl_union_map_subtract_domain(copy(), dom.release());
   return manage(res);
 }
 
-isl::union_map union_map::subtract_range(isl::union_set dom) const
+union_map union_map::subtract_range(union_set dom) const
 {
   auto res = isl_union_map_subtract_range(copy(), dom.release());
   return manage(res);
 }
 
-isl::union_map union_map::uncurry() const
+union_map union_map::uncurry() const
 {
   auto res = isl_union_map_uncurry(copy());
   return manage(res);
 }
 
-isl::union_map union_map::unite(isl::union_map umap2) const
+union_map union_map::unite(union_map umap2) const
 {
   auto res = isl_union_map_union(copy(), umap2.release());
   return manage(res);
 }
 
-isl::union_map union_map::universe() const
+union_map union_map::universe() const
 {
   auto res = isl_union_map_universe(copy());
   return manage(res);
 }
 
-isl::union_set union_map::wrap() const
+union_set union_map::wrap() const
 {
   auto res = isl_union_map_wrap(copy());
   return manage(res);
 }
 
-isl::union_map union_map::zip() const
+union_map union_map::zip() const
 {
   auto res = isl_union_map_zip(copy());
   return manage(res);
 }
 
 // implementations for isl::union_map_list
-isl::union_map_list manage(__isl_take isl_union_map_list *ptr) {
+union_map_list manage(__isl_take isl_union_map_list *ptr) {
   return union_map_list(ptr);
 }
-isl::union_map_list manage_copy(__isl_keep isl_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);
 }
@@ -17029,7 +17029,7 @@
 union_map_list::union_map_list()
     : ptr(nullptr) {}
 
-union_map_list::union_map_list(const isl::union_map_list &obj)
+union_map_list::union_map_list(const union_map_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -17042,7 +17042,7 @@
     : ptr(ptr) {}
 
 
-union_map_list &union_map_list::operator=(isl::union_map_list obj) {
+union_map_list &union_map_list::operator=(union_map_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -17074,8 +17074,8 @@
 }
 
 
-isl::ctx union_map_list::get_ctx() const {
-  return isl::ctx(isl_union_map_list_get_ctx(ptr));
+ctx union_map_list::get_ctx() const {
+  return ctx(isl_union_map_list_get_ctx(ptr));
 }
 
 void union_map_list::dump() const {
@@ -17083,63 +17083,63 @@
 }
 
 
-isl::union_map_list union_map_list::add(isl::union_map el) const
+union_map_list union_map_list::add(union_map el) const
 {
   auto res = isl_union_map_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::union_map_list union_map_list::alloc(isl::ctx ctx, int n)
+union_map_list union_map_list::alloc(ctx ctx, int n)
 {
   auto res = isl_union_map_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::union_map_list union_map_list::concat(isl::union_map_list list2) const
+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);
 }
 
-isl::union_map_list union_map_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::stat union_map_list::foreach(const std::function<isl::stat(isl::union_map)> &fn) const
+stat union_map_list::foreach(const std::function<stat(union_map)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::union_map)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::union_map_list union_map_list::from_union_map(isl::union_map el)
+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);
 }
 
-isl::union_map union_map_list::get_at(int index) const
+union_map union_map_list::get_at(int index) const
 {
   auto res = isl_union_map_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::union_map union_map_list::get_union_map(int index) const
+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);
 }
 
-isl::union_map_list union_map_list::insert(unsigned int pos, isl::union_map el) const
+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);
@@ -17151,13 +17151,13 @@
   return res;
 }
 
-isl::union_map_list union_map_list::reverse() const
+union_map_list union_map_list::reverse() const
 {
   auto res = isl_union_map_list_reverse(copy());
   return manage(res);
 }
 
-isl::union_map_list union_map_list::set_union_map(int index, isl::union_map el) const
+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);
@@ -17169,17 +17169,17 @@
   return res;
 }
 
-isl::union_map_list union_map_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::union_pw_aff manage(__isl_take isl_union_pw_aff *ptr) {
+union_pw_aff manage(__isl_take isl_union_pw_aff *ptr) {
   return union_pw_aff(ptr);
 }
-isl::union_pw_aff manage_copy(__isl_keep isl_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);
 }
@@ -17187,7 +17187,7 @@
 union_pw_aff::union_pw_aff()
     : ptr(nullptr) {}
 
-union_pw_aff::union_pw_aff(const isl::union_pw_aff &obj)
+union_pw_aff::union_pw_aff(const union_pw_aff &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -17199,23 +17199,23 @@
 union_pw_aff::union_pw_aff(__isl_take isl_union_pw_aff *ptr)
     : ptr(ptr) {}
 
-union_pw_aff::union_pw_aff(isl::pw_aff pa)
+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(isl::union_set domain, isl::val v)
+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(isl::ctx ctx, const std::string &str)
+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::operator=(isl::union_pw_aff obj) {
+union_pw_aff &union_pw_aff::operator=(union_pw_aff obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -17247,8 +17247,8 @@
 }
 
 
-isl::ctx union_pw_aff::get_ctx() const {
-  return isl::ctx(isl_union_pw_aff_get_ctx(ptr));
+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());
@@ -17265,31 +17265,31 @@
 }
 
 
-isl::union_pw_aff union_pw_aff::add(isl::union_pw_aff upa2) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff::add_pw_aff(isl::pw_aff pa) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff::aff_on_domain(isl::union_set domain, isl::aff aff)
+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);
 }
 
-isl::union_pw_aff union_pw_aff::align_params(isl::space model) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff::coalesce() const
+union_pw_aff union_pw_aff::coalesce() const
 {
   auto res = isl_union_pw_aff_coalesce(copy());
   return manage(res);
@@ -17301,25 +17301,25 @@
   return res;
 }
 
-isl::union_set union_pw_aff::domain() const
+union_set union_pw_aff::domain() const
 {
   auto res = isl_union_pw_aff_domain(copy());
   return manage(res);
 }
 
-isl::union_pw_aff union_pw_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff::empty(isl::space space)
+union_pw_aff union_pw_aff::empty(space space)
 {
   auto res = isl_union_pw_aff_empty(space.release());
   return manage(res);
 }
 
-isl::pw_aff union_pw_aff::extract_pw_aff(isl::space space) const
+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);
@@ -17331,81 +17331,81 @@
   return res;
 }
 
-isl::union_pw_aff union_pw_aff::floor() const
+union_pw_aff union_pw_aff::floor() const
 {
   auto res = isl_union_pw_aff_floor(copy());
   return manage(res);
 }
 
-isl::stat union_pw_aff::foreach_pw_aff(const std::function<isl::stat(isl::pw_aff)> &fn) const
+stat union_pw_aff::foreach_pw_aff(const std::function<stat(pw_aff)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::pw_aff)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::pw_aff_list union_pw_aff::get_pw_aff_list() const
+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);
 }
 
-isl::space union_pw_aff::get_space() const
+space union_pw_aff::get_space() const
 {
   auto res = isl_union_pw_aff_get_space(get());
   return manage(res);
 }
 
-isl::union_pw_aff union_pw_aff::gist(isl::union_set context) const
+union_pw_aff union_pw_aff::gist(union_set context) const
 {
   auto res = isl_union_pw_aff_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::union_pw_aff union_pw_aff::gist_params(isl::set context) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff::intersect_domain(isl::union_set uset) const
+union_pw_aff union_pw_aff::intersect_domain(union_set uset) const
 {
   auto res = isl_union_pw_aff_intersect_domain(copy(), uset.release());
   return manage(res);
 }
 
-isl::union_pw_aff union_pw_aff::intersect_params(isl::set set) const
+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);
 }
 
-isl::boolean union_pw_aff::involves_nan() const
+boolean union_pw_aff::involves_nan() const
 {
   auto res = isl_union_pw_aff_involves_nan(get());
   return manage(res);
 }
 
-isl::val union_pw_aff::max_val() const
+val union_pw_aff::max_val() const
 {
   auto res = isl_union_pw_aff_max_val(copy());
   return manage(res);
 }
 
-isl::val union_pw_aff::min_val() const
+val union_pw_aff::min_val() const
 {
   auto res = isl_union_pw_aff_min_val(copy());
   return manage(res);
 }
 
-isl::union_pw_aff union_pw_aff::mod_val(isl::val f) const
+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);
@@ -17417,83 +17417,83 @@
   return res;
 }
 
-isl::union_pw_aff union_pw_aff::neg() const
+union_pw_aff union_pw_aff::neg() const
 {
   auto res = isl_union_pw_aff_neg(copy());
   return manage(res);
 }
 
-isl::union_pw_aff union_pw_aff::param_on_domain_id(isl::union_set domain, isl::id id)
+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);
 }
 
-isl::boolean union_pw_aff::plain_is_equal(const isl::union_pw_aff &upa2) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff::pullback(isl::union_pw_multi_aff upma) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff::pw_aff_on_domain(isl::union_set domain, isl::pw_aff pa)
+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);
 }
 
-isl::union_pw_aff union_pw_aff::reset_user() const
+union_pw_aff union_pw_aff::reset_user() const
 {
   auto res = isl_union_pw_aff_reset_user(copy());
   return manage(res);
 }
 
-isl::union_pw_aff union_pw_aff::scale_down_val(isl::val v) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff::scale_val(isl::val v) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff::sub(isl::union_pw_aff upa2) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff::subtract_domain(isl::union_set uset) const
+union_pw_aff union_pw_aff::subtract_domain(union_set uset) const
 {
   auto res = isl_union_pw_aff_subtract_domain(copy(), uset.release());
   return manage(res);
 }
 
-isl::union_pw_aff union_pw_aff::union_add(isl::union_pw_aff upa2) const
+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);
 }
 
-isl::union_set union_pw_aff::zero_union_set() const
+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
-isl::union_pw_aff_list manage(__isl_take isl_union_pw_aff_list *ptr) {
+union_pw_aff_list manage(__isl_take isl_union_pw_aff_list *ptr) {
   return union_pw_aff_list(ptr);
 }
-isl::union_pw_aff_list manage_copy(__isl_keep isl_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);
 }
@@ -17501,7 +17501,7 @@
 union_pw_aff_list::union_pw_aff_list()
     : ptr(nullptr) {}
 
-union_pw_aff_list::union_pw_aff_list(const isl::union_pw_aff_list &obj)
+union_pw_aff_list::union_pw_aff_list(const union_pw_aff_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -17514,7 +17514,7 @@
     : ptr(ptr) {}
 
 
-union_pw_aff_list &union_pw_aff_list::operator=(isl::union_pw_aff_list obj) {
+union_pw_aff_list &union_pw_aff_list::operator=(union_pw_aff_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -17546,8 +17546,8 @@
 }
 
 
-isl::ctx union_pw_aff_list::get_ctx() const {
-  return isl::ctx(isl_union_pw_aff_list_get_ctx(ptr));
+ctx union_pw_aff_list::get_ctx() const {
+  return ctx(isl_union_pw_aff_list_get_ctx(ptr));
 }
 
 void union_pw_aff_list::dump() const {
@@ -17555,63 +17555,63 @@
 }
 
 
-isl::union_pw_aff_list union_pw_aff_list::add(isl::union_pw_aff el) const
+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);
 }
 
-isl::union_pw_aff_list union_pw_aff_list::alloc(isl::ctx ctx, int n)
+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);
 }
 
-isl::union_pw_aff_list union_pw_aff_list::concat(isl::union_pw_aff_list list2) const
+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);
 }
 
-isl::union_pw_aff_list union_pw_aff_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::stat union_pw_aff_list::foreach(const std::function<isl::stat(isl::union_pw_aff)> &fn) const
+stat union_pw_aff_list::foreach(const std::function<stat(union_pw_aff)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::union_pw_aff)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::union_pw_aff_list union_pw_aff_list::from_union_pw_aff(isl::union_pw_aff el)
+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);
 }
 
-isl::union_pw_aff union_pw_aff_list::get_at(int index) const
+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);
 }
 
-isl::union_pw_aff union_pw_aff_list::get_union_pw_aff(int index) const
+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);
 }
 
-isl::union_pw_aff_list union_pw_aff_list::insert(unsigned int pos, isl::union_pw_aff el) const
+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);
@@ -17623,13 +17623,13 @@
   return res;
 }
 
-isl::union_pw_aff_list union_pw_aff_list::reverse() const
+union_pw_aff_list union_pw_aff_list::reverse() const
 {
   auto res = isl_union_pw_aff_list_reverse(copy());
   return manage(res);
 }
 
-isl::union_pw_aff_list union_pw_aff_list::set_union_pw_aff(int index, isl::union_pw_aff el) const
+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);
@@ -17641,17 +17641,17 @@
   return res;
 }
 
-isl::union_pw_aff_list union_pw_aff_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::union_pw_multi_aff manage(__isl_take isl_union_pw_multi_aff *ptr) {
+union_pw_multi_aff manage(__isl_take isl_union_pw_multi_aff *ptr) {
   return union_pw_multi_aff(ptr);
 }
-isl::union_pw_multi_aff manage_copy(__isl_keep isl_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);
 }
@@ -17659,7 +17659,7 @@
 union_pw_multi_aff::union_pw_multi_aff()
     : ptr(nullptr) {}
 
-union_pw_multi_aff::union_pw_multi_aff(const isl::union_pw_multi_aff &obj)
+union_pw_multi_aff::union_pw_multi_aff(const union_pw_multi_aff &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -17671,43 +17671,43 @@
 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(isl::aff aff)
+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(isl::pw_multi_aff pma)
+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(isl::union_set uset)
+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(isl::union_map umap)
+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(isl::ctx ctx, const std::string &str)
+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(isl::union_pw_aff upa)
+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(isl::multi_union_pw_aff mupa)
+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::operator=(isl::union_pw_multi_aff obj) {
+union_pw_multi_aff &union_pw_multi_aff::operator=(union_pw_multi_aff obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -17739,8 +17739,8 @@
 }
 
 
-isl::ctx union_pw_multi_aff::get_ctx() const {
-  return isl::ctx(isl_union_pw_multi_aff_get_ctx(ptr));
+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());
@@ -17757,25 +17757,25 @@
 }
 
 
-isl::union_pw_multi_aff union_pw_multi_aff::add(isl::union_pw_multi_aff upma2) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::add_pw_multi_aff(isl::pw_multi_aff pma) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::align_params(isl::space model) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::coalesce() const
+union_pw_multi_aff union_pw_multi_aff::coalesce() const
 {
   auto res = isl_union_pw_multi_aff_coalesce(copy());
   return manage(res);
@@ -17787,25 +17787,25 @@
   return res;
 }
 
-isl::union_set union_pw_multi_aff::domain() const
+union_set union_pw_multi_aff::domain() const
 {
   auto res = isl_union_pw_multi_aff_domain(copy());
   return manage(res);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::empty(isl::space space)
+union_pw_multi_aff union_pw_multi_aff::empty(space space)
 {
   auto res = isl_union_pw_multi_aff_empty(space.release());
   return manage(res);
 }
 
-isl::pw_multi_aff union_pw_multi_aff::extract_pw_multi_aff(isl::space space) const
+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);
@@ -17817,81 +17817,81 @@
   return res;
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::flat_range_product(isl::union_pw_multi_aff upma2) const
+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);
 }
 
-isl::stat union_pw_multi_aff::foreach_pw_multi_aff(const std::function<isl::stat(isl::pw_multi_aff)> &fn) const
+stat union_pw_multi_aff::foreach_pw_multi_aff(const std::function<stat(pw_multi_aff)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::pw_multi_aff)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::from_union_set(isl::union_set uset)
+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);
 }
 
-isl::pw_multi_aff_list union_pw_multi_aff::get_pw_multi_aff_list() const
+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);
 }
 
-isl::space union_pw_multi_aff::get_space() const
+space union_pw_multi_aff::get_space() const
 {
   auto res = isl_union_pw_multi_aff_get_space(get());
   return manage(res);
 }
 
-isl::union_pw_aff union_pw_multi_aff::get_union_pw_aff(int pos) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::gist(isl::union_set context) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::gist_params(isl::set context) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::intersect_domain(isl::union_set uset) const
+union_pw_multi_aff union_pw_multi_aff::intersect_domain(union_set uset) const
 {
   auto res = isl_union_pw_multi_aff_intersect_domain(copy(), uset.release());
   return manage(res);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::intersect_params(isl::set set) const
+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);
 }
 
-isl::boolean union_pw_multi_aff::involves_nan() const
+boolean union_pw_multi_aff::involves_nan() const
 {
   auto res = isl_union_pw_multi_aff_involves_nan(get());
   return manage(res);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::multi_val_on_domain(isl::union_set domain, isl::multi_val mv)
+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);
@@ -17903,71 +17903,71 @@
   return res;
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::neg() const
+union_pw_multi_aff union_pw_multi_aff::neg() const
 {
   auto res = isl_union_pw_multi_aff_neg(copy());
   return manage(res);
 }
 
-isl::boolean union_pw_multi_aff::plain_is_equal(const isl::union_pw_multi_aff &upma2) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::pullback(isl::union_pw_multi_aff upma2) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::reset_user() const
+union_pw_multi_aff union_pw_multi_aff::reset_user() const
 {
   auto res = isl_union_pw_multi_aff_reset_user(copy());
   return manage(res);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::scale_down_val(isl::val val) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::scale_multi_val(isl::multi_val mv) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::scale_val(isl::val val) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::sub(isl::union_pw_multi_aff upma2) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::subtract_domain(isl::union_set uset) const
+union_pw_multi_aff union_pw_multi_aff::subtract_domain(union_set uset) const
 {
   auto res = isl_union_pw_multi_aff_subtract_domain(copy(), uset.release());
   return manage(res);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff::union_add(isl::union_pw_multi_aff upma2) const
+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
-isl::union_pw_multi_aff_list manage(__isl_take isl_union_pw_multi_aff_list *ptr) {
+union_pw_multi_aff_list manage(__isl_take isl_union_pw_multi_aff_list *ptr) {
   return union_pw_multi_aff_list(ptr);
 }
-isl::union_pw_multi_aff_list manage_copy(__isl_keep isl_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);
 }
@@ -17975,7 +17975,7 @@
 union_pw_multi_aff_list::union_pw_multi_aff_list()
     : ptr(nullptr) {}
 
-union_pw_multi_aff_list::union_pw_multi_aff_list(const isl::union_pw_multi_aff_list &obj)
+union_pw_multi_aff_list::union_pw_multi_aff_list(const union_pw_multi_aff_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -17988,7 +17988,7 @@
     : ptr(ptr) {}
 
 
-union_pw_multi_aff_list &union_pw_multi_aff_list::operator=(isl::union_pw_multi_aff_list obj) {
+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;
 }
@@ -18020,8 +18020,8 @@
 }
 
 
-isl::ctx union_pw_multi_aff_list::get_ctx() const {
-  return isl::ctx(isl_union_pw_multi_aff_list_get_ctx(ptr));
+ctx union_pw_multi_aff_list::get_ctx() const {
+  return ctx(isl_union_pw_multi_aff_list_get_ctx(ptr));
 }
 
 void union_pw_multi_aff_list::dump() const {
@@ -18029,63 +18029,63 @@
 }
 
 
-isl::union_pw_multi_aff_list union_pw_multi_aff_list::add(isl::union_pw_multi_aff el) const
+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);
 }
 
-isl::union_pw_multi_aff_list union_pw_multi_aff_list::alloc(isl::ctx ctx, int n)
+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);
 }
 
-isl::union_pw_multi_aff_list union_pw_multi_aff_list::concat(isl::union_pw_multi_aff_list list2) const
+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);
 }
 
-isl::union_pw_multi_aff_list union_pw_multi_aff_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::stat union_pw_multi_aff_list::foreach(const std::function<isl::stat(isl::union_pw_multi_aff)> &fn) const
+stat union_pw_multi_aff_list::foreach(const std::function<stat(union_pw_multi_aff)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::union_pw_multi_aff)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::union_pw_multi_aff_list union_pw_multi_aff_list::from_union_pw_multi_aff(isl::union_pw_multi_aff el)
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff_list::get_at(int index) const
+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);
 }
 
-isl::union_pw_multi_aff union_pw_multi_aff_list::get_union_pw_multi_aff(int index) const
+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);
 }
 
-isl::union_pw_multi_aff_list union_pw_multi_aff_list::insert(unsigned int pos, isl::union_pw_multi_aff el) const
+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);
@@ -18097,13 +18097,13 @@
   return res;
 }
 
-isl::union_pw_multi_aff_list union_pw_multi_aff_list::reverse() const
+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);
 }
 
-isl::union_pw_multi_aff_list union_pw_multi_aff_list::set_union_pw_multi_aff(int index, isl::union_pw_multi_aff el) const
+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);
@@ -18115,17 +18115,17 @@
   return res;
 }
 
-isl::union_pw_multi_aff_list union_pw_multi_aff_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::union_pw_qpolynomial manage(__isl_take isl_union_pw_qpolynomial *ptr) {
+union_pw_qpolynomial manage(__isl_take isl_union_pw_qpolynomial *ptr) {
   return union_pw_qpolynomial(ptr);
 }
-isl::union_pw_qpolynomial manage_copy(__isl_keep isl_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);
 }
@@ -18133,7 +18133,7 @@
 union_pw_qpolynomial::union_pw_qpolynomial()
     : ptr(nullptr) {}
 
-union_pw_qpolynomial::union_pw_qpolynomial(const isl::union_pw_qpolynomial &obj)
+union_pw_qpolynomial::union_pw_qpolynomial(const union_pw_qpolynomial &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -18145,13 +18145,13 @@
 union_pw_qpolynomial::union_pw_qpolynomial(__isl_take isl_union_pw_qpolynomial *ptr)
     : ptr(ptr) {}
 
-union_pw_qpolynomial::union_pw_qpolynomial(isl::ctx ctx, const std::string &str)
+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=(isl::union_pw_qpolynomial obj) {
+union_pw_qpolynomial &union_pw_qpolynomial::operator=(union_pw_qpolynomial obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -18183,8 +18183,8 @@
 }
 
 
-isl::ctx union_pw_qpolynomial::get_ctx() const {
-  return isl::ctx(isl_union_pw_qpolynomial_get_ctx(ptr));
+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());
@@ -18197,25 +18197,25 @@
 
 
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::add(isl::union_pw_qpolynomial upwqp2) const
+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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::add_pw_qpolynomial(isl::pw_qpolynomial pwqp) const
+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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::align_params(isl::space model) const
+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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::coalesce() const
+union_pw_qpolynomial union_pw_qpolynomial::coalesce() const
 {
   auto res = isl_union_pw_qpolynomial_coalesce(copy());
   return manage(res);
@@ -18227,25 +18227,25 @@
   return res;
 }
 
-isl::union_set union_pw_qpolynomial::domain() const
+union_set union_pw_qpolynomial::domain() const
 {
   auto res = isl_union_pw_qpolynomial_domain(copy());
   return manage(res);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::drop_dims(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::val union_pw_qpolynomial::eval(isl::point pnt) const
+val union_pw_qpolynomial::eval(point pnt) const
 {
   auto res = isl_union_pw_qpolynomial_eval(copy(), pnt.release());
   return manage(res);
 }
 
-isl::pw_qpolynomial union_pw_qpolynomial::extract_pw_qpolynomial(isl::space dim) const
+pw_qpolynomial union_pw_qpolynomial::extract_pw_qpolynomial(space dim) const
 {
   auto res = isl_union_pw_qpolynomial_extract_pw_qpolynomial(get(), dim.release());
   return manage(res);
@@ -18257,69 +18257,69 @@
   return res;
 }
 
-isl::stat union_pw_qpolynomial::foreach_pw_qpolynomial(const std::function<isl::stat(isl::pw_qpolynomial)> &fn) const
+stat union_pw_qpolynomial::foreach_pw_qpolynomial(const std::function<stat(pw_qpolynomial)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::pw_qpolynomial)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::from_pw_qpolynomial(isl::pw_qpolynomial pwqp)
+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);
 }
 
-isl::pw_qpolynomial_list union_pw_qpolynomial::get_pw_qpolynomial_list() const
+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);
 }
 
-isl::space union_pw_qpolynomial::get_space() const
+space union_pw_qpolynomial::get_space() const
 {
   auto res = isl_union_pw_qpolynomial_get_space(get());
   return manage(res);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::gist(isl::union_set context) const
+union_pw_qpolynomial union_pw_qpolynomial::gist(union_set context) const
 {
   auto res = isl_union_pw_qpolynomial_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::gist_params(isl::set context) const
+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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::intersect_domain(isl::union_set uset) const
+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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::intersect_params(isl::set set) const
+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);
 }
 
-isl::boolean union_pw_qpolynomial::involves_nan() const
+boolean union_pw_qpolynomial::involves_nan() const
 {
   auto res = isl_union_pw_qpolynomial_involves_nan(get());
   return manage(res);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::mul(isl::union_pw_qpolynomial upwqp2) const
+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);
@@ -18331,65 +18331,65 @@
   return res;
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::neg() const
+union_pw_qpolynomial union_pw_qpolynomial::neg() const
 {
   auto res = isl_union_pw_qpolynomial_neg(copy());
   return manage(res);
 }
 
-isl::boolean union_pw_qpolynomial::plain_is_equal(const isl::union_pw_qpolynomial &upwqp2) const
+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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::reset_user() const
+union_pw_qpolynomial union_pw_qpolynomial::reset_user() const
 {
   auto res = isl_union_pw_qpolynomial_reset_user(copy());
   return manage(res);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::scale_down_val(isl::val v) const
+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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::scale_val(isl::val v) const
+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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::sub(isl::union_pw_qpolynomial upwqp2) const
+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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::subtract_domain(isl::union_set uset) const
+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);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::to_polynomial(int sign) const
+union_pw_qpolynomial union_pw_qpolynomial::to_polynomial(int sign) const
 {
   auto res = isl_union_pw_qpolynomial_to_polynomial(copy(), sign);
   return manage(res);
 }
 
-isl::union_pw_qpolynomial union_pw_qpolynomial::zero(isl::space dim)
+union_pw_qpolynomial union_pw_qpolynomial::zero(space dim)
 {
   auto res = isl_union_pw_qpolynomial_zero(dim.release());
   return manage(res);
 }
 
 // implementations for isl::union_set
-isl::union_set manage(__isl_take isl_union_set *ptr) {
+union_set manage(__isl_take isl_union_set *ptr) {
   return union_set(ptr);
 }
-isl::union_set manage_copy(__isl_keep isl_union_set *ptr) {
+union_set manage_copy(__isl_keep isl_union_set *ptr) {
   ptr = isl_union_set_copy(ptr);
   return union_set(ptr);
 }
@@ -18397,7 +18397,7 @@
 union_set::union_set()
     : ptr(nullptr) {}
 
-union_set::union_set(const isl::union_set &obj)
+union_set::union_set(const union_set &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -18409,28 +18409,28 @@
 union_set::union_set(__isl_take isl_union_set *ptr)
     : ptr(ptr) {}
 
-union_set::union_set(isl::basic_set bset)
+union_set::union_set(basic_set bset)
 {
   auto res = isl_union_set_from_basic_set(bset.release());
   ptr = res;
 }
-union_set::union_set(isl::set set)
+union_set::union_set(set set)
 {
   auto res = isl_union_set_from_set(set.release());
   ptr = res;
 }
-union_set::union_set(isl::point pnt)
+union_set::union_set(point pnt)
 {
   auto res = isl_union_set_from_point(pnt.release());
   ptr = res;
 }
-union_set::union_set(isl::ctx ctx, const std::string &str)
+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=(isl::union_set obj) {
+union_set &union_set::operator=(union_set obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -18462,8 +18462,8 @@
 }
 
 
-isl::ctx union_set::get_ctx() const {
-  return isl::ctx(isl_union_set_get_ctx(ptr));
+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());
@@ -18480,55 +18480,55 @@
 }
 
 
-isl::union_set union_set::add_set(isl::set set) const
+union_set union_set::add_set(set set) const
 {
   auto res = isl_union_set_add_set(copy(), set.release());
   return manage(res);
 }
 
-isl::union_set union_set::affine_hull() const
+union_set union_set::affine_hull() const
 {
   auto res = isl_union_set_affine_hull(copy());
   return manage(res);
 }
 
-isl::union_set union_set::align_params(isl::space model) const
+union_set union_set::align_params(space model) const
 {
   auto res = isl_union_set_align_params(copy(), model.release());
   return manage(res);
 }
 
-isl::union_set union_set::apply(isl::union_map umap) const
+union_set union_set::apply(union_map umap) const
 {
   auto res = isl_union_set_apply(copy(), umap.release());
   return manage(res);
 }
 
-isl::union_set union_set::coalesce() const
+union_set union_set::coalesce() const
 {
   auto res = isl_union_set_coalesce(copy());
   return manage(res);
 }
 
-isl::union_set union_set::coefficients() const
+union_set union_set::coefficients() const
 {
   auto res = isl_union_set_coefficients(copy());
   return manage(res);
 }
 
-isl::schedule union_set::compute_schedule(isl::union_map validity, isl::union_map proximity) const
+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);
 }
 
-isl::boolean union_set::contains(const isl::space &space) const
+boolean union_set::contains(const space &space) const
 {
   auto res = isl_union_set_contains(get(), space.get());
   return manage(res);
 }
 
-isl::union_set union_set::detect_equalities() const
+union_set union_set::detect_equalities() const
 {
   auto res = isl_union_set_detect_equalities(copy());
   return manage(res);
@@ -18540,47 +18540,47 @@
   return res;
 }
 
-isl::union_set union_set::empty(isl::space space)
+union_set union_set::empty(space space)
 {
   auto res = isl_union_set_empty(space.release());
   return manage(res);
 }
 
-isl::set union_set::extract_set(isl::space dim) const
+set union_set::extract_set(space dim) const
 {
   auto res = isl_union_set_extract_set(get(), dim.release());
   return manage(res);
 }
 
-isl::stat union_set::foreach_point(const std::function<isl::stat(isl::point)> &fn) const
+stat union_set::foreach_point(const std::function<stat(point)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::point)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::stat union_set::foreach_set(const std::function<isl::stat(isl::set)> &fn) const
+stat union_set::foreach_set(const std::function<stat(set)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::set)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::basic_set_list union_set::get_basic_set_list() const
+basic_set_list union_set::get_basic_set_list() const
 {
   auto res = isl_union_set_get_basic_set_list(get());
   return manage(res);
@@ -18592,127 +18592,127 @@
   return res;
 }
 
-isl::set_list union_set::get_set_list() const
+set_list union_set::get_set_list() const
 {
   auto res = isl_union_set_get_set_list(get());
   return manage(res);
 }
 
-isl::space union_set::get_space() const
+space union_set::get_space() const
 {
   auto res = isl_union_set_get_space(get());
   return manage(res);
 }
 
-isl::union_set union_set::gist(isl::union_set context) const
+union_set union_set::gist(union_set context) const
 {
   auto res = isl_union_set_gist(copy(), context.release());
   return manage(res);
 }
 
-isl::union_set union_set::gist_params(isl::set set) const
+union_set union_set::gist_params(set set) const
 {
   auto res = isl_union_set_gist_params(copy(), set.release());
   return manage(res);
 }
 
-isl::union_map union_set::identity() const
+union_map union_set::identity() const
 {
   auto res = isl_union_set_identity(copy());
   return manage(res);
 }
 
-isl::union_pw_multi_aff union_set::identity_union_pw_multi_aff() const
+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);
 }
 
-isl::union_set union_set::intersect(isl::union_set uset2) const
+union_set union_set::intersect(union_set uset2) const
 {
   auto res = isl_union_set_intersect(copy(), uset2.release());
   return manage(res);
 }
 
-isl::union_set union_set::intersect_params(isl::set set) const
+union_set union_set::intersect_params(set set) const
 {
   auto res = isl_union_set_intersect_params(copy(), set.release());
   return manage(res);
 }
 
-isl::boolean union_set::is_disjoint(const isl::union_set &uset2) const
+boolean union_set::is_disjoint(const union_set &uset2) const
 {
   auto res = isl_union_set_is_disjoint(get(), uset2.get());
   return manage(res);
 }
 
-isl::boolean union_set::is_empty() const
+boolean union_set::is_empty() const
 {
   auto res = isl_union_set_is_empty(get());
   return manage(res);
 }
 
-isl::boolean union_set::is_equal(const isl::union_set &uset2) const
+boolean union_set::is_equal(const union_set &uset2) const
 {
   auto res = isl_union_set_is_equal(get(), uset2.get());
   return manage(res);
 }
 
-isl::boolean union_set::is_params() const
+boolean union_set::is_params() const
 {
   auto res = isl_union_set_is_params(get());
   return manage(res);
 }
 
-isl::boolean union_set::is_strict_subset(const isl::union_set &uset2) const
+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);
 }
 
-isl::boolean union_set::is_subset(const isl::union_set &uset2) const
+boolean union_set::is_subset(const union_set &uset2) const
 {
   auto res = isl_union_set_is_subset(get(), uset2.get());
   return manage(res);
 }
 
-isl::union_map union_set::lex_ge_union_set(isl::union_set uset2) const
+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);
 }
 
-isl::union_map union_set::lex_gt_union_set(isl::union_set uset2) const
+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);
 }
 
-isl::union_map union_set::lex_le_union_set(isl::union_set uset2) const
+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);
 }
 
-isl::union_map union_set::lex_lt_union_set(isl::union_set uset2) const
+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);
 }
 
-isl::union_set union_set::lexmax() const
+union_set union_set::lexmax() const
 {
   auto res = isl_union_set_lexmax(copy());
   return manage(res);
 }
 
-isl::union_set union_set::lexmin() const
+union_set union_set::lexmin() const
 {
   auto res = isl_union_set_lexmin(copy());
   return manage(res);
 }
 
-isl::multi_val union_set::min_multi_union_pw_aff(const isl::multi_union_pw_aff &obj) const
+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);
@@ -18724,125 +18724,125 @@
   return res;
 }
 
-isl::set union_set::params() const
+set union_set::params() const
 {
   auto res = isl_union_set_params(copy());
   return manage(res);
 }
 
-isl::union_set union_set::polyhedral_hull() const
+union_set union_set::polyhedral_hull() const
 {
   auto res = isl_union_set_polyhedral_hull(copy());
   return manage(res);
 }
 
-isl::union_set union_set::preimage(isl::multi_aff ma) const
+union_set union_set::preimage(multi_aff ma) const
 {
   auto res = isl_union_set_preimage_multi_aff(copy(), ma.release());
   return manage(res);
 }
 
-isl::union_set union_set::preimage(isl::pw_multi_aff pma) const
+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);
 }
 
-isl::union_set union_set::preimage(isl::union_pw_multi_aff upma) const
+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);
 }
 
-isl::union_set union_set::product(isl::union_set uset2) const
+union_set union_set::product(union_set uset2) const
 {
   auto res = isl_union_set_product(copy(), uset2.release());
   return manage(res);
 }
 
-isl::union_set union_set::project_out(isl::dim type, unsigned int first, unsigned int n) const
+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);
 }
 
-isl::union_set union_set::remove_divs() const
+union_set union_set::remove_divs() const
 {
   auto res = isl_union_set_remove_divs(copy());
   return manage(res);
 }
 
-isl::union_set union_set::remove_redundancies() const
+union_set union_set::remove_redundancies() const
 {
   auto res = isl_union_set_remove_redundancies(copy());
   return manage(res);
 }
 
-isl::union_set union_set::reset_user() const
+union_set union_set::reset_user() const
 {
   auto res = isl_union_set_reset_user(copy());
   return manage(res);
 }
 
-isl::basic_set union_set::sample() const
+basic_set union_set::sample() const
 {
   auto res = isl_union_set_sample(copy());
   return manage(res);
 }
 
-isl::point union_set::sample_point() const
+point union_set::sample_point() const
 {
   auto res = isl_union_set_sample_point(copy());
   return manage(res);
 }
 
-isl::union_set union_set::simple_hull() const
+union_set union_set::simple_hull() const
 {
   auto res = isl_union_set_simple_hull(copy());
   return manage(res);
 }
 
-isl::union_set union_set::solutions() const
+union_set union_set::solutions() const
 {
   auto res = isl_union_set_solutions(copy());
   return manage(res);
 }
 
-isl::union_set union_set::subtract(isl::union_set uset2) const
+union_set union_set::subtract(union_set uset2) const
 {
   auto res = isl_union_set_subtract(copy(), uset2.release());
   return manage(res);
 }
 
-isl::union_set union_set::unite(isl::union_set uset2) const
+union_set union_set::unite(union_set uset2) const
 {
   auto res = isl_union_set_union(copy(), uset2.release());
   return manage(res);
 }
 
-isl::union_set union_set::universe() const
+union_set union_set::universe() const
 {
   auto res = isl_union_set_universe(copy());
   return manage(res);
 }
 
-isl::union_map union_set::unwrap() const
+union_map union_set::unwrap() const
 {
   auto res = isl_union_set_unwrap(copy());
   return manage(res);
 }
 
-isl::union_map union_set::wrapped_domain_map() const
+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
-isl::union_set_list manage(__isl_take isl_union_set_list *ptr) {
+union_set_list manage(__isl_take isl_union_set_list *ptr) {
   return union_set_list(ptr);
 }
-isl::union_set_list manage_copy(__isl_keep isl_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);
 }
@@ -18850,7 +18850,7 @@
 union_set_list::union_set_list()
     : ptr(nullptr) {}
 
-union_set_list::union_set_list(const isl::union_set_list &obj)
+union_set_list::union_set_list(const union_set_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -18863,7 +18863,7 @@
     : ptr(ptr) {}
 
 
-union_set_list &union_set_list::operator=(isl::union_set_list obj) {
+union_set_list &union_set_list::operator=(union_set_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -18895,8 +18895,8 @@
 }
 
 
-isl::ctx union_set_list::get_ctx() const {
-  return isl::ctx(isl_union_set_list_get_ctx(ptr));
+ctx union_set_list::get_ctx() const {
+  return ctx(isl_union_set_list_get_ctx(ptr));
 }
 
 void union_set_list::dump() const {
@@ -18904,63 +18904,63 @@
 }
 
 
-isl::union_set_list union_set_list::add(isl::union_set el) const
+union_set_list union_set_list::add(union_set el) const
 {
   auto res = isl_union_set_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::union_set_list union_set_list::alloc(isl::ctx ctx, int n)
+union_set_list union_set_list::alloc(ctx ctx, int n)
 {
   auto res = isl_union_set_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::union_set_list union_set_list::concat(isl::union_set_list list2) const
+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);
 }
 
-isl::union_set_list union_set_list::drop(unsigned int first, unsigned int n) const
+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);
 }
 
-isl::stat union_set_list::foreach(const std::function<isl::stat(isl::union_set)> &fn) const
+stat union_set_list::foreach(const std::function<stat(union_set)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::union_set)> *func;
+    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)(isl::manage(arg_0));
+    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);
 }
 
-isl::union_set_list union_set_list::from_union_set(isl::union_set el)
+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);
 }
 
-isl::union_set union_set_list::get_at(int index) const
+union_set union_set_list::get_at(int index) const
 {
   auto res = isl_union_set_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::union_set union_set_list::get_union_set(int index) const
+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);
 }
 
-isl::union_set_list union_set_list::insert(unsigned int pos, isl::union_set el) const
+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);
@@ -18972,13 +18972,13 @@
   return res;
 }
 
-isl::union_set_list union_set_list::reverse() const
+union_set_list union_set_list::reverse() const
 {
   auto res = isl_union_set_list_reverse(copy());
   return manage(res);
 }
 
-isl::union_set_list union_set_list::set_union_set(int index, isl::union_set el) const
+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);
@@ -18990,23 +18990,23 @@
   return res;
 }
 
-isl::union_set_list union_set_list::swap(unsigned int pos1, unsigned int pos2) const
+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);
 }
 
-isl::union_set union_set_list::unite() const
+union_set union_set_list::unite() const
 {
   auto res = isl_union_set_list_union(copy());
   return manage(res);
 }
 
 // implementations for isl::val
-isl::val manage(__isl_take isl_val *ptr) {
+val manage(__isl_take isl_val *ptr) {
   return val(ptr);
 }
-isl::val manage_copy(__isl_keep isl_val *ptr) {
+val manage_copy(__isl_keep isl_val *ptr) {
   ptr = isl_val_copy(ptr);
   return val(ptr);
 }
@@ -19014,7 +19014,7 @@
 val::val()
     : ptr(nullptr) {}
 
-val::val(const isl::val &obj)
+val::val(const val &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -19026,18 +19026,18 @@
 val::val(__isl_take isl_val *ptr)
     : ptr(ptr) {}
 
-val::val(isl::ctx ctx, const std::string &str)
+val::val(ctx ctx, const std::string &str)
 {
   auto res = isl_val_read_from_str(ctx.release(), str.c_str());
   ptr = res;
 }
-val::val(isl::ctx ctx, long i)
+val::val(ctx ctx, long i)
 {
   auto res = isl_val_int_from_si(ctx.release(), i);
   ptr = res;
 }
 
-val &val::operator=(isl::val obj) {
+val &val::operator=(val obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -19069,8 +19069,8 @@
 }
 
 
-isl::ctx val::get_ctx() const {
-  return isl::ctx(isl_val_get_ctx(ptr));
+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());
@@ -19087,37 +19087,37 @@
 }
 
 
-isl::val val::two_exp() const
+val val::two_exp() const
 {
   auto res = isl_val_2exp(copy());
   return manage(res);
 }
 
-isl::val val::abs() const
+val val::abs() const
 {
   auto res = isl_val_abs(copy());
   return manage(res);
 }
 
-isl::boolean val::abs_eq(const isl::val &v2) const
+boolean val::abs_eq(const val &v2) const
 {
   auto res = isl_val_abs_eq(get(), v2.get());
   return manage(res);
 }
 
-isl::val val::add(isl::val v2) const
+val val::add(val v2) const
 {
   auto res = isl_val_add(copy(), v2.release());
   return manage(res);
 }
 
-isl::val val::add_ui(unsigned long v2) const
+val val::add_ui(unsigned long v2) const
 {
   auto res = isl_val_add_ui(copy(), v2);
   return manage(res);
 }
 
-isl::val val::ceil() const
+val val::ceil() const
 {
   auto res = isl_val_ceil(copy());
   return manage(res);
@@ -19129,37 +19129,37 @@
   return res;
 }
 
-isl::val val::div(isl::val v2) const
+val val::div(val v2) const
 {
   auto res = isl_val_div(copy(), v2.release());
   return manage(res);
 }
 
-isl::val val::div_ui(unsigned long v2) const
+val val::div_ui(unsigned long v2) const
 {
   auto res = isl_val_div_ui(copy(), v2);
   return manage(res);
 }
 
-isl::boolean val::eq(const isl::val &v2) const
+boolean val::eq(const val &v2) const
 {
   auto res = isl_val_eq(get(), v2.get());
   return manage(res);
 }
 
-isl::val val::floor() const
+val val::floor() const
 {
   auto res = isl_val_floor(copy());
   return manage(res);
 }
 
-isl::val val::gcd(isl::val v2) const
+val val::gcd(val v2) const
 {
   auto res = isl_val_gcd(copy(), v2.release());
   return manage(res);
 }
 
-isl::boolean val::ge(const isl::val &v2) const
+boolean val::ge(const val &v2) const
 {
   auto res = isl_val_ge(get(), v2.get());
   return manage(res);
@@ -19177,151 +19177,151 @@
   return res;
 }
 
-isl::boolean val::gt(const isl::val &v2) const
+boolean val::gt(const val &v2) const
 {
   auto res = isl_val_gt(get(), v2.get());
   return manage(res);
 }
 
-isl::boolean val::gt_si(long i) const
+boolean val::gt_si(long i) const
 {
   auto res = isl_val_gt_si(get(), i);
   return manage(res);
 }
 
-isl::val val::infty(isl::ctx ctx)
+val val::infty(ctx ctx)
 {
   auto res = isl_val_infty(ctx.release());
   return manage(res);
 }
 
-isl::val val::int_from_ui(isl::ctx ctx, unsigned long u)
+val val::int_from_ui(ctx ctx, unsigned long u)
 {
   auto res = isl_val_int_from_ui(ctx.release(), u);
   return manage(res);
 }
 
-isl::val val::inv() const
+val val::inv() const
 {
   auto res = isl_val_inv(copy());
   return manage(res);
 }
 
-isl::boolean val::is_divisible_by(const isl::val &v2) const
+boolean val::is_divisible_by(const val &v2) const
 {
   auto res = isl_val_is_divisible_by(get(), v2.get());
   return manage(res);
 }
 
-isl::boolean val::is_infty() const
+boolean val::is_infty() const
 {
   auto res = isl_val_is_infty(get());
   return manage(res);
 }
 
-isl::boolean val::is_int() const
+boolean val::is_int() const
 {
   auto res = isl_val_is_int(get());
   return manage(res);
 }
 
-isl::boolean val::is_nan() const
+boolean val::is_nan() const
 {
   auto res = isl_val_is_nan(get());
   return manage(res);
 }
 
-isl::boolean val::is_neg() const
+boolean val::is_neg() const
 {
   auto res = isl_val_is_neg(get());
   return manage(res);
 }
 
-isl::boolean val::is_neginfty() const
+boolean val::is_neginfty() const
 {
   auto res = isl_val_is_neginfty(get());
   return manage(res);
 }
 
-isl::boolean val::is_negone() const
+boolean val::is_negone() const
 {
   auto res = isl_val_is_negone(get());
   return manage(res);
 }
 
-isl::boolean val::is_nonneg() const
+boolean val::is_nonneg() const
 {
   auto res = isl_val_is_nonneg(get());
   return manage(res);
 }
 
-isl::boolean val::is_nonpos() const
+boolean val::is_nonpos() const
 {
   auto res = isl_val_is_nonpos(get());
   return manage(res);
 }
 
-isl::boolean val::is_one() const
+boolean val::is_one() const
 {
   auto res = isl_val_is_one(get());
   return manage(res);
 }
 
-isl::boolean val::is_pos() const
+boolean val::is_pos() const
 {
   auto res = isl_val_is_pos(get());
   return manage(res);
 }
 
-isl::boolean val::is_rat() const
+boolean val::is_rat() const
 {
   auto res = isl_val_is_rat(get());
   return manage(res);
 }
 
-isl::boolean val::is_zero() const
+boolean val::is_zero() const
 {
   auto res = isl_val_is_zero(get());
   return manage(res);
 }
 
-isl::boolean val::le(const isl::val &v2) const
+boolean val::le(const val &v2) const
 {
   auto res = isl_val_le(get(), v2.get());
   return manage(res);
 }
 
-isl::boolean val::lt(const isl::val &v2) const
+boolean val::lt(const val &v2) const
 {
   auto res = isl_val_lt(get(), v2.get());
   return manage(res);
 }
 
-isl::val val::max(isl::val v2) const
+val val::max(val v2) const
 {
   auto res = isl_val_max(copy(), v2.release());
   return manage(res);
 }
 
-isl::val val::min(isl::val v2) const
+val val::min(val v2) const
 {
   auto res = isl_val_min(copy(), v2.release());
   return manage(res);
 }
 
-isl::val val::mod(isl::val v2) const
+val val::mod(val v2) const
 {
   auto res = isl_val_mod(copy(), v2.release());
   return manage(res);
 }
 
-isl::val val::mul(isl::val v2) const
+val val::mul(val v2) const
 {
   auto res = isl_val_mul(copy(), v2.release());
   return manage(res);
 }
 
-isl::val val::mul_ui(unsigned long v2) const
+val val::mul_ui(unsigned long v2) const
 {
   auto res = isl_val_mul_ui(copy(), v2);
   return manage(res);
@@ -19333,43 +19333,43 @@
   return res;
 }
 
-isl::val val::nan(isl::ctx ctx)
+val val::nan(ctx ctx)
 {
   auto res = isl_val_nan(ctx.release());
   return manage(res);
 }
 
-isl::boolean val::ne(const isl::val &v2) const
+boolean val::ne(const val &v2) const
 {
   auto res = isl_val_ne(get(), v2.get());
   return manage(res);
 }
 
-isl::val val::neg() const
+val val::neg() const
 {
   auto res = isl_val_neg(copy());
   return manage(res);
 }
 
-isl::val val::neginfty(isl::ctx ctx)
+val val::neginfty(ctx ctx)
 {
   auto res = isl_val_neginfty(ctx.release());
   return manage(res);
 }
 
-isl::val val::negone(isl::ctx ctx)
+val val::negone(ctx ctx)
 {
   auto res = isl_val_negone(ctx.release());
   return manage(res);
 }
 
-isl::val val::one(isl::ctx ctx)
+val val::one(ctx ctx)
 {
   auto res = isl_val_one(ctx.release());
   return manage(res);
 }
 
-isl::val val::set_si(long i) const
+val val::set_si(long i) const
 {
   auto res = isl_val_set_si(copy(), i);
   return manage(res);
@@ -19381,35 +19381,35 @@
   return res;
 }
 
-isl::val val::sub(isl::val v2) const
+val val::sub(val v2) const
 {
   auto res = isl_val_sub(copy(), v2.release());
   return manage(res);
 }
 
-isl::val val::sub_ui(unsigned long v2) const
+val val::sub_ui(unsigned long v2) const
 {
   auto res = isl_val_sub_ui(copy(), v2);
   return manage(res);
 }
 
-isl::val val::trunc() const
+val val::trunc() const
 {
   auto res = isl_val_trunc(copy());
   return manage(res);
 }
 
-isl::val val::zero(isl::ctx ctx)
+val val::zero(ctx ctx)
 {
   auto res = isl_val_zero(ctx.release());
   return manage(res);
 }
 
 // implementations for isl::val_list
-isl::val_list manage(__isl_take isl_val_list *ptr) {
+val_list manage(__isl_take isl_val_list *ptr) {
   return val_list(ptr);
 }
-isl::val_list manage_copy(__isl_keep isl_val_list *ptr) {
+val_list manage_copy(__isl_keep isl_val_list *ptr) {
   ptr = isl_val_list_copy(ptr);
   return val_list(ptr);
 }
@@ -19417,7 +19417,7 @@
 val_list::val_list()
     : ptr(nullptr) {}
 
-val_list::val_list(const isl::val_list &obj)
+val_list::val_list(const val_list &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -19430,7 +19430,7 @@
     : ptr(ptr) {}
 
 
-val_list &val_list::operator=(isl::val_list obj) {
+val_list &val_list::operator=(val_list obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -19462,8 +19462,8 @@
 }
 
 
-isl::ctx val_list::get_ctx() const {
-  return isl::ctx(isl_val_list_get_ctx(ptr));
+ctx val_list::get_ctx() const {
+  return ctx(isl_val_list_get_ctx(ptr));
 }
 
 void val_list::dump() const {
@@ -19471,63 +19471,63 @@
 }
 
 
-isl::val_list val_list::add(isl::val el) const
+val_list val_list::add(val el) const
 {
   auto res = isl_val_list_add(copy(), el.release());
   return manage(res);
 }
 
-isl::val_list val_list::alloc(isl::ctx ctx, int n)
+val_list val_list::alloc(ctx ctx, int n)
 {
   auto res = isl_val_list_alloc(ctx.release(), n);
   return manage(res);
 }
 
-isl::val_list val_list::concat(isl::val_list list2) const
+val_list val_list::concat(val_list list2) const
 {
   auto res = isl_val_list_concat(copy(), list2.release());
   return manage(res);
 }
 
-isl::val_list val_list::drop(unsigned int first, unsigned int n) const
+val_list val_list::drop(unsigned int first, unsigned int n) const
 {
   auto res = isl_val_list_drop(copy(), first, n);
   return manage(res);
 }
 
-isl::stat val_list::foreach(const std::function<isl::stat(isl::val)> &fn) const
+stat val_list::foreach(const std::function<stat(val)> &fn) const
 {
   struct fn_data {
-    const std::function<isl::stat(isl::val)> *func;
+    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)(isl::manage(arg_0));
+    stat ret = (*data->func)(manage(arg_0));
     return ret.release();
   };
   auto res = isl_val_list_foreach(get(), fn_lambda, &fn_data);
   return manage(res);
 }
 
-isl::val_list val_list::from_val(isl::val el)
+val_list val_list::from_val(val el)
 {
   auto res = isl_val_list_from_val(el.release());
   return manage(res);
 }
 
-isl::val val_list::get_at(int index) const
+val val_list::get_at(int index) const
 {
   auto res = isl_val_list_get_at(get(), index);
   return manage(res);
 }
 
-isl::val val_list::get_val(int index) const
+val val_list::get_val(int index) const
 {
   auto res = isl_val_list_get_val(get(), index);
   return manage(res);
 }
 
-isl::val_list val_list::insert(unsigned int pos, isl::val el) const
+val_list val_list::insert(unsigned int pos, val el) const
 {
   auto res = isl_val_list_insert(copy(), pos, el.release());
   return manage(res);
@@ -19539,13 +19539,13 @@
   return res;
 }
 
-isl::val_list val_list::reverse() const
+val_list val_list::reverse() const
 {
   auto res = isl_val_list_reverse(copy());
   return manage(res);
 }
 
-isl::val_list val_list::set_val(int index, isl::val el) const
+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);
@@ -19557,17 +19557,17 @@
   return res;
 }
 
-isl::val_list val_list::swap(unsigned int pos1, unsigned int pos2) const
+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
-isl::vec manage(__isl_take isl_vec *ptr) {
+vec manage(__isl_take isl_vec *ptr) {
   return vec(ptr);
 }
-isl::vec manage_copy(__isl_keep isl_vec *ptr) {
+vec manage_copy(__isl_keep isl_vec *ptr) {
   ptr = isl_vec_copy(ptr);
   return vec(ptr);
 }
@@ -19575,7 +19575,7 @@
 vec::vec()
     : ptr(nullptr) {}
 
-vec::vec(const isl::vec &obj)
+vec::vec(const vec &obj)
     : ptr(nullptr)
 {
   ptr = obj.copy();
@@ -19588,7 +19588,7 @@
     : ptr(ptr) {}
 
 
-vec &vec::operator=(isl::vec obj) {
+vec &vec::operator=(vec obj) {
   std::swap(this->ptr, obj.ptr);
   return *this;
 }
@@ -19620,8 +19620,8 @@
 }
 
 
-isl::ctx vec::get_ctx() const {
-  return isl::ctx(isl_vec_get_ctx(ptr));
+ctx vec::get_ctx() const {
+  return ctx(isl_vec_get_ctx(ptr));
 }
 
 void vec::dump() const {
@@ -19629,121 +19629,121 @@
 }
 
 
-isl::vec vec::add(isl::vec vec2) const
+vec vec::add(vec vec2) const
 {
   auto res = isl_vec_add(copy(), vec2.release());
   return manage(res);
 }
 
-isl::vec vec::add_els(unsigned int n) const
+vec vec::add_els(unsigned int n) const
 {
   auto res = isl_vec_add_els(copy(), n);
   return manage(res);
 }
 
-isl::vec vec::alloc(isl::ctx ctx, unsigned int size)
+vec vec::alloc(ctx ctx, unsigned int size)
 {
   auto res = isl_vec_alloc(ctx.release(), size);
   return manage(res);
 }
 
-isl::vec vec::ceil() const
+vec vec::ceil() const
 {
   auto res = isl_vec_ceil(copy());
   return manage(res);
 }
 
-isl::vec vec::clr() const
+vec vec::clr() const
 {
   auto res = isl_vec_clr(copy());
   return manage(res);
 }
 
-int vec::cmp_element(const isl::vec &vec2, int pos) const
+int vec::cmp_element(const vec &vec2, int pos) const
 {
   auto res = isl_vec_cmp_element(get(), vec2.get(), pos);
   return res;
 }
 
-isl::vec vec::concat(isl::vec vec2) const
+vec vec::concat(vec vec2) const
 {
   auto res = isl_vec_concat(copy(), vec2.release());
   return manage(res);
 }
 
-isl::vec vec::drop_els(unsigned int pos, unsigned int n) const
+vec vec::drop_els(unsigned int pos, unsigned int n) const
 {
   auto res = isl_vec_drop_els(copy(), pos, n);
   return manage(res);
 }
 
-isl::vec vec::extend(unsigned int size) const
+vec vec::extend(unsigned int size) const
 {
   auto res = isl_vec_extend(copy(), size);
   return manage(res);
 }
 
-isl::val vec::get_element_val(int pos) const
+val vec::get_element_val(int pos) const
 {
   auto res = isl_vec_get_element_val(get(), pos);
   return manage(res);
 }
 
-isl::vec vec::insert_els(unsigned int pos, unsigned int n) const
+vec vec::insert_els(unsigned int pos, unsigned int n) const
 {
   auto res = isl_vec_insert_els(copy(), pos, n);
   return manage(res);
 }
 
-isl::vec vec::insert_zero_els(unsigned int pos, unsigned int n) const
+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);
 }
 
-isl::boolean vec::is_equal(const isl::vec &vec2) const
+boolean vec::is_equal(const vec &vec2) const
 {
   auto res = isl_vec_is_equal(get(), vec2.get());
   return manage(res);
 }
 
-isl::vec vec::mat_product(isl::mat mat) const
+vec vec::mat_product(mat mat) const
 {
   auto res = isl_vec_mat_product(copy(), mat.release());
   return manage(res);
 }
 
-isl::vec vec::move_els(unsigned int dst_col, unsigned int src_col, unsigned int n) const
+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);
 }
 
-isl::vec vec::neg() const
+vec vec::neg() const
 {
   auto res = isl_vec_neg(copy());
   return manage(res);
 }
 
-isl::vec vec::set_element_si(int pos, int v) const
+vec vec::set_element_si(int pos, int v) const
 {
   auto res = isl_vec_set_element_si(copy(), pos, v);
   return manage(res);
 }
 
-isl::vec vec::set_element_val(int pos, isl::val v) const
+vec vec::set_element_val(int pos, val v) const
 {
   auto res = isl_vec_set_element_val(copy(), pos, v.release());
   return manage(res);
 }
 
-isl::vec vec::set_si(int v) const
+vec vec::set_si(int v) const
 {
   auto res = isl_vec_set_si(copy(), v);
   return manage(res);
 }
 
-isl::vec vec::set_val(isl::val v) const
+vec vec::set_val(val v) const
 {
   auto res = isl_vec_set_val(copy(), v.release());
   return manage(res);
@@ -19755,19 +19755,19 @@
   return res;
 }
 
-isl::vec vec::sort() const
+vec vec::sort() const
 {
   auto res = isl_vec_sort(copy());
   return manage(res);
 }
 
-isl::vec vec::zero(isl::ctx ctx, unsigned int size)
+vec vec::zero(ctx ctx, unsigned int size)
 {
   auto res = isl_vec_zero(ctx.release(), size);
   return manage(res);
 }
 
-isl::vec vec::zero_extend(unsigned int size) const
+vec vec::zero_extend(unsigned int size) const
 {
   auto res = isl_vec_zero_extend(copy(), size);
   return manage(res);
