| 43 | } |
| 44 | |
| 45 | forceinline void |
| 46 | Graph::init(Space& home, const ValSet& vs, const ViewArray<IntView>& x) { |
| 47 | using namespace ViewValGraph; |
| 48 | n_view = x.size() + vs.size(); |
| 49 | view = home.alloc<ViewNode<IntView>*>(n_view); |
| 50 | |
| 51 | // Create nodes corresponding to the value set vs |
| 52 | { |
| 53 | int i = x.size(); |
| 54 | ValSet::Ranges vsr(vs); |
| 55 | ValNode<IntView>** v = &val; |
| 56 | for (Iter::Ranges::ToValues<ValSet::Ranges> n(vsr); n(); ++n) { |
| 57 | // Create view node |
| 58 | view[i] = new (home) ViewNode<IntView>(); |
| 59 | // Create and link value node |
| 60 | ValNode<IntView>* nv = new (home) ValNode<IntView>(n.val()); |
| 61 | *v = nv; v = nv->next_val_ref(); |
| 62 | // Create and link single edge |
| 63 | Edge<IntView>** e = view[i]->val_edges_ref(); |
| 64 | *e = new (home) Edge<IntView>(nv,view[i],nullptr); |
| 65 | // Match edge |
| 66 | (*e)->revert(view[i]); nv->matching(*e); |
| 67 | i++; |
| 68 | } |
| 69 | *v = nullptr; |
| 70 | n_val = vs.size(); |
| 71 | n_matched = vs.size(); |
| 72 | assert(i - x.size() == vs.size()); |
| 73 | } |
| 74 | |
| 75 | // Initialize real view nodes |
| 76 | for (int i=0; i<x.size(); i++) { |
| 77 | view[i] = new (home) ViewNode<IntView>(x[i]); |
| 78 | ViewValGraph::Graph<IntView>::init(home,view[i]); |
| 79 | } |
| 80 | |
| 81 | // Match the real view nodes, if possible |
| 82 | Region r; |
| 83 | ViewNodeStack m(r,n_view); |
| 84 | for (int i=0; i<x.size(); i++) |
| 85 | if (match(m,view[i])) |
| 86 | n_matched++; |
| 87 | } |
| 88 | |
| 89 | forceinline void |
| 90 | Graph::sync(void) { |
no test coverage detected