+class safe_inserter
+{
+ public:
+ safe_inserter(const ex&, const bool disable_renaming=false);
+ std::auto_ptr<epvector> getseq(){return epv;}
+ void insert_old_pair(const expair &p)
+ {
+ epv->push_back(p);
+ }
+ void insert_new_pair(const expair &p, const ex &orig_ex);
+ private:
+ std::auto_ptr<epvector> epv;
+ bool dodummies;
+ exvector dummy_indices;
+ void update_dummy_indices(const exvector&);
+};
+
+safe_inserter::safe_inserter(const ex&e, const bool disable_renaming)
+ :epv(new epvector)
+{
+ epv->reserve(e.nops());
+ dodummies=is_a<mul>(e);
+ if(disable_renaming)
+ dodummies=false;
+ if(dodummies) {
+ dummy_indices = get_all_dummy_indices(e);
+ sort(dummy_indices.begin(), dummy_indices.end(), ex_is_less());
+ }
+}
+
+void safe_inserter::update_dummy_indices(const exvector &v)
+{
+ exvector new_dummy_indices;
+ set_union(dummy_indices.begin(), dummy_indices.end(), v.begin(), v.end(),
+ std::back_insert_iterator<exvector>(new_dummy_indices), ex_is_less());
+ dummy_indices.swap(new_dummy_indices);
+}
+
+void safe_inserter::insert_new_pair(const expair &p, const ex &orig_ex)
+{
+ if(!dodummies) {
+ epv->push_back(p);
+ return;
+ }
+ exvector dummies_of_factor = get_all_dummy_indices(p.rest);
+ if(dummies_of_factor.size() == 0) {
+ epv->push_back(p);
+ return;
+ }
+ sort(dummies_of_factor.begin(), dummies_of_factor.end(), ex_is_less());
+ exvector dummies_of_orig_ex = get_all_dummy_indices(orig_ex);
+ sort(dummies_of_orig_ex.begin(), dummies_of_orig_ex.end(), ex_is_less());
+ exvector new_dummy_indices;
+ new_dummy_indices.reserve(dummy_indices.size());
+ set_difference(dummy_indices.begin(), dummy_indices.end(), dummies_of_orig_ex.begin(), dummies_of_orig_ex.end(),
+ std::back_insert_iterator<exvector>(new_dummy_indices), ex_is_less());
+ dummy_indices.swap(new_dummy_indices);
+ ex newfactor = rename_dummy_indices_uniquely(dummy_indices, dummies_of_factor, p.rest);
+ update_dummy_indices(dummies_of_factor);
+ epv -> push_back(expair(newfactor, p.coeff));
+}