static struct rx_node *_pass(struct dm_pool *mem, struct rx_node *r, int *changed) { struct rx_node *left, *right; /* * walk the tree, optimising every 'or' node. */ switch (r->type) { case CAT: if (!(r->left = _pass(mem, r->left, changed))) return_NULL; if (!(r->right = _pass(mem, r->right, changed))) return_NULL; break; case STAR: case PLUS: case QUEST: if (!(r->left = _pass(mem, r->left, changed))) return_NULL; break; case OR: /* It's important we optimise sub nodes first */ if (!(r->left = _pass(mem, r->left, changed))) return_NULL; if (!(r->right = _pass(mem, r->right, changed))) return_NULL; /* * If rotate_ors changes the tree, left and right are stale, * so just set 'changed' to repeat the search. * * FIXME Check we can't 'bounce' between left and right rotations here. */ if (_find_leftmost_common(r, &left, &right, 1)) { if (!_rotate_ors(r, 1)) r = _exchange_nodes(mem, r, left, right, 1); *changed = 1; } else if (_find_leftmost_common(r, &left, &right, 0)) { if (!_rotate_ors(r, 0)) r = _exchange_nodes(mem, r, left, right, 0); *changed = 1; } break; case CHARSET: break; } return r; }
static struct rx_node *_optimise(struct dm_pool *mem, struct rx_node *r) { /* * We're looking for (or (... (cat <foo> a)) (... (cat <foo> b))) * and want to turn it into (cat <foo> (or (... a) (... b))) * * (fa)|(fb) becomes f(a|b) */ /* * Initially done as an inefficient multipass algorithm. */ int changed; do { changed = 0; r = _pass(mem, r, &changed); } while (r && changed); return r; }
/* ChapelIO.chpl:23 */ file _construct_file(_string _filename_59461, FileAccessMode _mode_59462, _string _path_59463, _cfile _fp, _syncvar_uint64_t _lock, file meme, int32_t _ln, _string _fn) { _syncvar_uint64_t T1 = NULL; file T3 = NULL; chpl_bool T2; Writer T4 = NULL; T1 = _pass(_lock); T2 = (nil==meme); if (T2) { T3 = (file)chpl_alloc(sizeof(_file), "instance of class file", _ln, _fn); ((object)T3)->_cid = _e_file; } else { T3 = meme; } T4 = (&(T3->super)); _construct_Writer(T4, _ln, _fn); T3->filename = _filename_59461; T3->mode = _mode_59462; T3->path = _path_59463; T3->_fp = _fp; T3->_lock = T1; return T3; }
template <typename Visitor> struct app_specific { template <typename Vis> app_specific(Vis&& vis):vis(vis) {} std::vector<index_size> index_sizes; Visitor vis; }; template <typename Visitor> app_specific<Visitor> make_app_specific(Visitor&& vis) { return app_specific<Visitor>(std::forward<Visitor>(vis)); } const auto more = [](auto &ctx) { auto& app_specific = x3::get<tag_app_specific>(ctx).get(); _pass(ctx) = app_specific.index_sizes.back().index++ < app_specific.index_sizes.back().size; }; const auto done = [](auto &ctx) { auto& app_specific = x3::get<tag_app_specific>(ctx).get(); if (app_specific.index_sizes.back().index == app_specific.index_sizes.back().size + 1) { _pass(ctx) = true; switch (app_specific.index_sizes.back().type) { case index_size::type_t::array: app_specific.vis.end_array(); break; case index_size::type_t::map: app_specific.vis.end_map(); break; case index_size::type_t::other: break;