forked from GitHub/gf-core
a refactoring to make it easier to use C++ closures
This commit is contained in:
@@ -658,7 +658,7 @@ void namespace_iter_prefix(Namespace<V> map, PgfText *prefix, PgfItor* itor, Pgf
|
||||
}
|
||||
|
||||
template <class V>
|
||||
Namespace<V> namespace_map(Namespace<V> map, std::function<ref<V>(ref<V>)> f)
|
||||
Namespace<V> namespace_map(Namespace<V> map, std::function<ref<V>(ref<V>)> &f)
|
||||
{
|
||||
if (map != 0) {
|
||||
auto left = namespace_map(map->left, f);
|
||||
|
||||
@@ -510,7 +510,12 @@ void pgf_iter_functions_by_cat(PgfDB *db, PgfRevision revision,
|
||||
DB_scope scope(db, READER_SCOPE);
|
||||
ref<PgfPGF> pgf = db->revision2pgf(revision);
|
||||
|
||||
probspace_iter(pgf->abstract.funs_by_cat, cat, itor, false, err);
|
||||
std::function<bool(ref<PgfAbsFun>)> f =
|
||||
[itor,err](ref<PgfAbsFun> 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<PgfConcr> 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<bool(ref<PgfAbsFun>)> f =
|
||||
[concr](ref<PgfAbsFun> 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();
|
||||
|
||||
@@ -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<bool(ref<PgfAbsFun>)> &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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<bool(ref<PgfAbsFun>)> &f, bool all);
|
||||
|
||||
/* Given a random number from 0 to 1, select a random function from
|
||||
* the given category */
|
||||
|
||||
Reference in New Issue
Block a user