diff --git a/src/ast/rewriter/cached_var_subst.h b/src/ast/rewriter/cached_var_subst.h index 2675f46ce..ad9364967 100644 --- a/src/ast/rewriter/cached_var_subst.h +++ b/src/ast/rewriter/cached_var_subst.h @@ -29,7 +29,7 @@ class cached_var_subst { }; struct key_hash_proc { unsigned operator()(key * k) const { - return string_hash(reinterpret_cast(k->m_bindings), sizeof(expr *) * k->m_num_bindings, k->m_qa->get_id()); + return string_hash(std::string_view(reinterpret_cast(k->m_bindings), sizeof(expr *) * k->m_num_bindings), k->m_qa->get_id()); } }; struct key_eq_proc { diff --git a/src/ast/sls/sls_seq_plugin.cpp b/src/ast/sls/sls_seq_plugin.cpp index f5fec948a..0221e9f1d 100644 --- a/src/ast/sls/sls_seq_plugin.cpp +++ b/src/ast/sls/sls_seq_plugin.cpp @@ -103,7 +103,7 @@ namespace sls { struct zstring_hash_proc { unsigned operator()(zstring const & s) const { auto str = s.encode(); - return string_hash(str.c_str(), static_cast(s.length()), 17); + return string_hash(std::string_view(str), 17); } }; diff --git a/src/math/lp/emonics.h b/src/math/lp/emonics.h index 7038018da..52b07cbb3 100644 --- a/src/math/lp/emonics.h +++ b/src/math/lp/emonics.h @@ -60,7 +60,7 @@ class emonics { unsigned operator()(lpvar v) const { auto const& vec = v != UINT_MAX? em.m_monics[em.m_var2index[v]].rvars() : em.m_find_key; - return string_hash(reinterpret_cast(vec.data()), sizeof(lpvar)*vec.size(), 10); + return string_hash(std::string_view(reinterpret_cast(vec.data()), sizeof(lpvar)*vec.size()), 10); } }; diff --git a/src/math/polynomial/polynomial.cpp b/src/math/polynomial/polynomial.cpp index 006b35df5..8228f8d84 100644 --- a/src/math/polynomial/polynomial.cpp +++ b/src/math/polynomial/polynomial.cpp @@ -168,7 +168,7 @@ namespace polynomial { } public: static unsigned hash_core(unsigned sz, power const * pws) { - return string_hash(reinterpret_cast(const_cast(pws)), sz*sizeof(power), 11); + return string_hash(std::string_view(reinterpret_cast(const_cast(pws)), sz*sizeof(power)), 11); } struct hash_proc { diff --git a/src/muz/base/dl_util.h b/src/muz/base/dl_util.h index 0eb88d91b..51fe71a0d 100644 --- a/src/muz/base/dl_util.h +++ b/src/muz/base/dl_util.h @@ -63,7 +63,7 @@ namespace datalog { struct std_string_hash_proc { unsigned operator()(const std::string & s) const - { return string_hash(s.c_str(), static_cast(s.length()), 17); } + { return string_hash(std::string_view(s), 17); } }; // typedef int_hashtable > idx_set; diff --git a/src/muz/rel/dl_sparse_table.h b/src/muz/rel/dl_sparse_table.h index 73e877401..330e4d440 100644 --- a/src/muz/rel/dl_sparse_table.h +++ b/src/muz/rel/dl_sparse_table.h @@ -121,7 +121,7 @@ namespace datalog { offset_hash_proc(storage & s, unsigned unique_entry_sz) : m_storage(s), m_unique_entry_size(unique_entry_sz) {} unsigned operator()(store_offset ofs) const { - return string_hash(m_storage.data()+ofs, m_unique_entry_size, 0); + return string_hash(std::string_view(m_storage.data()+ofs, m_unique_entry_size), 0); } }; diff --git a/src/sat/sat_proof_trim.h b/src/sat/sat_proof_trim.h index 11e460eb6..bf51a5dec 100644 --- a/src/sat/sat_proof_trim.h +++ b/src/sat/sat_proof_trim.h @@ -40,7 +40,7 @@ namespace sat { struct hash { unsigned operator()(literal_vector const& v) const { - return string_hash((char const*)v.begin(), v.size()*sizeof(literal), 3); + return string_hash(std::string_view((char const*)v.begin(), v.size()*sizeof(literal)), 3); } }; struct eq { diff --git a/src/sat/smt/bv_solver.cpp b/src/sat/smt/bv_solver.cpp index fac5db9f4..626106c37 100644 --- a/src/sat/smt/bv_solver.cpp +++ b/src/sat/smt/bv_solver.cpp @@ -711,7 +711,7 @@ namespace bv { hash(solver& s) :s(s) {} bool operator()(theory_var v) const { literal_vector const& a = s.m_bits[v]; - return string_hash(reinterpret_cast(a.data()), a.size() * sizeof(sat::literal), 3); + return string_hash(std::string_view(reinterpret_cast(a.data()), a.size() * sizeof(sat::literal)), 3); } }; eq eq_proc(*this); diff --git a/src/tactic/arith/bv2real_rewriter.h b/src/tactic/arith/bv2real_rewriter.h index 4c3c63c2a..9e10d6de5 100644 --- a/src/tactic/arith/bv2real_rewriter.h +++ b/src/tactic/arith/bv2real_rewriter.h @@ -48,7 +48,7 @@ class bv2real_util { struct bvr_hash { unsigned operator()(bvr_sig const& x) const { unsigned a[3] = { x.m_msz, x.m_nsz, x.m_d.hash() }; - return string_hash((char const*)a, 12, x.m_r.hash()); + return string_hash(std::string_view((char const*)a, 12), x.m_r.hash()); } }; diff --git a/src/util/bit_vector.cpp b/src/util/bit_vector.cpp index 41113f127..7c0a27ddf 100644 --- a/src/util/bit_vector.cpp +++ b/src/util/bit_vector.cpp @@ -223,7 +223,7 @@ bool bit_vector::contains(bit_vector const& other) const { } unsigned bit_vector::get_hash() const { - return string_hash(reinterpret_cast(m_data), size()/8, 0); + return string_hash(std::string_view(reinterpret_cast(m_data), size()/8), 0); } bit_vector& bit_vector::neg() { diff --git a/src/util/fixed_bit_vector.cpp b/src/util/fixed_bit_vector.cpp index 2a2d013a9..4354eef64 100644 --- a/src/util/fixed_bit_vector.cpp +++ b/src/util/fixed_bit_vector.cpp @@ -137,7 +137,7 @@ bool fixed_bit_vector_manager::equals(fixed_bit_vector const& a, fixed_bit_vecto return last_word(a) == last_word(b); } unsigned fixed_bit_vector_manager::hash(fixed_bit_vector const& src) const { - return string_hash(reinterpret_cast(src.m_data), num_bits()/8, num_bits()); + return string_hash(std::string_view(reinterpret_cast(src.m_data), num_bits()/8), num_bits()); } bool fixed_bit_vector_manager::contains(fixed_bit_vector const& a, fixed_bit_vector const& b) const { diff --git a/src/util/hash.cpp b/src/util/hash.cpp index cacf0a220..9d36dd223 100644 --- a/src/util/hash.cpp +++ b/src/util/hash.cpp @@ -29,8 +29,10 @@ static unsigned read_unsigned(const char *s) { // I'm using Bob Jenkin's hash function. // http://burtleburtle.net/bob/hash/doobs.html -unsigned string_hash(const char * str, unsigned length, unsigned init_value) { +unsigned string_hash(std::string_view str, unsigned init_value) { unsigned a, b, c, len; + const char * data = str.data(); + unsigned length = static_cast(str.length()); /* Set up the internal state */ len = length; @@ -40,49 +42,49 @@ unsigned string_hash(const char * str, unsigned length, unsigned init_value) { /*---------------------------------------- handle most of the key */ SASSERT(sizeof(unsigned) == 4); while (len >= 12) { - a += read_unsigned(str); - b += read_unsigned(str+4); - c += read_unsigned(str+8); + a += read_unsigned(data); + b += read_unsigned(data+4); + c += read_unsigned(data+8); mix(a,b,c); - str += 12; len -= 12; + data += 12; len -= 12; } /*------------------------------------- handle the last 11 bytes */ c += length; switch(len) { /* all the case statements fall through */ case 11: - c+=((unsigned)str[10]<<24); + c+=((unsigned)data[10]<<24); Z3_fallthrough; case 10: - c+=((unsigned)str[9]<<16); + c+=((unsigned)data[9]<<16); Z3_fallthrough; case 9 : - c+=((unsigned)str[8]<<8); + c+=((unsigned)data[8]<<8); Z3_fallthrough; /* the first byte of c is reserved for the length */ case 8 : - b+=((unsigned)str[7]<<24); + b+=((unsigned)data[7]<<24); Z3_fallthrough; case 7 : - b+=((unsigned)str[6]<<16); + b+=((unsigned)data[6]<<16); Z3_fallthrough; case 6 : - b+=((unsigned)str[5]<<8); + b+=((unsigned)data[5]<<8); Z3_fallthrough; case 5 : - b+=str[4]; + b+=data[4]; Z3_fallthrough; case 4 : - a+=((unsigned)str[3]<<24); + a+=((unsigned)data[3]<<24); Z3_fallthrough; case 3 : - a+=((unsigned)str[2]<<16); + a+=((unsigned)data[2]<<16); Z3_fallthrough; case 2 : - a+=((unsigned)str[1]<<8); + a+=((unsigned)data[1]<<8); Z3_fallthrough; case 1 : - a+=str[0]; + a+=data[0]; /* case 0: nothing left to add */ break; } diff --git a/src/util/hash.h b/src/util/hash.h index f32cd09ed..20f7936e1 100644 --- a/src/util/hash.h +++ b/src/util/hash.h @@ -19,6 +19,7 @@ Revision History: #pragma once #include +#include #include "util/util.h" #define mix(a,b,c) \ @@ -65,10 +66,10 @@ inline unsigned hash_u_u(unsigned a, unsigned b) { return combine_hash(hash_u(a), hash_u(b)); } -unsigned string_hash(const char * str, unsigned len, unsigned init_value); +unsigned string_hash(std::string_view str, unsigned init_value); inline unsigned unsigned_ptr_hash(unsigned const* vec, unsigned len, unsigned init_value) { - return string_hash((char const*)(vec), len*4, init_value); + return string_hash(std::string_view((char const*)(vec), len*4), init_value); } template diff --git a/src/util/id_gen.h b/src/util/id_gen.h index e5f2b3d41..8f75df99f 100644 --- a/src/util/id_gen.h +++ b/src/util/id_gen.h @@ -57,7 +57,7 @@ public: } unsigned show_hash(){ - unsigned h = string_hash((char *)&m_free_ids[0],m_free_ids.size()*sizeof(unsigned),17); + unsigned h = string_hash(std::string_view((char *)&m_free_ids[0],m_free_ids.size()*sizeof(unsigned)),17); return hash_u_u(h,m_next_id); } diff --git a/src/util/mpz.cpp b/src/util/mpz.cpp index 284c4a15e..101ed10a2 100644 --- a/src/util/mpz.cpp +++ b/src/util/mpz.cpp @@ -1862,7 +1862,7 @@ unsigned mpz_manager::hash(mpz const & a) { unsigned sz = size(a); if (sz == 1) return static_cast(digits(a)[0]); - return string_hash(reinterpret_cast(digits(a)), sz * sizeof(digit_t), 17); + return string_hash(std::string_view(reinterpret_cast(digits(a)), sz * sizeof(digit_t)), 17); #else return mpz_get_si(*a.m_ptr); #endif diff --git a/src/util/params.cpp b/src/util/params.cpp index 536869f25..751789c34 100644 --- a/src/util/params.cpp +++ b/src/util/params.cpp @@ -50,12 +50,12 @@ std::string norm_param_name(symbol const & n) { struct param_descrs::imp { struct info { - param_kind m_kind; - char const * m_descr; - char const * m_default; - char const * m_module; + param_kind m_kind; + std::string_view m_descr; + std::string_view m_default; + std::string_view m_module; - info(param_kind k, char const * descr, char const * def, char const* module): + info(param_kind k, std::string_view descr, std::string_view def, std::string_view module): m_kind(k), m_descr(descr), m_default(def), @@ -64,16 +64,16 @@ struct param_descrs::imp { info(): m_kind(CPK_INVALID), - m_descr(nullptr), - m_default(nullptr), - m_module(nullptr) { + m_descr(), + m_default(), + m_module() { } }; dictionary m_info; svector m_names; - void insert(symbol const & name, param_kind k, char const * descr, char const * def, char const* module) { + void insert(symbol const & name, param_kind k, std::string_view descr, std::string_view def, std::string_view module) { SASSERT(!name.is_numerical()); info i; if (m_info.find(name, i)) { @@ -83,6 +83,13 @@ struct param_descrs::imp { m_info.insert(name, info(k, descr, def, module)); m_names.push_back(name); } + + void insert(symbol const & name, param_kind k, char const * descr, char const * def, char const* module) { + insert(name, k, + descr ? std::string_view(descr) : std::string_view(), + def ? std::string_view(def) : std::string_view(), + module ? std::string_view(module) : std::string_view()); + } void erase(symbol const & name) { m_info.erase(name); @@ -127,25 +134,25 @@ struct param_descrs::imp { return k; } - char const* get_module(symbol const& name) const { + std::string_view get_module(symbol const& name) const { info i; if (m_info.find(name, i)) return i.m_module; - return nullptr; + return {}; } - char const * get_descr(symbol const & name) const { + std::string_view get_descr(symbol const & name) const { info i; if (m_info.find(name, i)) return i.m_descr; - return nullptr; + return {}; } - char const * get_default(symbol const & name) const { + std::string_view get_default(symbol const & name) const { info i; if (m_info.find(name, i)) return i.m_default; - return nullptr; + return {}; } unsigned size() const { @@ -190,14 +197,14 @@ struct param_descrs::imp { } info d; m_info.find(name, d); - SASSERT(d.m_descr); + SASSERT(!d.m_descr.empty()); if (markdown) out << " | " << d.m_kind << " "; else out << " (" << d.m_kind << ")"; if (markdown) { out << " | "; - for (auto ch : std::string_view(d.m_descr)) { + for (auto ch : d.m_descr) { switch (ch) { case '<': out << "<"; break; case '>': out << ">"; break; @@ -209,10 +216,10 @@ struct param_descrs::imp { out << " " << d.m_descr; if (markdown) { out << " | "; - if (d.m_default) + if (!d.m_default.empty()) out << d.m_default; } - else if (d.m_default != nullptr) + else if (!d.m_default.empty()) out << " (default: " << d.m_default << ")"; out << "\n"; } @@ -259,7 +266,8 @@ char const * param_descrs::get_descr(char const * name) const { } char const * param_descrs::get_descr(symbol const & name) const { - return m_imp->get_descr(name); + auto sv = m_imp->get_descr(name); + return sv.empty() ? nullptr : sv.data(); } char const * param_descrs::get_default(char const * name) const { @@ -267,7 +275,8 @@ char const * param_descrs::get_default(char const * name) const { } char const * param_descrs::get_default(symbol const & name) const { - return m_imp->get_default(name); + auto sv = m_imp->get_default(name); + return sv.empty() ? nullptr : sv.data(); } void param_descrs::erase(symbol const & name) { @@ -299,7 +308,8 @@ symbol param_descrs::get_param_name(unsigned i) const { } char const* param_descrs::get_module(symbol const& name) const { - return m_imp->get_module(name); + auto sv = m_imp->get_module(name); + return sv.empty() ? nullptr : sv.data(); } void param_descrs::display(std::ostream & out, unsigned indent, bool smt2_style, bool include_descr) const { diff --git a/src/util/str_hashtable.h b/src/util/str_hashtable.h index 2934c7146..2726f1097 100644 --- a/src/util/str_hashtable.h +++ b/src/util/str_hashtable.h @@ -24,7 +24,7 @@ Revision History: #include "util/hash.h" struct str_hash_proc { - unsigned operator()(char const * s) const { return string_hash(s, static_cast(strlen(s)), 17); } + unsigned operator()(char const * s) const { return string_hash(std::string_view(s), 17); } }; struct str_eq_proc { bool operator()(char const * s1, char const * s2) const { return strcmp(s1, s2) == 0; } }; typedef ptr_hashtable str_hashtable; diff --git a/src/util/symbol.cpp b/src/util/symbol.cpp index 5f8c6ca30..1862da3e1 100644 --- a/src/util/symbol.cpp +++ b/src/util/symbol.cpp @@ -109,7 +109,7 @@ struct internal_symbol_tables { } char const * get_str(char const * d) { - auto* table = tables[string_hash(d, static_cast(strlen(d)), 251) % sz]; + auto* table = tables[string_hash(std::string_view(d), 251) % sz]; return table->get_str(d); } }; diff --git a/src/util/trace.cpp b/src/util/trace.cpp index c9b715d5d..7b965524e 100644 --- a/src/util/trace.cpp +++ b/src/util/trace.cpp @@ -105,9 +105,9 @@ static const tag_info* get_tag_infos() { } -static size_t levenshtein_distance(const char* s, const char* t) { - size_t len_s = strlen(s); - size_t len_t = strlen(t); +static size_t levenshtein_distance(std::string_view s, std::string_view t) { + size_t len_s = s.length(); + size_t len_t = t.length(); std::vector prev(len_t + 1), curr(len_t + 1); for (size_t j = 0; j <= len_t; ++j) @@ -124,19 +124,19 @@ static size_t levenshtein_distance(const char* s, const char* t) { return prev[len_t]; } -static bool has_overlap(char const* s, char const* t, size_t k) { +static bool has_overlap(std::string_view s, std::string_view t, size_t k) { // Consider overlap if Levenshtein distance is <= k return levenshtein_distance(s, t) <= k; } -void enable_trace(const char * tag_str) { - TraceTag tag = find_trace_tag_by_string(tag_str); - size_t k = strlen(tag_str); - +void enable_trace(std::string_view tag_str) { + std::string tag_string(tag_str); // Convert to std::string for null-termination + TraceTag tag = find_trace_tag_by_string(tag_string.c_str()); + size_t k = tag_str.length(); if (tag == TraceTag::Count) { - warning_msg("trace tag '%s' does not exist", tag_str); + warning_msg("trace tag '%s' does not exist", tag_string.c_str()); #define X(tag_class, tag, desc) k = std::min(levenshtein_distance(#tag, tag_str), k); #include "util/trace_tags.def" #undef X @@ -163,8 +163,9 @@ void enable_all_trace(bool flag) { g_enable_all_trace_tags = flag; } -void disable_trace(const char * tag) { - TraceTag tag_str = find_trace_tag_by_string(tag); +void disable_trace(std::string_view tag) { + std::string tag_string(tag); // Convert to std::string for null-termination + TraceTag tag_str = find_trace_tag_by_string(tag_string.c_str()); disable_tag(tag_str); } diff --git a/src/util/trace.h b/src/util/trace.h index 24eb392f0..4fa3f8a11 100644 --- a/src/util/trace.h +++ b/src/util/trace.h @@ -20,6 +20,7 @@ Revision History: #pragma once #include +#include #include "trace_tags.h" #ifdef SINGLE_THREAD @@ -53,9 +54,9 @@ void verbose_unlock(); extern std::ofstream tout; #define TRACE_CODE(CODE) { CODE } ((void) 0 ) -void enable_trace(const char * tag); +void enable_trace(std::string_view tag); void enable_all_trace(bool flag); -void disable_trace(const char * tag); +void disable_trace(std::string_view tag); bool is_trace_enabled(TraceTag tag); void close_trace(); void open_trace(); @@ -63,9 +64,9 @@ void open_trace(); #else #define TRACE_CODE(CODE) ((void) 0) -static inline void enable_trace(const char * tag) {} +static inline void enable_trace(std::string_view tag) {} static inline void enable_all_trace(bool flag) {} -static inline void disable_trace(const char * tag) {} +static inline void disable_trace(std::string_view tag) {} static inline bool is_trace_enabled(TraceTag tag) { return false; } static inline void close_trace() {} static inline void open_trace() {}