-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_safely(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_safely(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_safely(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));
-}
-