# # # patch "roster.cc" # from [48b29599a42af23853120572d56068ac1ebfd6fc] # to [62f172da10ee678623d30fbdafd766f521e2fbc7] # # patch "safe_map.hh" # from [ac69dcb8754f37a64495971c20154478e8592634] # to [cb4d6c8b429dada825545ab66087dfb4bfd7637d] # ============================================================ --- roster.cc 48b29599a42af23853120572d56068ac1ebfd6fc +++ roster.cc 62f172da10ee678623d30fbdafd766f521e2fbc7 @@ -287,7 +287,7 @@ roster_t::do_deep_copy_from(roster_t con I(nodes.empty()); for (node_map::const_iterator i = other.nodes.begin(); i != other.nodes.end(); ++i) - safe_insert(nodes, make_pair(i->first, i->second->clone())); + hinted_safe_insert(nodes, nodes.end(), make_pair(i->first, i->second->clone())); for (node_map::iterator i = nodes.begin(); i != nodes.end(); ++i) if (is_dir_t(i->second)) { ============================================================ --- safe_map.hh ac69dcb8754f37a64495971c20154478e8592634 +++ safe_map.hh cb4d6c8b429dada825545ab66087dfb4bfd7637d @@ -46,6 +46,25 @@ do_safe_insert(T & container, typename T do_safe_insert((CONT), (VAL), #CONT, __FILE__, __LINE__) +// errors out if the key already exists +template +typename T::iterator +do_safe_insert(T & container, typename T::iterator where, + typename T::value_type const & val, + char const * container_name, char const * file, int line) +{ + typename T::size_type pre_size = container.size(); + typename T::iterator r = container.insert(where, val); + if (pre_size == container.size()) + global_sanity.invariant_failure((F("inserting duplicate entry into %s") + % container_name).str().c_str(), + file, line); + return r; +} +#define hinted_safe_insert(CONT, HINT, VAL) \ + do_safe_insert((CONT), (HINT), (VAL), #CONT, __FILE__, __LINE__) + + // errors out if the key does not exist template typename T::mapped_type const &