/*! * \param[in] data Data for the current frame. * \param[in] sel Selection element being evaluated. * \param[in] g Group for which \p sel should be evaluated. * \returns 0 on success, a non-zero error code on error. * * Short-circuiting evaluation of logical OR expressions. * * Starts by evaluating the first child element in the group \p g. * For each subsequent child, finds the part of \p g that is not * included the value of any previous child, and evaluates the child * in that group until the last child is evaluated or all of \p g * is included in some child value. * The value of \p sel is set to the union of all the (evaluated) * child values. * * If the first child does not have an evaluation function, its value is * used without evaluation. * This happens if the first child is a constant expression, the selection * has been compiled, and the evaluation group is the same for each frame. * In this case, the compiler has taken care of that the child value is a * subset of \p g, making it unnecessary to evaluate it. * * This function is used as \c t_selelem::evaluate for \ref SEL_BOOLEAN * elements with \ref BOOL_OR. */ void _gmx_sel_evaluate_or(gmx_sel_evaluate_t *data, t_selelem *sel, gmx_ana_index_t *g) { t_selelem *child; gmx_ana_index_t tmp, tmp2; child = sel->child; if (child->evaluate) { MempoolSelelemReserver reserver(child, g->isize); child->evaluate(data, child, g); gmx_ana_index_partition(sel->v.u.g, &tmp, g, child->v.u.g); } else { gmx_ana_index_partition(sel->v.u.g, &tmp, g, child->v.u.g); } child = child->next; while (child && tmp.isize > 0) { tmp.name = NULL; { MempoolSelelemReserver reserver(child, tmp.isize); child->evaluate(data, child, &tmp); gmx_ana_index_partition(&tmp, &tmp2, &tmp, child->v.u.g); } sel->v.u.g->isize += tmp.isize; tmp.isize = tmp2.isize; tmp.index = tmp2.index; child = child->next; } gmx_ana_index_sort(sel->v.u.g); }
void gmx_ana_index_union_unsorted(gmx_ana_index_t *dest, gmx_ana_index_t *a, gmx_ana_index_t *b) { if (gmx_ana_index_check_sorted(b)) { gmx_ana_index_union(dest, a, b); } else { gmx_ana_index_t tmp; gmx_ana_index_copy(&tmp, b, true); gmx_ana_index_sort(&tmp); gmx_ana_index_remove_duplicates(&tmp); gmx_ana_index_union(dest, a, &tmp); gmx_ana_index_deinit(&tmp); } }