#pragma once
#include "ast/ast.h"
#include <functional>
class term_enumeration {
struct imp;
imp* m_imp;
public:
term_enumeration(ast_manager& m);
~term_enumeration();
void add_production(func_decl* f);
void add_production(expr* e);
void set_cost(std::function<unsigned(expr*)> const& cost);
class iterator {
struct iter_imp;
iter_imp* m_imp;
public:
iterator(imp& i, sort* s);
iterator(std::nullptr_t);
~iterator();
expr* operator*();
iterator operator++(int);
iterator& operator++();
bool operator!=(iterator const& other) const {
return !(*this == other);
}
bool operator==(iterator const &other) const;
};
class terms {
imp* m_imp;
sort* m_sort;
public:
terms(imp* i, sort* s);
iterator begin();
iterator end();
};
terms enum_terms(sort* s);
class tuple_iterator {
struct timp;
timp* m_imp;
public:
tuple_iterator(imp& i, unsigned n, sort* const* sorts);
tuple_iterator(std::nullptr_t);
~tuple_iterator();
expr_ref_vector operator*();
tuple_iterator& operator++();
bool operator!=(tuple_iterator const& other) const {
return !(*this == other);
}
bool operator==(tuple_iterator const& other) const;
};
class tuples {
imp* m_imp;
ptr_vector<sort> m_sorts;
public:
tuples(imp* i, unsigned n, sort* const* sorts);
tuple_iterator begin();
tuple_iterator end();
};
tuples enum_tuples(unsigned n, sort* const* sorts);
tuples enum_tuples(sort_ref_vector const& sorts);
std::ostream& display(std::ostream& out) const;
};