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

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

UnicodeSet? bug fix and compile warning clean-up.

File size: 920 bytes
RevLine 
[4818]1#ifndef RE_NAMEDICTIONARY_H
2#define RE_NAMEDICTIONARY_H
3
[4819]4#include <re/re_name.h>
5#include <set>
6
[4818]7namespace re {
8
[4819]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        }
[4823]16        return *cast<Name>(rh) > *cast<CC>(lh);
[4819]17    }
[4818]18};
19
[4820]20struct Memoizer : public std::set<RE *, MemoizerComparator> {
[4819]21
22    inline Name * memoize(CC * cc) {
23        auto f = find(cc);
24        if (f != end()) {
25            return cast<Name>(*f);
26        } else {
[4823]27            Name * name = makeName(cc);
[4819]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
[4818]40#endif // RE_NAMEDICTIONARY_H
Note: See TracBrowser for help on using the repository browser.