source: icGREP/icgrep-devel/icgrep/cc/cc_namemap.cpp @ 4308

Last change on this file since 4308 was 4308, checked in by cameron, 4 years ago

Intersect and Diff support

File size: 2.0 KB
Line 
1#include <cc/cc_namemap.hpp>
2#include <re/re_name.h>
3#include <re/re_cc.h>
4#include <re/re_alt.h>
5#include <re/re_seq.h>
6#include <re/re_rep.h>
7#include <re/re_diff.h>
8#include <re/re_intersect.h>
9#include <re/printer_re.h>
10#include <iostream>
11
12using namespace re;
13
14namespace cc {
15
16void CC_NameMap::addPredefined(const std::string friendlyName, re::CC * cc) {
17    assert (cc);
18    std::string classname = cc->getName();
19    Name * name = makeName(classname, cc);
20    assert (name->getCC() == cc);
21    mNameMap.insert(std::make_pair(friendlyName, name));   
22    insert(std::move(classname), name);
23    assert (name->getCC() == cc);
24}
25
26RE * CC_NameMap::process(RE * re) {
27    if (Alt * alt = dyn_cast<Alt>(re)) {
28        for (auto i = alt->begin(); i != alt->end(); ++i) {
29            *i = process(*i);
30        }
31    }
32    else if (Seq * seq = dyn_cast<Seq>(re)) {
33        for (auto i = seq->begin(); i != seq->end(); ++i) {
34            *i = process(*i);
35        }
36    }
37    else if (Rep * rep = dyn_cast<Rep>(re)) {
38        rep->setRE(process(rep->getRE()));
39    }
40    else if (Diff * diff = dyn_cast<Diff>(re)) {
41        diff->setRH(process(diff->getRH()));
42        diff->setLH(process(diff->getLH()));
43    }
44    else if (Intersect * e = dyn_cast<Intersect>(re)) {
45        e->setRH(process(e->getRH()));
46        e->setLH(process(e->getLH()));
47    }
48    else if (Name * name = dyn_cast<Name>(re)) {
49        RE * cc = name->getCC();
50        if (cc && !isa<CC>(cc)) {
51            name->setCC(process(cc));
52        }
53        std::string classname = name->getName();
54        auto f = mNameMap.find(classname);
55        if (f == mNameMap.end()) {
56            return insert(std::move(classname), name);
57        }
58        return f->second;
59    }
60    else if (CC * cc = dyn_cast<CC>(re)) {
61        std::string classname = cc->getName();
62        auto f = mNameMap.find(classname);
63        if (f == mNameMap.end()) {
64            return insert(std::move(classname), makeName(classname, cc));
65        }
66        return f->second;
67    }
68    return re;
69}
70
71}
Note: See TracBrowser for help on using the repository browser.