#include #include #include "boost/function.hpp" //#include "/razor/5/users/bigelow/src/FC++.1.5/prelude.h" using std::cerr; using std::endl; using std::cout; using boost::function; template Seed Fold(Seed seed, function fold_fun, function next){ Element *cur = next(); if (cur == NULL){ return seed; } else { Seed newseed = fold_fun(seed, cur); return Fold(newseed, fold_fun, next); } } /* template */ /* Seed Fold2(Seed seed, fcpp::Fun2 fold_fcn, fcpp::Fun0 next){ */ /* Element *cur = next(); */ /* if (cur == NULL){ return seed; } */ /* else { */ /* Seed newseed = fold_fcn(seed, cur); */ /* return Fold2(newseed, fold_fcn, next); */ /* } */ /* } */ typedef std::vector coord; enum Exceptions { NoMoreElements }; void increment_counter_aux(const coord & sizes, coord & ctr, int d) throw (Exceptions) { if (d == (int)ctr.size()) throw NoMoreElements; ctr[d]++; if (ctr[d] == sizes[d]){ ctr[d] = 0; increment_counter_aux(sizes, ctr, d+1); } } void increment_counter(const coord & sizes, coord & counter){ increment_counter_aux(sizes, counter, 0); } //how should we handle zero-sized dimensions? //do not handle them... template struct CartesianProductEnum { vector counter; vector sizes; vector current; vector >source; CartesianProductEnum(vector >& matrix, vector &initial) { current = initial; source = matrix; if (current.size() != source.size()) current.resize(source.size()); counter.resize(matrix.size()); sizes.resize(matrix.size()); fill(counter.begin(), counter.end(), 0); if (! counter.empty()) counter[0] = -1; for (unsigned int i=0; i < source.size(); i++) { sizes[i] = source[i].size(); if (sizes[i] == 0) { cerr<<"CartesianProductEnum: Cannot handle zero-sized dimensions."< * Next(){ try { increment_counter(sizes, counter); } catch (Exceptions e){ /* cout<<"END-------"<