source: icGREP/icgrep-devel/icgrep/re/re_memoizer.hpp @ 4819

Last change on this file since 4819 was 4819, checked in by nmedfort, 4 years ago

First stage of CC_NameMap removal

File size: 982 bytes
Line 
1#ifndef RE_NAMEDICTIONARY_H
2#define RE_NAMEDICTIONARY_H
3
4#include <re/re_name.h>
5#include <set>
6
7namespace re {
8
9namespace {
10
11struct MemoizerComparator {
12    inline bool operator() (const RE * lh, const RE * rh) const{
13        if (LLVM_LIKELY(isa<Name>(lh) && isa<Name>(rh))) {
14            return *cast<Name>(lh) < *cast<Name>(rh);
15        } else if (isa<Name>(lh)) {
16            return *cast<Name>(lh) < *cast<CC>(rh);
17        }
18        return !(*cast<Name>(rh) < *cast<CC>(lh));
19    }
20};
21
22}
23
24struct Memoizer : private std::set<RE *, MemoizerComparator> {
25
26    inline Name * memoize(CC * cc) {
27        auto f = find(cc);
28        if (f != end()) {
29            return cast<Name>(*f);
30        } else {
31            Name * name = makeName(cc->canonicalName(CC_type::UnicodeClass), cc);
32            insert(name);
33            return name;
34        }
35    }
36
37    inline Name * memoize(Name * name) {
38        return cast<Name>(*insert(name).first);
39    }
40};
41
42}
43
44#endif // RE_NAMEDICTIONARY_H
Note: See TracBrowser for help on using the repository browser.