diff --git a/src/analyses/goto_rw.h b/src/analyses/goto_rw.h index 1f92c3e0e14..e53945243c0 100644 --- a/src/analyses/goto_rw.h +++ b/src/analyses/goto_rw.h @@ -44,6 +44,14 @@ void goto_rw(const goto_functionst &goto_functions, class range_domain_baset { public: + range_domain_baset()=default; + + range_domain_baset(const range_domain_baset &rhs)=delete; + range_domain_baset &operator=(const range_domain_baset &rhs)=delete; + + range_domain_baset(range_domain_baset &&rhs)=delete; + range_domain_baset &operator=(range_domain_baset &&rhs)=delete; + virtual ~range_domain_baset(); virtual void output(const namespacet &ns, std::ostream &out) const=0; @@ -61,12 +69,29 @@ inline range_spect to_range_spect(const mp_integer &size) } // each element x represents a range of bits [x.first, x.second.first) -class range_domaint: - public range_domain_baset, - public std::list > +class range_domaint:public range_domain_baset { + typedef std::list> sub_typet; + sub_typet data; + public: - virtual void output(const namespacet &ns, std::ostream &out) const; + void output(const namespacet &ns, std::ostream &out) const override; + + // NOLINTNEXTLINE(readability/identifiers) + typedef sub_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef sub_typet::const_iterator const_iterator; + + iterator begin() { return data.begin(); } + const_iterator begin() const { return data.begin(); } + const_iterator cbegin() const { return data.begin(); } + + iterator end() { return data.end(); } + const_iterator end() const { return data.end(); } + const_iterator cend() const { return data.end(); } + + template + void push_back(T &&v) { data.push_back(std::forward(v)); } }; class array_exprt; @@ -257,12 +282,29 @@ class rw_range_set_value_sett:public rw_range_sett const range_spect &size); }; -class guarded_range_domaint: - public range_domain_baset, - public std::multimap > +class guarded_range_domaint:public range_domain_baset { + typedef std::multimap> sub_typet; + sub_typet data; + public: - virtual void output(const namespacet &ns, std::ostream &out) const; + virtual void output(const namespacet &ns, std::ostream &out) const override; + + // NOLINTNEXTLINE(readability/identifiers) + typedef sub_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef sub_typet::const_iterator const_iterator; + + iterator begin() { return data.begin(); } + const_iterator begin() const { return data.begin(); } + const_iterator cbegin() const { return data.begin(); } + + iterator end() { return data.end(); } + const_iterator end() const { return data.end(); } + const_iterator cend() const { return data.end(); } + + template + iterator insert(T &&v) { return data.insert(std::forward(v)); } }; class rw_guarded_range_set_value_sett:public rw_range_set_value_sett diff --git a/src/analyses/local_bitvector_analysis.cpp b/src/analyses/local_bitvector_analysis.cpp index f48b34a760d..341eab33d42 100644 --- a/src/analyses/local_bitvector_analysis.cpp +++ b/src/analyses/local_bitvector_analysis.cpp @@ -41,16 +41,16 @@ void local_bitvector_analysist::flagst::print(std::ostream &out) const out << "+integer_address"; } -bool local_bitvector_analysist::loc_infot::merge(const loc_infot &src) +bool local_bitvector_analysist::merge(points_tot &a, points_tot &b) { bool result=false; std::size_t max_index= - std::max(src.points_to.size(), points_to.size()); + std::max(a.size(), b.size()); for(std::size_t i=0; isecond]; - - return get_rec(rhs, loc_info_src); + return get_rec(rhs, loc_infos[loc_it->second]); } local_bitvector_analysist::flagst local_bitvector_analysist::get_rec( const exprt &rhs, - const loc_infot &loc_info_src) + points_tot &loc_info_src) { if(rhs.id()==ID_constant) { @@ -139,7 +137,7 @@ local_bitvector_analysist::flagst local_bitvector_analysist::get_rec( if(is_tracked(identifier)) { unsigned src_pointer=pointers.number(identifier); - return loc_info_src.points_to[src_pointer]; + return loc_info_src[src_pointer]; } else return flagst::mk_unknown(); @@ -258,7 +256,7 @@ void local_bitvector_analysist::build(const goto_functiont &goto_function) // in the entry location. for(const auto &local : locals.locals_map) if(is_tracked(local.first)) - loc_infos[0].points_to[pointers.number(local.first)]=flagst::mk_unknown(); + loc_infos[0][pointers.number(local.first)]=flagst::mk_unknown(); while(!work_queue.empty()) { @@ -267,8 +265,8 @@ void local_bitvector_analysist::build(const goto_functiont &goto_function) const goto_programt::instructiont &instruction=*node.t; work_queue.pop(); - const loc_infot &loc_info_src=loc_infos[loc_nr]; - loc_infot loc_info_dest=loc_infos[loc_nr]; + auto &loc_info_src=loc_infos[loc_nr]; + auto loc_info_dest=loc_infos[loc_nr]; switch(instruction.type) { @@ -320,7 +318,7 @@ void local_bitvector_analysist::build(const goto_functiont &goto_function) for(const auto &succ : node.successors) { assert(succsource_location << "\n"; - const loc_infot &loc_info=loc_infos[l]; + const auto &loc_info=loc_infos[l]; for(points_tot::const_iterator - p_it=loc_info.points_to.begin(); - p_it!=loc_info.points_to.end(); + p_it=loc_info.begin(); + p_it!=loc_info.end(); p_it++) { - out << " " << pointers[p_it-loc_info.points_to.begin()] + out << " " << pointers[p_it-loc_info.begin()] << ": " << *p_it << "\n"; diff --git a/src/analyses/local_bitvector_analysis.h b/src/analyses/local_bitvector_analysis.h index a88b38fb1c6..4a750d8cf32 100644 --- a/src/analyses/local_bitvector_analysis.h +++ b/src/analyses/local_bitvector_analysis.h @@ -186,27 +186,20 @@ class local_bitvector_analysist // This is a vector, so it's fast. typedef expanding_vectort points_tot; - // the information tracked per program location - class loc_infot - { - public: - points_tot points_to; - - bool merge(const loc_infot &src); - }; + static bool merge(points_tot &a, points_tot &b); - typedef std::vector loc_infost; + typedef std::vector loc_infost; loc_infost loc_infos; void assign_lhs( const exprt &lhs, const exprt &rhs, - const loc_infot &loc_info_src, - loc_infot &loc_info_dest); + points_tot &loc_info_src, + points_tot &loc_info_dest); flagst get_rec( const exprt &rhs, - const loc_infot &loc_info_src); + points_tot &loc_info_src); bool is_tracked(const irep_idt &identifier); }; diff --git a/src/goto-instrument/wmm/cycle_collection.cpp b/src/goto-instrument/wmm/cycle_collection.cpp index 64b619c4369..24bceab723c 100644 --- a/src/goto-instrument/wmm/cycle_collection.cpp +++ b/src/goto-instrument/wmm/cycle_collection.cpp @@ -25,7 +25,7 @@ void event_grapht::graph_explorert::filter_thin_air( { std::set::const_iterator next=it; ++next; - critical_cyclet::const_iterator e_it=it->begin(); + auto e_it=it->begin(); /* is there an event in the cycle not in thin-air events? */ for(; e_it!=it->end(); ++e_it) if(thin_air_events.find(*e_it)==thin_air_events.end()) diff --git a/src/goto-instrument/wmm/data_dp.cpp b/src/goto-instrument/wmm/data_dp.cpp index d24b17d9651..d88f20859eb 100644 --- a/src/goto-instrument/wmm/data_dp.cpp +++ b/src/goto-instrument/wmm/data_dp.cpp @@ -13,6 +13,7 @@ Date: 2012 #include "data_dp.h" +#include #include #include "abstract_event.h" @@ -24,13 +25,13 @@ void data_dpt::dp_analysis( const datat &write, bool local_write) { - const_iterator it; + data_typet::const_iterator it; - for(it=begin(); it!=end(); ++it) + for(it=data.cbegin(); it!=data.cend(); ++it) { if(local_read && it->id==read.id) { - insert( + data.insert( datat( write.id, (local_write?source_locationt():write.loc), @@ -40,7 +41,7 @@ void data_dpt::dp_analysis( if(local_write && it->id==write.id) { - insert( + data.insert( datat( read.id, (local_read?source_locationt():read.loc), @@ -49,12 +50,12 @@ void data_dpt::dp_analysis( } } - if(it==end()) + if(it==data.cend()) { ++class_nb; - insert( + data.insert( datat(read.id, (local_read?source_locationt():read.loc), class_nb)); - insert( + data.insert( datat(write.id, (local_write?source_locationt():write.loc), class_nb)); } } @@ -71,11 +72,11 @@ void data_dpt::dp_analysis( /// search in N^2 bool data_dpt::dp(const abstract_eventt &e1, const abstract_eventt &e2) const { - for(const_iterator it1=begin(); it1!=end(); ++it1) + for(auto it1=data.cbegin(); it1!=data.cend(); ++it1) { - const_iterator it2=it1; + auto it2=it1; ++it2; - if(it2==end()) + if(it2==data.cend()) break; if(e1.local) @@ -89,7 +90,7 @@ bool data_dpt::dp(const abstract_eventt &e1, const abstract_eventt &e2) const continue; } - for(; it2!=end(); ++it2) + for(; it2!=data.cend(); ++it2) { if(e2.local) { @@ -116,42 +117,42 @@ bool data_dpt::dp(const abstract_eventt &e1, const abstract_eventt &e2) const /// merge in N^3 void data_dpt::dp_merge() { - if(size()<2) + if(data.size()<2) return; - unsigned initial_size=size(); + unsigned initial_size=data.size(); unsigned from=0; unsigned to=0; /* look for similar elements */ - for(const_iterator it1=begin(); it1!=end(); ++it1) + for(auto it1=data.cbegin(); it1!=data.cend(); ++it1) { - const_iterator it2=it1; + auto it2=it1; ++it2; /* all ok -- ends */ - if(it2==end()) + if(it2==data.cend()) return; - for(; it2!=end(); ++it2) + for(; it2!=data.cend(); ++it2) { if(it1 == it2) { from=it2->eq_class; to=it1->eq_class; - erase(it2); + data.erase(it2); break; } } } /* merge */ - for(iterator it3=begin(); it3!=end(); ++it3) + for(auto it3=data.begin(); it3!=data.end(); ++it3) if(it3->eq_class==from) it3->eq_class=to; /* strictly monotonous => converges */ - assert(initial_size>size()); + INVARIANT(initial_size>data.size(), "strictly monotonous => converges"); /* repeat until classes are disjunct */ dp_merge(); @@ -160,10 +161,10 @@ void data_dpt::dp_merge() void data_dpt::print(messaget &message) { #ifdef DEBUG - const_iterator it; + data_typet::const_iterator it; std::map > classed; - for(it=begin(); it!=end(); ++it) + for(it=data.cbegin(); it!=data.cend(); ++it) { if(classed.find(it->eq_class)==classed.end()) { diff --git a/src/goto-instrument/wmm/data_dp.h b/src/goto-instrument/wmm/data_dp.h index abd7641fb9c..bdd3e1705c6 100644 --- a/src/goto-instrument/wmm/data_dp.h +++ b/src/goto-instrument/wmm/data_dp.h @@ -48,11 +48,13 @@ struct datat } }; -class data_dpt:public std::set +class data_dpt final { -public: + typedef std::set data_typet; + data_typet data; unsigned class_nb; +public: /* add this dependency in the structure */ void dp_analysis(const abstract_eventt &read, const abstract_eventt &write); void dp_analysis( diff --git a/src/goto-instrument/wmm/event_graph.cpp b/src/goto-instrument/wmm/event_graph.cpp index d5d9df2aff4..110a3618ea2 100644 --- a/src/goto-instrument/wmm/event_graph.cpp +++ b/src/goto-instrument/wmm/event_graph.cpp @@ -1427,7 +1427,7 @@ std::string event_grapht::critical_cyclet::print_name( if(first_done) { - critical_cyclet::size_type n_events=extra_fence_count; + auto n_events=extra_fence_count; for(std::string::const_iterator it=name.begin(); it!=name.end(); ++it) diff --git a/src/goto-instrument/wmm/event_graph.h b/src/goto-instrument/wmm/event_graph.h index e77a7e92d3a..69eb502760d 100644 --- a/src/goto-instrument/wmm/event_graph.h +++ b/src/goto-instrument/wmm/event_graph.h @@ -20,6 +20,7 @@ Date: 2012 #include #include +#include #include "abstract_event.h" #include "data_dp.h" @@ -35,9 +36,11 @@ class event_grapht { public: /* critical cycle */ - class critical_cyclet:public std::list + class critical_cyclet final { - protected: + typedef std::list data_typet; + data_typet data; + event_grapht &egraph; bool is_not_uniproc() const; @@ -50,16 +53,48 @@ class event_grapht std::string print_name(const critical_cyclet &redyced, memory_modelt model) const; - bool check_AC(const_iterator s_it, const abstract_eventt &first, + bool check_AC( + data_typet::const_iterator s_it, + const abstract_eventt &first, const abstract_eventt &second) const; - bool check_BC(const_iterator it, const abstract_eventt &first, + bool check_BC( + data_typet::const_iterator it, + const abstract_eventt &first, const abstract_eventt &second) const; public: unsigned id; - bool has_user_defined_fence; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::const_iterator const_iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::value_type value_type; + + iterator begin() { return data.begin(); } + const_iterator begin() const { return data.begin(); } + const_iterator cbegin() const { return data.cbegin(); } + + iterator end() { return data.end(); } + const_iterator end() const { return data.end(); } + const_iterator cend() const { return data.cend(); } + + template + void push_front(T &&t) { data.push_front(std::forward(t)); } + + template + void push_back(T &&t) { data.push_back(std::forward(t)); } + + value_type &front() { return data.front(); } + const value_type &front() const { return data.front(); } + + value_type &back() { return data.back(); } + const value_type &back() const { return data.back(); } + + size_t size() const { return data.size(); } + critical_cyclet(event_grapht &_egraph, unsigned _id) :egraph(_egraph), id(_id), has_user_defined_fence(false) { @@ -67,23 +102,25 @@ class event_grapht void operator()(const critical_cyclet &cyc) { - clear(); - for(const_iterator it=cyc.begin(); it!=cyc.end(); it++) - push_back(*it); + data.clear(); + for(auto it=cyc.data.cbegin(); + it!=cyc.data.cend(); + ++it) + data.push_back(*it); has_user_defined_fence=cyc.has_user_defined_fence; } bool is_cycle() { /* size check */ - if(size()<4) + if(data.size()<4) return false; /* po order check */ - const_iterator it=begin(); - const_iterator n_it=it; + auto it=data.cbegin(); + auto n_it=it; ++n_it; - for(; it!=end() && n_it!=end(); ++it, ++n_it) + for(; it!=data.cend() && n_it!=data.cend(); ++it, ++n_it) { if(egraph[*it].thread==egraph[*n_it].thread && !egraph.are_po_ordered(*it, *n_it)) @@ -177,7 +214,7 @@ class event_grapht { critical_cyclet reduced(egraph, id); this->hide_internals(reduced); - assert(!reduced.empty()); + INVARIANT(!reduced.data.empty(), "reduced must not be empty"); return print_name(reduced, model); } else @@ -196,7 +233,7 @@ class event_grapht bool operator<(const critical_cyclet &other) const { - return ( ((std::list) *this) < (std::list)other); + return data > public: typedef std::size_t entryt; - struct entry_mapt: - public std::map + class entry_mapt final { + typedef std::map data_typet; + data_typet data; + + public: grapht< cfg_base_nodet > &container; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::const_iterator const_iterator; + + template + const_iterator find(U &&u) const { return data.find(std::forward(u)); } + + iterator begin() { return data.begin(); } + const_iterator begin() const { return data.begin(); } + const_iterator cbegin() const { return data.cbegin(); } + + iterator end() { return data.end(); } + const_iterator end() const { return data.end(); } + const_iterator cend() const { return data.cend(); } + explicit entry_mapt(grapht< cfg_base_nodet > &_container): container(_container) { @@ -76,7 +95,7 @@ class cfg_baset:public grapht< cfg_base_nodet > entryt &operator[](const goto_programt::const_targett &t) { - std::pair e=insert(std::make_pair(t, 0)); + auto e=data.insert(std::make_pair(t, 0)); if(e.second) e.first->second=container.add_node(); diff --git a/src/goto-programs/format_strings.h b/src/goto-programs/format_strings.h index 8c233324ecf..502acfb311a 100644 --- a/src/goto-programs/format_strings.h +++ b/src/goto-programs/format_strings.h @@ -84,9 +84,7 @@ class format_tokent irep_idt value; // for text and pattern matching }; -class format_token_listt:public std::list -{ -}; +typedef std::list format_token_listt; format_token_listt parse_format_string(const std::string &); diff --git a/src/musketeer/ilp.h b/src/musketeer/ilp.h index b8cbe4e9202..c7ce87537a5 100644 --- a/src/musketeer/ilp.h +++ b/src/musketeer/ilp.h @@ -22,26 +22,15 @@ Author: Vincent Nimal class ilpt { protected: - template - class my_vectort: public std::vector - { - public: - T *to_array() - { - /* NOTE: not valid if T==bool */ - return &(*this)[0]; - } - }; - glp_iocp parm; unsigned matrix_size; public: glp_prob *lp; - my_vectort imat; - my_vectort jmat; - my_vectort vmat; + std::vector imat; + std::vector jmat; + std::vector vmat; ilpt() { @@ -69,8 +58,8 @@ class ilpt void solve() { - glp_load_matrix(lp, matrix_size, imat.to_array(), - jmat.to_array(), vmat.to_array()); + glp_load_matrix(lp, matrix_size, imat.data(), + jmat.data(), vmat.data()); glp_intopt(lp, &parm); } }; diff --git a/src/musketeer/propagate_const_function_pointers.cpp b/src/musketeer/propagate_const_function_pointers.cpp index eca3648c285..e58efe92429 100644 --- a/src/musketeer/propagate_const_function_pointers.cpp +++ b/src/musketeer/propagate_const_function_pointers.cpp @@ -114,12 +114,25 @@ class const_function_pointer_propagationt unsigned stack_scope); /* to keep track of the constant function pointers passed as arguments */ - class arg_stackt: public std::set + class arg_stackt final { - protected: + typedef std::set data_typet; + data_typet data; const_function_pointer_propagationt &cfpp; public: + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::const_iterator const_iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::value_type value_type; + + std::pair insert(const value_type &t) + { + return data.insert(t); + } + explicit arg_stackt(const_function_pointer_propagationt &_cfpp): cfpp(_cfpp) {} @@ -415,7 +428,7 @@ void const_function_pointer_propagationt::arg_stackt::add_args( void const_function_pointer_propagationt::arg_stackt::remove_args() { /* remove the parameter names */ - for(const_iterator arg_it=begin(); arg_it!=end(); ++arg_it) + for(const_iterator arg_it=data.begin(); arg_it!=data.end(); ++arg_it) { cfpp.remove(*arg_it); cfpp.message.debug() << "SET: remove " << *arg_it << messaget::eom; diff --git a/src/pointer-analysis/value_set.cpp b/src/pointer-analysis/value_set.cpp index 28b5bf360a0..34bb8265df8 100644 --- a/src/pointer-analysis/value_set.cpp +++ b/src/pointer-analysis/value_set.cpp @@ -33,7 +33,7 @@ Author: Daniel Kroening, kroening@kroening.com #include "add_failed_symbols.h" -const value_sett::object_map_dt value_sett::object_map_dt::blank; +const value_sett::object_map_dt value_sett::object_map_dt::blank{}; object_numberingt value_sett::object_numbering; bool value_sett::field_sensitive( @@ -74,7 +74,7 @@ bool value_sett::insert( unsigned n, const objectt &object) const { - object_map_dt::const_iterator entry=dest.read().find(n); + auto entry=dest.read().find(n); if(entry==dest.read().end()) { @@ -184,9 +184,9 @@ void value_sett::output( } } -exprt value_sett::to_expr(object_map_dt::const_iterator it) const +exprt value_sett::to_expr(const object_map_dt::value_type &it) const { - const exprt &object=object_numbering[it->first]; + const exprt &object=object_numbering[it.first]; if(object.id()==ID_invalid || object.id()==ID_unknown) @@ -196,8 +196,8 @@ exprt value_sett::to_expr(object_map_dt::const_iterator it) const od.object()=object; - if(it->second.offset_is_set) - od.offset()=from_integer(it->second.offset, index_type()); + if(it.second.offset_is_set) + od.offset()=from_integer(it.second.offset, index_type()); od.type()=od.object().type(); @@ -251,7 +251,7 @@ bool value_sett::make_union(object_mapt &dest, const object_mapt &src) const it!=src.read().end(); it++) { - if(insert(dest, it)) + if(insert(dest, *it)) result=true; } @@ -323,7 +323,7 @@ void value_sett::get_value_set( it=object_map.read().begin(); it!=object_map.read().end(); it++) - dest.push_back(to_expr(it)); + dest.push_back(to_expr(*it)); #if 0 for(value_setst::valuest::const_iterator it=dest.begin(); @@ -918,7 +918,7 @@ void value_sett::get_reference_set( it=object_map.read().begin(); it!=object_map.read().end(); it++) - dest.push_back(to_expr(it)); + dest.push_back(to_expr(*it)); } void value_sett::get_reference_set_rec( @@ -1267,7 +1267,7 @@ void value_sett::do_free( to_dynamic_object_expr(object); if(to_mark.count(dynamic_object.get_instance())==0) - set(new_object_map, o_it); + set(new_object_map, *o_it); else { // adjust @@ -1279,7 +1279,7 @@ void value_sett::do_free( } } else - set(new_object_map, o_it); + set(new_object_map, *o_it); } if(changed) diff --git a/src/pointer-analysis/value_set.h b/src/pointer-analysis/value_set.h index 66e4fa57ab0..f30386e8eb5 100644 --- a/src/pointer-analysis/value_set.h +++ b/src/pointer-analysis/value_set.h @@ -58,25 +58,58 @@ class value_sett { return offset_is_set && offset.is_zero(); } }; - class object_map_dt:public std::map + class object_map_dt { + typedef std::map data_typet; + data_typet data; + public: - object_map_dt() {} + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::const_iterator const_iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::value_type value_type; + + iterator begin() { return data.begin(); } + const_iterator begin() const { return data.begin(); } + const_iterator cbegin() const { return data.cbegin(); } + + iterator end() { return data.end(); } + const_iterator end() const { return data.end(); } + const_iterator cend() const { return data.cend(); } + + size_t size() const { return data.size(); } + bool empty() const { return data.empty(); } + + objectt &operator[](unsigned i) { return data[i]; } + + template + void insert(It b, It e) { data.insert(b, e); } + + template + const_iterator find(T &&t) const { return data.find(std::forward(t)); } + static const object_map_dt blank; + + object_map_dt()=default; + + protected: + ~object_map_dt()=default; }; - exprt to_expr(object_map_dt::const_iterator it) const; + exprt to_expr(const object_map_dt::value_type &it) const; typedef reference_counting object_mapt; - void set(object_mapt &dest, object_map_dt::const_iterator it) const + void set(object_mapt &dest, const object_map_dt::value_type &it) const { - dest.write()[it->first]=it->second; + dest.write()[it.first]=it.second; } - bool insert(object_mapt &dest, object_map_dt::const_iterator it) const + bool insert(object_mapt &dest, const object_map_dt::value_type &it) const { - return insert(dest, it->first, it->second); + return insert(dest, it.first, it.second); } bool insert(object_mapt &dest, const exprt &src) const diff --git a/src/pointer-analysis/value_set_fi.cpp b/src/pointer-analysis/value_set_fi.cpp index d08694b82da..968834fa9d7 100644 --- a/src/pointer-analysis/value_set_fi.cpp +++ b/src/pointer-analysis/value_set_fi.cpp @@ -25,7 +25,8 @@ Author: Daniel Kroening, kroening@kroening.com #include #include -const value_set_fit::object_map_dt value_set_fit::object_map_dt::blank; +const value_set_fit::object_map_dt value_set_fit::object_map_dt::blank{}; + object_numberingt value_set_fit::object_numbering; hash_numbering value_set_fit::function_numbering; @@ -206,11 +207,11 @@ void value_set_fit::flatten_rec( } forall_objects(oit, temp.read()) - insert(dest, oit); + insert(dest, *oit); } } else - insert(dest, it); + insert(dest, *it); } if(generalize_index) // this means we had recursive symbols in there @@ -222,9 +223,9 @@ void value_set_fit::flatten_rec( seen.erase(identifier + e.suffix); } -exprt value_set_fit::to_expr(object_map_dt::const_iterator it) const +exprt value_set_fit::to_expr(const object_map_dt::value_type &it) const { - const exprt &object=object_numbering[it->first]; + const exprt &object=object_numbering[it.first]; if(object.id()==ID_invalid || object.id()==ID_unknown) @@ -234,8 +235,8 @@ exprt value_set_fit::to_expr(object_map_dt::const_iterator it) const od.object()=object; - if(it->second.offset_is_set) - od.offset()=from_integer(it->second.offset, index_type()); + if(it.second.offset_is_set) + od.offset()=from_integer(it.second.offset, index_type()); od.type()=od.object().type(); @@ -287,7 +288,7 @@ bool value_set_fit::make_union(object_mapt &dest, const object_mapt &src) const forall_objects(it, src.read()) { - if(insert(dest, it)) + if(insert(dest, *it)) result=true; } @@ -340,7 +341,7 @@ void value_set_fit::get_value_set( } forall_objects(fit, flat_map.read()) - value_set.push_back(to_expr(fit)); + value_set.push_back(to_expr(*fit)); #if 0 // Sanity check! @@ -744,11 +745,11 @@ void value_set_fit::get_reference_set( } forall_objects(it, omt.read()) - dest.insert(to_expr(it)); + dest.insert(to_expr(*it)); } } else - dest.insert(to_expr(it)); + dest.insert(to_expr(*it)); } } @@ -761,7 +762,7 @@ void value_set_fit::get_reference_set_sharing( get_reference_set_sharing(expr, object_map, ns); forall_objects(it, object_map.read()) - dest.insert(to_expr(it)); + dest.insert(to_expr(*it)); } void value_set_fit::get_reference_set_sharing_rec( @@ -833,13 +834,13 @@ void value_set_fit::get_reference_set_sharing_rec( } forall_objects(it2, t2.read()) - insert(dest, it2); + insert(dest, *it2); } else insert(dest, exprt(ID_unknown, obj.type().subtype())); } else - insert(dest, it); + insert(dest, *it); } #if 0 @@ -1182,7 +1183,7 @@ void value_set_fit::do_free( to_dynamic_object_expr(object); if(to_mark.count(dynamic_object.get_instance())==0) - set(new_object_map, o_it); + set(new_object_map, *o_it); else { // adjust @@ -1194,7 +1195,7 @@ void value_set_fit::do_free( } } else - set(new_object_map, o_it); + set(new_object_map, *o_it); } if(changed) diff --git a/src/pointer-analysis/value_set_fi.h b/src/pointer-analysis/value_set_fi.h index cc69a4f59a8..77d4c1f54ec 100644 --- a/src/pointer-analysis/value_set_fi.h +++ b/src/pointer-analysis/value_set_fi.h @@ -71,25 +71,55 @@ class value_set_fit { return offset_is_set && offset.is_zero(); } }; - class object_map_dt:public std::map + class object_map_dt { + typedef std::map data_typet; + data_typet data; + public: - object_map_dt() {} + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::const_iterator const_iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef data_typet::value_type value_type; + + iterator begin() { return data.begin(); } + const_iterator begin() const { return data.begin(); } + const_iterator cbegin() const { return data.cbegin(); } + + iterator end() { return data.end(); } + const_iterator end() const { return data.end(); } + const_iterator cend() const { return data.cend(); } + + size_t size() const { return data.size(); } + + objectt &operator[](unsigned i) { return data[i]; } + + template + void insert(It b, It e) { data.insert(b, e); } + + template + const_iterator find(T &&t) const { return data.find(std::forward(t)); } + static const object_map_dt blank; + + protected: + ~object_map_dt()=default; }; - exprt to_expr(object_map_dt::const_iterator it) const; + exprt to_expr(const object_map_dt::value_type &it) const; typedef reference_counting object_mapt; - void set(object_mapt &dest, object_map_dt::const_iterator it) const + void set(object_mapt &dest, const object_map_dt::value_type &it) const { - dest.write()[it->first]=it->second; + dest.write()[it.first]=it.second; } - bool insert(object_mapt &dest, object_map_dt::const_iterator it) const + bool insert(object_mapt &dest, const object_map_dt::value_type &it) const { - return insert(dest, it->first, it->second); + return insert(dest, it.first, it.second); } bool insert(object_mapt &dest, const exprt &src) const diff --git a/src/util/expanding_vector.h b/src/util/expanding_vector.h index f8b0421db72..8c2af9cdb3f 100644 --- a/src/util/expanding_vector.h +++ b/src/util/expanding_vector.h @@ -13,31 +13,40 @@ Author: Daniel Kroening, kroening@kroening.com #include template -class expanding_vectort:public std::vector +class expanding_vectort { + typedef std::vector data_typet; + data_typet data; + public: + // NOLINTNEXTLINE(readability/identifiers) + typedef typename data_typet::size_type size_type; + // NOLINTNEXTLINE(readability/identifiers) + typedef typename data_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef typename data_typet::const_iterator const_iterator; + T &operator[] (typename std::vector::size_type n) { - check_index(n); - return subt::operator[](n); + if(n>=data.size()) + data.resize(n+1); + return data[n]; } - const T &operator[] (typename std::vector::size_type n) const - { - // hack-ish const cast - const_cast(this)->check_index(n); - return subt::operator[](n); - } + void clear() { data.clear(); } -protected: - typedef std::vector subt; + iterator begin() { return data.begin(); } + const_iterator begin() const { return data.begin(); } + const_iterator cbegin() const { return data.cbegin(); } - // make the vector large enough to contain 'n' - void check_index(typename std::vector::size_type n) - { - if(n>=subt::size()) - subt::resize(n+1); - } + iterator end() { return data.end(); } + const_iterator end() const { return data.end(); } + const_iterator cend() const { return data.cend(); } + + size_type size() const { return data.size(); } + + void push_back(const T &t) { data.push_back(t); } + void push_back(T &&t) { data.push_back(std::move(t)); } }; #endif // CPROVER_UTIL_EXPANDING_VECTOR_H diff --git a/src/util/numbering.h b/src/util/numbering.h index 359f3c48ed2..4e0113a117a 100644 --- a/src/util/numbering.h +++ b/src/util/numbering.h @@ -15,15 +15,30 @@ Author: Daniel Kroening, kroening@kroening.com #include #include +#include template // NOLINTNEXTLINE(readability/identifiers) -class numbering:public std::vector +class numbering final { public: // NOLINTNEXTLINE(readability/identifiers) typedef std::size_t number_type; +private: + typedef std::vector data_typet; + data_typet data; + typedef std::map numberst; + numberst numbers; + +public: + // NOLINTNEXTLINE(readability/identifiers) + typedef typename data_typet::size_type size_type; + // NOLINTNEXTLINE(readability/identifiers) + typedef typename data_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef typename data_typet::const_iterator const_iterator; + number_type number(const T &a) { std::pair result= @@ -33,8 +48,8 @@ class numbering:public std::vector if(result.second) // inserted? { - this->push_back(a); - assert(this->size()==numbers.size()); + data.push_back(a); + INVARIANT(data.size()==numbers.size(), "vector sizes must match"); } return (result.first)->second; @@ -58,25 +73,46 @@ class numbering:public std::vector void clear() { - subt::clear(); + data.clear(); numbers.clear(); } -protected: - typedef std::vector subt; + size_t size() const { return data.size(); } - typedef std::map numberst; - numberst numbers; + T &operator[](size_type t) { return data[t]; } + const T &operator[](size_type t) const { return data[t]; } + + iterator begin() { return data.begin(); } + const_iterator begin() const { return data.begin(); } + const_iterator cbegin() const { return data.cbegin(); } + + iterator end() { return data.end(); } + const_iterator end() const { return data.end(); } + const_iterator cend() const { return data.cend(); } }; template // NOLINTNEXTLINE(readability/identifiers) -class hash_numbering:public std::vector +class hash_numbering final { public: // NOLINTNEXTLINE(readability/identifiers) typedef unsigned int number_type; +private: + typedef std::vector data_typet; + data_typet data; + typedef std::unordered_map numberst; + numberst numbers; + +public: + // NOLINTNEXTLINE(readability/identifiers) + typedef typename data_typet::size_type size_type; + // NOLINTNEXTLINE(readability/identifiers) + typedef typename data_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef typename data_typet::const_iterator const_iterator; + number_type number(const T &a) { std::pair result= @@ -106,15 +142,25 @@ class hash_numbering:public std::vector void clear() { - subt::clear(); + data.clear(); numbers.clear(); } -protected: - typedef std::vector subt; + template + void push_back(U &&u) { data.push_back(std::forward(u)); } - typedef std::unordered_map numberst; - numberst numbers; + T &operator[](size_type t) { return data[t]; } + const T &operator[](size_type t) const { return data[t]; } + + size_type size() const { return data.size(); } + + iterator begin() { return data.begin(); } + const_iterator begin() const { return data.begin(); } + const_iterator cbegin() const { return data.cbegin(); } + + iterator end() { return data.end(); } + const_iterator end() const { return data.end(); } + const_iterator cend() const { return data.cend(); } }; #endif // CPROVER_UTIL_NUMBERING_H diff --git a/src/util/union_find.h b/src/util/union_find.h index 4908bf65a49..42dd4738735 100644 --- a/src/util/union_find.h +++ b/src/util/union_find.h @@ -130,11 +130,21 @@ class unsigned_union_find template // NOLINTNEXTLINE(readability/identifiers) -class union_find:public numbering +class union_find final { + typedef numbering numbering_typet; + numbering_typet numbers; + + // NOLINTNEXTLINE(readability/identifiers) + typedef typename numbering_typet::number_type number_type; + public: // NOLINTNEXTLINE(readability/identifiers) - typedef typename numbering::size_type size_type; + typedef typename numbering_typet::size_type size_type; + // NOLINTNEXTLINE(readability/identifiers) + typedef typename numbering_typet::iterator iterator; + // NOLINTNEXTLINE(readability/identifiers) + typedef typename numbering_typet::const_iterator const_iterator; // true == already in same set bool make_union(const T &a, const T &b) @@ -149,7 +159,7 @@ class union_find:public numbering bool make_union(typename numbering::const_iterator it_a, typename numbering::const_iterator it_b) { - size_type na=it_a-numbering::begin(), nb=it_b-numbering::begin(); + size_type na=it_a-numbers.begin(), nb=it_b-numbers.begin(); bool is_union=find_number(na)==find_number(nb); uuf.make_union(na, nb); return is_union; @@ -158,10 +168,9 @@ class union_find:public numbering // are 'a' and 'b' in the same set? bool same_set(const T &a, const T &b) const { - typedef typename subt::number_type subt_number_typet; - subt_number_typet na=subt_number_typet(), nb=subt_number_typet(); - bool have_na=!subt::get_number(a, na), - have_nb=!subt::get_number(b, nb); + number_type na, nb; + bool have_na=!numbers.get_number(a, na), + have_nb=!numbers.get_number(b, nb); if(have_na && have_nb) return uuf.same_set(na, nb); @@ -175,22 +184,22 @@ class union_find:public numbering bool same_set(typename numbering::const_iterator it_a, typename numbering::const_iterator it_b) const { - return uuf.same_set(it_a-numbering::begin(), it_b-numbering::begin()); + return uuf.same_set(it_a-numbers.begin(), it_b-numbers.begin()); } const T &find(typename numbering::const_iterator it) const { - return numbering::operator[](find_number(it-numbering::begin())); + return numbers[find_number(it-numbers.begin())]; } const T &find(const T &a) { - return numbering::operator[](find_number(number(a))); + return numbers[find_number(number(a))]; } size_type find_number(typename numbering::const_iterator it) const { - return find_number(it-numbering::begin()); + return find_number(it-numbers.begin()); } size_type find_number(size_type a) const @@ -210,9 +219,8 @@ class union_find:public numbering bool is_root(const T &a) const { - typename subt::number_type na; - - if(subt::get_number(a, na)) + number_type na; + if(numbers.get_number(a, na)) return true; // not found, it's a root else return uuf.is_root(na); @@ -220,30 +228,30 @@ class union_find:public numbering bool is_root(typename numbering::const_iterator it) const { - return uuf.is_root(it-numbering::begin()); + return uuf.is_root(it-numbers.begin()); } size_type number(const T &a) { - size_type n=subt::number(a); + size_type n=numbers.number(a); if(n>=uuf.size()) - uuf.resize(this->size()); + uuf.resize(numbers.size()); - assert(uuf.size()==this->size()); + INVARIANT(uuf.size()==numbers.size(), "container sizes must match"); return n; } void clear() { - subt::clear(); + numbers.clear(); uuf.clear(); } void isolate(typename numbering::const_iterator it) { - uuf.isolate(it-numbering::begin()); + uuf.isolate(it-numbers.begin()); } void isolate(const T &a) @@ -251,6 +259,24 @@ class union_find:public numbering uuf.isolate(number(a)); } + bool get_number(const T &a, number_type &n) const + { + return numbers.get_number(a, n); + } + + size_t size() const { return numbers.size(); } + + T &operator[](size_type t) { return numbers[t]; } + const T &operator[](size_type t) const { return numbers[t]; } + + iterator begin() { return numbers.begin(); } + const_iterator begin() const { return numbers.begin(); } + const_iterator cbegin() const { return numbers.cbegin(); } + + iterator end() { return numbers.end(); } + const_iterator end() const { return numbers.end(); } + const_iterator cend() const { return numbers.cend(); } + protected: unsigned_union_find uuf; typedef numbering subt;