+struct apply_factor_map : public map_function {
+ unsigned options;
+ apply_factor_map(unsigned options_) : options(options_) { }
+ ex operator()(const ex& e)
+ {
+ if ( e.info(info_flags::polynomial) ) {
+#ifdef DEBUGFACTOR
+ return ::factor(e, options);
+#else
+ return factor(e, options);
+#endif
+ }
+ if ( is_a<add>(e) ) {
+ ex s1, s2;
+ for ( size_t i=0; i<e.nops(); ++i ) {
+ if ( e.op(i).info(info_flags::polynomial) ) {
+ s1 += e.op(i);
+ }
+ else {
+ s2 += e.op(i);
+ }
+ }
+ s1 = s1.eval();
+ s2 = s2.eval();
+#ifdef DEBUGFACTOR
+ return ::factor(s1, options) + s2.map(*this);
+#else
+ return factor(s1, options) + s2.map(*this);
+#endif
+ }
+ return e.map(*this);
+ }
+};
+