diff --git a/src/util/dstring.h b/src/util/dstring.h index ae25a395071..d7b2c76409d 100644 --- a/src/util/dstring.h +++ b/src/util/dstring.h @@ -46,13 +46,13 @@ class dstringt final // this one is not safe for static objects // NOLINTNEXTLINE(runtime/explicit) - dstringt(const char *s):no(string_container[s]) + dstringt(const char *s):no(get_string_container()[s]) { } // this one is not safe for static objects // NOLINTNEXTLINE(runtime/explicit) - dstringt(const std::string &s):no(string_container[s]) + dstringt(const std::string &s):no(get_string_container()[s]) { } @@ -152,12 +152,12 @@ class dstringt final // the reference returned is guaranteed to be stable const std::string &as_string() const - { return string_container.get_string(no); } + { return get_string_container().get_string(no); } }; // the reference returned is guaranteed to be stable inline const std::string &as_string(const dstringt &s) -{ return string_container.get_string(s.get_no()); } +{ return get_string_container().get_string(s.get_no()); } // NOLINTNEXTLINE(readability/identifiers) struct dstring_hash diff --git a/src/util/irep_ids.cpp b/src/util/irep_ids.cpp index abded937922..5151cd92fed 100644 --- a/src/util/irep_ids.cpp +++ b/src/util/irep_ids.cpp @@ -43,14 +43,15 @@ const char *irep_ids_table[]= #include "irep_ids.def" // NOLINT(build/include) -void initialize_string_container() +string_containert::string_containert() { - // this is called by the constructor of string_containert + // pre-allocate empty string -- this gets index 0 + get(""); + // allocate strings for(unsigned i=0; irep_ids_table[i]!=nullptr; i++) { - unsigned x; - x=string_container[irep_ids_table[i]]; + unsigned x=operator[](irep_ids_table[i]); INVARIANT(x==i, "i-th element is inserted at position i"); // sanity check } } diff --git a/src/util/string_container.cpp b/src/util/string_container.cpp index 8793666506a..4a8cee9b54a 100644 --- a/src/util/string_container.cpp +++ b/src/util/string_container.cpp @@ -13,8 +13,6 @@ Author: Daniel Kroening, kroening@kroening.com #include -string_containert string_container; - string_ptrt::string_ptrt(const char *_s):s(_s), len(strlen(_s)) { } @@ -27,17 +25,6 @@ bool string_ptrt::operator==(const string_ptrt &other) const return len==0 || memcmp(s, other.s, len)==0; } -void initialize_string_container(); - -string_containert::string_containert() -{ - // pre-allocate empty string -- this gets index 0 - get(""); - - // allocate strings - initialize_string_container(); -} - string_containert::~string_containert() { } @@ -87,3 +74,10 @@ unsigned string_containert::get(const std::string &s) return r; } + +/// Get a reference to the global string container. +string_containert &get_string_container() +{ + static string_containert ret; + return ret; +} diff --git a/src/util/string_container.h b/src/util/string_container.h index 59a5daff0b8..eca7d89bea3 100644 --- a/src/util/string_container.h +++ b/src/util/string_container.h @@ -89,7 +89,6 @@ class string_containert string_vectort string_vector; }; -// an ugly global object -extern string_containert string_container; +string_containert &get_string_container(); #endif // CPROVER_UTIL_STRING_CONTAINER_H