mirror of
https://github.com/Z3Prover/z3
synced 2025-04-14 21:08:46 +00:00
prepare for std::vector
This commit is contained in:
parent
831afa8124
commit
770c79a939
|
@ -1025,8 +1025,10 @@ namespace dd {
|
||||||
max_d = std::max(d, max_d);
|
max_d = std::max(d, max_d);
|
||||||
m_todo.pop_back();
|
m_todo.pop_back();
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
m_todo.push_back(lo(r)).push_back(hi(r));
|
m_todo.push_back(lo(r));
|
||||||
|
m_todo.push_back(hi(r));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return max_d;
|
return max_d;
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,7 +89,7 @@ class hilbert_basis {
|
||||||
reslimit& m_limit;
|
reslimit& m_limit;
|
||||||
vector<num_vector> m_ineqs; // set of asserted inequalities
|
vector<num_vector> m_ineqs; // set of asserted inequalities
|
||||||
bool_vector m_iseq; // inequalities that are equalities
|
bool_vector m_iseq; // inequalities that are equalities
|
||||||
num_vector m_store; // store of vectors
|
mutable num_vector m_store; // store of vectors
|
||||||
svector<offset_t> m_basis; // vector of current basis
|
svector<offset_t> m_basis; // vector of current basis
|
||||||
svector<offset_t> m_free_list; // free list of unused storage
|
svector<offset_t> m_free_list; // free list of unused storage
|
||||||
svector<offset_t> m_active; // active set
|
svector<offset_t> m_active; // active set
|
||||||
|
|
|
@ -4096,7 +4096,7 @@ namespace polynomial {
|
||||||
// select a new random value in GF(p) that is not in vals, and store it in r
|
// select a new random value in GF(p) that is not in vals, and store it in r
|
||||||
void peek_fresh(scoped_numeral_vector const & vals, unsigned p, scoped_numeral & r) {
|
void peek_fresh(scoped_numeral_vector const & vals, unsigned p, scoped_numeral & r) {
|
||||||
SASSERT(vals.size() < p); // otherwise we can't keep the fresh value
|
SASSERT(vals.size() < p); // otherwise we can't keep the fresh value
|
||||||
unsigned sz = vals.size();
|
auto sz = vals.size();
|
||||||
while (true) {
|
while (true) {
|
||||||
m().set(r, rand() % p);
|
m().set(r, rand() % p);
|
||||||
// check if fresh value...
|
// check if fresh value...
|
||||||
|
@ -6240,7 +6240,7 @@ namespace polynomial {
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset() {
|
void reset() {
|
||||||
unsigned sz = m_xs.size();
|
auto sz = m_xs.size();
|
||||||
for (unsigned i = 0; i < sz; i++) {
|
for (unsigned i = 0; i < sz; i++) {
|
||||||
m_max_degree[m_xs[i]] = 0;
|
m_max_degree[m_xs[i]] = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2126,7 +2126,7 @@ namespace upolynomial {
|
||||||
}
|
}
|
||||||
frame_stack.push_back(drs_frame(parent_idx, sz, true));
|
frame_stack.push_back(drs_frame(parent_idx, sz, true));
|
||||||
// right child
|
// right child
|
||||||
translate(sz, p_stack.end() - sz, p_aux);
|
translate(sz, p_stack.data() + p_stack.size() - sz, p_aux);
|
||||||
normalize(p_aux);
|
normalize(p_aux);
|
||||||
for (unsigned i = 0; i < sz; i++) {
|
for (unsigned i = 0; i < sz; i++) {
|
||||||
p_stack.push_back(numeral());
|
p_stack.push_back(numeral());
|
||||||
|
@ -2226,7 +2226,7 @@ namespace upolynomial {
|
||||||
drs_frame & fr = frame_stack.back();
|
drs_frame & fr = frame_stack.back();
|
||||||
unsigned sz = fr.m_size;
|
unsigned sz = fr.m_size;
|
||||||
SASSERT(sz <= p_stack.size());
|
SASSERT(sz <= p_stack.size());
|
||||||
numeral const * p = p_stack.end() - sz;
|
numeral const * p = p_stack.data() + p_stack.size() - sz;
|
||||||
TRACE("upolynomial", tout << "processing frame #" << frame_stack.size() - 1 << "\n"
|
TRACE("upolynomial", tout << "processing frame #" << frame_stack.size() - 1 << "\n"
|
||||||
<< "first: " << fr.m_first << ", left: " << fr.m_left << ", sz: " << fr.m_size << ", parent_idx: ";
|
<< "first: " << fr.m_first << ", left: " << fr.m_left << ", sz: " << fr.m_size << ", parent_idx: ";
|
||||||
if (fr.m_parent_idx == UINT_MAX) tout << "<null>"; else tout << fr.m_parent_idx;
|
if (fr.m_parent_idx == UINT_MAX) tout << "<null>"; else tout << fr.m_parent_idx;
|
||||||
|
|
|
@ -139,7 +139,7 @@ public:
|
||||||
if (empty()) {
|
if (empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
memset(m_value2indices.begin(), 0, sizeof(int) * m_value2indices.size());
|
memset(m_value2indices.data(), 0, sizeof(int) * m_value2indices.size());
|
||||||
m_values.reset();
|
m_values.reset();
|
||||||
m_values.push_back(-1);
|
m_values.push_back(-1);
|
||||||
CASSERT("heap", check_invariant());
|
CASSERT("heap", check_invariant());
|
||||||
|
@ -244,11 +244,11 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator begin() {
|
iterator begin() {
|
||||||
return m_values.begin() + 1;
|
return m_values.data() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator end() {
|
iterator end() {
|
||||||
return m_values.end();
|
return m_values.data() + m_values.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
const_iterator begin() const {
|
const_iterator begin() const {
|
||||||
|
|
|
@ -112,7 +112,7 @@ class mpff_manager {
|
||||||
|
|
||||||
unsigned m_precision; //!< Number of words in the significand. Must be an even number.
|
unsigned m_precision; //!< Number of words in the significand. Must be an even number.
|
||||||
unsigned m_precision_bits; //!< Number of bits in the significand. Must be 32*m_precision.
|
unsigned m_precision_bits; //!< Number of bits in the significand. Must be 32*m_precision.
|
||||||
unsigned_vector m_significands; //!< Array containing all significands.
|
mutable unsigned_vector m_significands; //!< Array containing all significands.
|
||||||
unsigned m_capacity; //!< Number of significands that can be stored in m_significands.
|
unsigned m_capacity; //!< Number of significands that can be stored in m_significands.
|
||||||
bool m_to_plus_inf; //!< If True, then round to plus infinity, otherwise to minus infinity
|
bool m_to_plus_inf; //!< If True, then round to plus infinity, otherwise to minus infinity
|
||||||
id_gen m_id_gen;
|
id_gen m_id_gen;
|
||||||
|
|
|
@ -258,7 +258,7 @@ void mpfx_manager::set_core(mpfx & n, mpz_manager<SYNCH> & m, mpz const & v) {
|
||||||
m_tmp_digits.reset();
|
m_tmp_digits.reset();
|
||||||
allocate_if_needed(n);
|
allocate_if_needed(n);
|
||||||
n.m_sign = m.decompose(v, m_tmp_digits);
|
n.m_sign = m.decompose(v, m_tmp_digits);
|
||||||
unsigned sz = m_tmp_digits.size();
|
auto sz = m_tmp_digits.size();
|
||||||
if (sz > m_int_part_sz)
|
if (sz > m_int_part_sz)
|
||||||
throw overflow_exception();
|
throw overflow_exception();
|
||||||
unsigned * w = words(n);
|
unsigned * w = words(n);
|
||||||
|
@ -299,7 +299,7 @@ void mpfx_manager::set_core(mpfx & n, mpq_manager<SYNCH> & m, mpq const & v) {
|
||||||
}
|
}
|
||||||
m_tmp_digits.reset();
|
m_tmp_digits.reset();
|
||||||
m.decompose(tmp, m_tmp_digits);
|
m.decompose(tmp, m_tmp_digits);
|
||||||
unsigned sz = m_tmp_digits.size();
|
auto sz = m_tmp_digits.size();
|
||||||
if (sz > m_total_sz)
|
if (sz > m_total_sz)
|
||||||
throw overflow_exception();
|
throw overflow_exception();
|
||||||
unsigned * w = words(n);
|
unsigned * w = words(n);
|
||||||
|
|
|
@ -81,11 +81,11 @@ class mpfx_manager {
|
||||||
unsigned m_int_part_sz;
|
unsigned m_int_part_sz;
|
||||||
unsigned m_frac_part_sz;
|
unsigned m_frac_part_sz;
|
||||||
unsigned m_total_sz; //!< == m_int_part_sz + m_frac_part_sz
|
unsigned m_total_sz; //!< == m_int_part_sz + m_frac_part_sz
|
||||||
unsigned_vector m_words; //!< Array containing all words
|
mutable unsigned_vector m_words; //!< Array containing all words
|
||||||
unsigned m_capacity; //!< Number of mpfx numerals that can be stored in m_words.
|
unsigned m_capacity; //!< Number of mpfx numerals that can be stored in m_words.
|
||||||
bool m_to_plus_inf; //!< If True, then round to plus infinity, otherwise to minus infinity
|
bool m_to_plus_inf; //!< If True, then round to plus infinity, otherwise to minus infinity
|
||||||
id_gen m_id_gen;
|
id_gen m_id_gen;
|
||||||
unsigned_vector m_buffer0, m_buffer1, m_buffer2;
|
mutable unsigned_vector m_buffer0, m_buffer1, m_buffer2;
|
||||||
unsigned_vector m_tmp_digits;
|
unsigned_vector m_tmp_digits;
|
||||||
mpfx m_one;
|
mpfx m_one;
|
||||||
mpn_manager m_mpn_manager;
|
mpn_manager m_mpn_manager;
|
||||||
|
|
|
@ -58,28 +58,28 @@ public:
|
||||||
ref_vector_core(ref_vector_core &&) noexcept = default;
|
ref_vector_core(ref_vector_core &&) noexcept = default;
|
||||||
|
|
||||||
~ref_vector_core() {
|
~ref_vector_core() {
|
||||||
dec_range_ref(m_nodes.begin(), m_nodes.end());
|
dec_range_ref(m_nodes.data(), m_nodes.data() + m_nodes.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset() {
|
void reset() {
|
||||||
dec_range_ref(m_nodes.begin(), m_nodes.end());
|
dec_range_ref(m_nodes.data(), m_nodes.data() + m_nodes.size());
|
||||||
m_nodes.reset();
|
m_nodes.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void finalize() {
|
void finalize() {
|
||||||
dec_range_ref(m_nodes.begin(), m_nodes.end());
|
dec_range_ref(m_nodes.data(), m_nodes.data() + m_nodes.size());
|
||||||
m_nodes.finalize();
|
m_nodes.finalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void resize(unsigned sz) {
|
void resize(unsigned sz) {
|
||||||
if (sz < m_nodes.size())
|
if (sz < m_nodes.size())
|
||||||
dec_range_ref(m_nodes.begin() + sz, m_nodes.end());
|
dec_range_ref(m_nodes.data() + sz, m_nodes.data() + m_nodes.size());
|
||||||
m_nodes.resize(sz);
|
m_nodes.resize(sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
void resize(unsigned sz, T * d) {
|
void resize(unsigned sz, T * d) {
|
||||||
if (sz < m_nodes.size()) {
|
if (sz < m_nodes.size()) {
|
||||||
dec_range_ref(m_nodes.begin() + sz, m_nodes.end());
|
dec_range_ref(m_nodes.data() + sz, m_nodes.data() + m_nodes.size());
|
||||||
m_nodes.shrink(sz);
|
m_nodes.shrink(sz);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -130,11 +130,11 @@ public:
|
||||||
|
|
||||||
T * get(unsigned idx, T * d) const { return m_nodes.get(idx, d); }
|
T * get(unsigned idx, T * d) const { return m_nodes.get(idx, d); }
|
||||||
|
|
||||||
T * const * data() const { return m_nodes.begin(); }
|
T * const * data() const { return m_nodes.data(); }
|
||||||
|
|
||||||
typedef T* const* iterator;
|
typedef T* const* iterator;
|
||||||
|
|
||||||
T ** data() { return m_nodes.begin(); }
|
T ** data() { return m_nodes.data(); }
|
||||||
|
|
||||||
unsigned hash() const {
|
unsigned hash() const {
|
||||||
unsigned sz = size();
|
unsigned sz = size();
|
||||||
|
|
|
@ -39,7 +39,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset() {
|
void reset() {
|
||||||
unsigned sz = this->size();
|
auto sz = this->size();
|
||||||
for (unsigned i = 0; i < sz; i++) {
|
for (unsigned i = 0; i < sz; i++) {
|
||||||
m().del(this->operator[](i));
|
m().del(this->operator[](i));
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ public:
|
||||||
|
|
||||||
// Insert in the this object the elements in the set source.
|
// Insert in the this object the elements in the set source.
|
||||||
uint_set & operator |=(const uint_set & source) {
|
uint_set & operator |=(const uint_set & source) {
|
||||||
unsigned source_size = source.size();
|
auto source_size = source.size();
|
||||||
if (source_size > size()) {
|
if (source_size > size()) {
|
||||||
resize(source_size + 1);
|
resize(source_size + 1);
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
uint_set& operator &=(const uint_set& source) {
|
uint_set& operator &=(const uint_set& source) {
|
||||||
unsigned source_size = source.size();
|
auto source_size = source.size();
|
||||||
if (source_size < size()) {
|
if (source_size < size()) {
|
||||||
resize(source_size);
|
resize(source_size);
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const uint_set & source) const {
|
bool operator==(const uint_set & source) const {
|
||||||
unsigned min_size = size();
|
auto min_size = size();
|
||||||
if (source.size() < min_size) {
|
if (source.size() < min_size) {
|
||||||
min_size = source.size();
|
min_size = source.size();
|
||||||
}
|
}
|
||||||
|
@ -111,12 +111,12 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (unsigned i = min_size; i < size(); ++i) {
|
for (auto i = min_size; i < size(); ++i) {
|
||||||
if ((*this)[i]) {
|
if ((*this)[i]) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (unsigned i = min_size; i < source.size(); ++i) {
|
for (auto i = min_size; i < source.size(); ++i) {
|
||||||
if (source[i]) {
|
if (source[i]) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ public:
|
||||||
|
|
||||||
// Return true if the this set is a subset of source.
|
// Return true if the this set is a subset of source.
|
||||||
bool subset_of(const uint_set & source) const {
|
bool subset_of(const uint_set & source) const {
|
||||||
unsigned min_size = size();
|
auto min_size = size();
|
||||||
if (source.size() < min_size) {
|
if (source.size() < min_size) {
|
||||||
min_size = source.size();
|
min_size = source.size();
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (unsigned i = min_size; i < size(); ++i) {
|
for (auto i = min_size; i < size(); ++i) {
|
||||||
if ((*this)[i]) {
|
if ((*this)[i]) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -252,7 +252,7 @@ public:
|
||||||
void remove(unsigned v) {
|
void remove(unsigned v) {
|
||||||
if (contains(v)) {
|
if (contains(v)) {
|
||||||
m_in_set[v] = false;
|
m_in_set[v] = false;
|
||||||
unsigned i = m_set.size();
|
auto i = m_set.size();
|
||||||
for (; i > 0 && m_set[--i] != v; )
|
for (; i > 0 && m_set[--i] != v; )
|
||||||
;
|
;
|
||||||
SASSERT(m_set[i] == v);
|
SASSERT(m_set[i] == v);
|
||||||
|
@ -282,7 +282,7 @@ public:
|
||||||
iterator end() const { return m_set.end(); }
|
iterator end() const { return m_set.end(); }
|
||||||
// void reset() { m_set.reset(); m_in_set.reset(); }
|
// void reset() { m_set.reset(); m_in_set.reset(); }
|
||||||
void reset() {
|
void reset() {
|
||||||
unsigned sz = m_set.size();
|
auto sz = m_set.size();
|
||||||
for (unsigned i = 0; i < sz; ++i) m_in_set[m_set[i]] = false;
|
for (unsigned i = 0; i < sz; ++i) m_in_set[m_set[i]] = false;
|
||||||
m_set.reset();
|
m_set.reset();
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,115 @@ Revision History:
|
||||||
#pragma warning(disable:4127)
|
#pragma warning(disable:4127)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
// portability guide to std::vector.
|
||||||
|
// memory allocator should be based on memory_allocator<T>
|
||||||
|
//
|
||||||
|
// template<typename T>
|
||||||
|
// struct memory_allocator {
|
||||||
|
// typedef T value_type;
|
||||||
|
// etc (interface seems to change between C++17, 20 versions)
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
template<typename T, bool CallDestructors=true, typename SZ = unsigned>
|
||||||
|
class vector : public std::vector<T> {
|
||||||
|
public:
|
||||||
|
typedef T data_t;
|
||||||
|
typedef typename std::vector<T>::iterator iterator;
|
||||||
|
|
||||||
|
vector() {}
|
||||||
|
vector(SZ s) {
|
||||||
|
// resize(s, T());
|
||||||
|
}
|
||||||
|
vector(SZ s, T const& e) {
|
||||||
|
// resize(s, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
vector(SZ s, T const* e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset() { clear(); }
|
||||||
|
void finalize() { clear(); }
|
||||||
|
void reserve(SZ s, T const & d) {
|
||||||
|
if (s > size())
|
||||||
|
resize(s, d);
|
||||||
|
}
|
||||||
|
void reserve(SZ s) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void setx(SZ idx, T const & elem, T const & d) {
|
||||||
|
if (idx >= size())
|
||||||
|
resize(idx+1, d);
|
||||||
|
(*this)[idx] = elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
T const & get(SZ idx, T const & d) const {
|
||||||
|
if (idx >= size()) {
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
return (*this)[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert(T const & elem) {
|
||||||
|
push_back(elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
void erase(iterator pos) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void erase(T const& e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
void fill(T const & elem) {
|
||||||
|
for (auto& e : *this)
|
||||||
|
e = elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fill(unsigned sz, T const & elem) {
|
||||||
|
resize(sz);
|
||||||
|
fill(elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
void shrink(SZ s) {
|
||||||
|
resize(s);
|
||||||
|
}
|
||||||
|
void reverse() {
|
||||||
|
SZ sz = size();
|
||||||
|
for (SZ i = 0; i < sz/2; ++i) {
|
||||||
|
std::swap((*this)[i], (*this)[sz-i-1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void append(vector<T, CallDestructors> const & other) {
|
||||||
|
for(SZ i = 0; i < other.size(); ++i) {
|
||||||
|
push_back(other[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void append(unsigned n, T const* elems) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool contains(T const & elem) const {
|
||||||
|
for (auto const& e : *this)
|
||||||
|
if (e == elem)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
template<typename T, bool CallDestructors=true, typename SZ = unsigned>
|
template<typename T, bool CallDestructors=true, typename SZ = unsigned>
|
||||||
class vector {
|
class vector {
|
||||||
#define SIZE_IDX -1
|
#define SIZE_IDX -1
|
||||||
|
@ -602,6 +711,8 @@ public:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class ptr_vector : public vector<T *, false> {
|
class ptr_vector : public vector<T *, false> {
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in a new issue