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

Last change on this file since 5091 was 5037, checked in by nmedfort, 3 years ago

UnicodeSet? bug fix and compile warning clean-up.

File size: 920 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
9struct MemoizerComparator {
10    inline bool operator() (const RE * lh, const RE * rh) const{
11        if (LLVM_LIKELY(isa<Name>(lh) && isa<Name>(rh))) {
12            return *cast<Name>(lh) < *cast<Name>(rh);
13        } else if (isa<Name>(lh)) {
14            return *cast<Name>(lh) < *cast<CC>(rh);
15        }
16        return *cast<Name>(rh) > *cast<CC>(lh);
17    }
18};
19
20struct Memoizer : public std::set<RE *, MemoizerComparator> {
21
22    inline Name * memoize(CC * cc) {
23        auto f = find(cc);
24        if (f != end()) {
25            return cast<Name>(*f);
26        } else {
27            Name * name = makeName(cc);
28            insert(name);
29            return name;
30        }
31    }
32
33    inline Name * memoize(Name * name) {
34        return cast<Name>(*insert(name).first);
35    }
36};
37
38}
39
40#endif // RE_NAMEDICTIONARY_H
Note: See TracBrowser for help on using the repository browser.