source: icGREP/icgrep-devel/icgrep/re/re_collect_unicodesets.cpp @ 5819

Last change on this file since 5819 was 5819, checked in by cameron, 16 months ago

Bug fix for multiplexed alphabet mode

File size: 2.0 KB
RevLine 
[5565]1#include "re_collect_unicodesets.h"
2#include <re/re_name.h>
[5631]3#include <re/re_any.h>
[5565]4#include <re/re_alt.h>
5#include <re/re_cc.h>
6#include <re/re_seq.h>
7#include <re/re_rep.h>
[5772]8#include <re/re_range.h>
[5565]9#include <re/re_diff.h>
10#include <re/re_intersect.h>
11#include <re/re_assertion.h>
[5796]12#include <cc/alphabet.h>
[5565]13#include <boost/container/flat_set.hpp>
[5796]14#include <llvm/Support/raw_ostream.h>
[5565]15
16using namespace llvm;
17
18namespace re {
[5631]19   
[5748]20struct SetCollector {
21    void collect(RE * const re);
[5631]22public:
[5748]23    std::vector<const CC *> UnicodeSets;
24    boost::container::flat_set<const RE *>  Visited;
[5631]25};
[5565]26
[5748]27void SetCollector::collect(RE * const re) {
[5565]28    assert ("RE object cannot be null!" && re);
[5748]29    if (Visited.insert(re).second) {
30        if (CC * cc = dyn_cast<CC>(re)) {
[5796]31            if (cc->getAlphabet() == &cc::Unicode) {
[5819]32                const auto index = find(UnicodeSets.begin(), UnicodeSets.end(), cc) - UnicodeSets.begin();
33                if (index == UnicodeSets.size()) UnicodeSets.push_back(cc);
[5796]34            }
[5748]35        } else if (isa<Name>(re)) {
[5772]36            auto def = cast<Name>(re)->getDefinition();
37            if (def != nullptr)
38                collect(def);
[5748]39        } else if (isa<Seq>(re)) {
40            for (auto item : *cast<Seq>(re)) {
41                collect(item);
42            }
43        } else if (isa<Alt>(re)) {
44            for (auto item : *cast<Alt>(re)) {
45                collect(item);
46            }
47        } else if (isa<Rep>(re)) {
48            collect(cast<Rep>(re)->getRE());
49        } else if (isa<Assertion>(re)) {
50            collect(cast<Assertion>(re)->getAsserted());
51        } else if (isa<Diff>(re)) {
52            collect(cast<Diff>(re)->getLH());
53            collect(cast<Diff>(re)->getRH());
54        } else if (isa<Intersect>(re)) {
55            collect(cast<Intersect>(re)->getLH());
56            collect(cast<Intersect>(re)->getRH());
[5565]57        }
58    }
59}
[5748]60
61std::vector<const CC *> collectUnicodeSets(RE * const re) {
[5631]62    SetCollector collector;
[5748]63    collector.collect(re);
64    return collector.UnicodeSets;
[5631]65}
[5565]66
[5748]67
68
[5565]69}
Note: See TracBrowser for help on using the repository browser.