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

Last change on this file since 4337 was 4337, checked in by cameron, 5 years ago

Compile only byteclasses with cc_compiler; resolve CC/BC ambiguity

File size: 2.1 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
16RE * CC_NameMap::process(RE * re, const CC_type t) {
17    if (Alt * alt = dyn_cast<Alt>(re)) {
18        for (auto i = alt->begin(); i != alt->end(); ++i) {
19            *i = process(*i, t);
20        }
21    }
22    else if (Seq * seq = dyn_cast<Seq>(re)) {
23        for (auto i = seq->begin(); i != seq->end(); ++i) {
24            *i = process(*i, t);
25        }
26    }
27    else if (Rep * rep = dyn_cast<Rep>(re)) {
28        rep->setRE(process(rep->getRE(), t));
29    }
30    else if (Diff * diff = dyn_cast<Diff>(re)) {
31        diff->setRH(process(diff->getRH(), t));
32        diff->setLH(process(diff->getLH(), t));
33    }
34    else if (Intersect * e = dyn_cast<Intersect>(re)) {
35        e->setRH(process(e->getRH(), t));
36        e->setLH(process(e->getLH(), t));
37    }
38    else if (Name * nameNode = dyn_cast<Name>(re)) {
39        RE * def = nameNode->getDefinition();
40        if (def && !isa<CC>(def)) {
41            nameNode->setDefinition(process(def, t));
42        }
43        std::string classname = nameNode->getName();
44        auto f = mNameMap.find(classname);
45        if (f == mNameMap.end()) {
46            // Insert into the name map.
47            return insert(std::move(classname), nameNode);
48        }
49        return f->second;
50    }
51    else if (CC * cc = dyn_cast<CC>(re)) {
52        std::string classname = cc->canonicalName(t);
53        auto f = mNameMap.find(classname);
54        if (f == mNameMap.end()) {
55            Name * n;
56            if (t == ByteClass) {
57              n = makeByteName(classname, cc);
58            }
59            else {
60              n = makeName(classname, cc);
61            }
62            return insert(std::move(classname), n);
63        }
64        return f->second;
65    }
66    return re;
67}
68
69std::string CC_NameMap::printMap() {
70    std::string retval = "";
71    for (Name * name : mNameVector) {
72        retval.append("mNameMap[" +  name->getName() + "] = " + Printer_RE::PrintRE(name->getDefinition()) + "]\n");
73    }
74    return retval;
75}
76
77}
Note: See TracBrowser for help on using the repository browser.