diff --git a/src/runtime/c/pgf/namespace.h b/src/runtime/c/pgf/namespace.h index dfbd999b4..17715bac2 100644 --- a/src/runtime/c/pgf/namespace.h +++ b/src/runtime/c/pgf/namespace.h @@ -658,7 +658,7 @@ void namespace_iter_prefix(Namespace map, PgfText *prefix, PgfItor* itor, Pgf } template -Namespace namespace_map(Namespace map, std::function(ref)> f) +Namespace namespace_map(Namespace map, std::function(ref)> &f) { if (map != 0) { auto left = namespace_map(map->left, f); diff --git a/src/runtime/c/pgf/pgf.cxx b/src/runtime/c/pgf/pgf.cxx index 3234358af..55c5c6978 100644 --- a/src/runtime/c/pgf/pgf.cxx +++ b/src/runtime/c/pgf/pgf.cxx @@ -510,7 +510,12 @@ void pgf_iter_functions_by_cat(PgfDB *db, PgfRevision revision, DB_scope scope(db, READER_SCOPE); ref pgf = db->revision2pgf(revision); - probspace_iter(pgf->abstract.funs_by_cat, cat, itor, false, err); + std::function)> f = + [itor,err](ref fun) { + itor->fn(itor, &fun->name, fun.as_object(), err); + return (err->type == PGF_EXN_NONE); + }; + probspace_iter(pgf->abstract.funs_by_cat, cat, f, false); } PGF_API_END } @@ -2239,13 +2244,6 @@ void pgf_create_lincat(PgfDB *db, } PGF_API_END } -static -void iter_drop_lincat_helper(PgfItor *itor, PgfText *key, object value, PgfExn *err) -{ - ref concr = ((PgfDropItor*) itor)->concrete; - drop_lin(concr, key); -} - PGF_API void pgf_drop_lincat(PgfDB *db, PgfRevision revision,PgfConcrRevision cnc_revision, @@ -2265,13 +2263,12 @@ void pgf_drop_lincat(PgfDB *db, // Remove the linearizations of all functions that // depend on it. - PgfDropItor itor; - itor.fn = iter_drop_lincat_helper; - itor.pgf = pgf; - itor.concrete = concr; - itor.name = name; - probspace_iter(pgf->abstract.funs_by_cat, name, - &itor, true, err); + std::function)> f = + [concr](ref fun) { + drop_lin(concr, &fun->name); + return true; + }; + probspace_iter(pgf->abstract.funs_by_cat, name, f, true); // Remove the sequences comprizing the lindef and linref object container = lincat.tagged(); diff --git a/src/runtime/c/pgf/probspace.cxx b/src/runtime/c/pgf/probspace.cxx index 848b7212b..78bc107e0 100644 --- a/src/runtime/c/pgf/probspace.cxx +++ b/src/runtime/c/pgf/probspace.cxx @@ -172,35 +172,27 @@ PgfProbspace probspace_delete_by_cat(PgfProbspace space, PgfText *cat, } } -void probspace_iter(PgfProbspace space, PgfText *cat, - PgfItor* itor, bool all, PgfExn *err) +bool probspace_iter(PgfProbspace space, PgfText *cat, + std::function)> &f, bool all) { if (space == 0) - return; + return true; int cmp = textcmp(cat,&(*space->value.cat)); if (cmp < 0) { - probspace_iter(space->left, cat, itor, all, err); - if (err->type != PGF_EXN_NONE) - return; + return probspace_iter(space->left, cat, f, all); } else if (cmp > 0) { - probspace_iter(space->right, cat, itor, all, err); - if (err->type != PGF_EXN_NONE) - return; + return probspace_iter(space->right, cat, f, all); } else { - probspace_iter(space->left, cat, itor, all, err); - if (err->type != PGF_EXN_NONE) - return; + if (!probspace_iter(space->left, cat, f, all)) + return false; if (all || space->value.is_result()) { - itor->fn(itor, &space->value.fun->name, space->value.fun.as_object(), err); - if (err->type != PGF_EXN_NONE) - return; + if (!f(space->value.fun)) + return false; } - probspace_iter(space->right, cat, itor, all, err); - if (err->type != PGF_EXN_NONE) - return; + return probspace_iter(space->right, cat, f, all); } } diff --git a/src/runtime/c/pgf/probspace.h b/src/runtime/c/pgf/probspace.h index 714a00720..e67f5a7d2 100644 --- a/src/runtime/c/pgf/probspace.h +++ b/src/runtime/c/pgf/probspace.h @@ -66,8 +66,8 @@ PgfProbspace probspace_delete_by_cat(PgfProbspace space, PgfText *cat, PgfItor* itor, PgfExn *err); PGF_INTERNAL_DECL -void probspace_iter(PgfProbspace space, PgfText *cat, - PgfItor* itor, bool all, PgfExn *err); +bool probspace_iter(PgfProbspace space, PgfText *cat, + std::function)> &f, bool all); /* Given a random number from 0 to 1, select a random function from * the given category */