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

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

Code clean-up. Removed Pablo Call, SetIthBit? and Prototype.

File size: 986 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(llvm::isa<Name>(lh) && llvm::isa<Name>(rh))) {
12            return *llvm::cast<Name>(lh) < *llvm::cast<Name>(rh);
13        } else if (llvm::isa<Name>(lh)) {
14            return *llvm::cast<Name>(lh) < *llvm::cast<CC>(rh);
15        }
16        return *llvm::cast<Name>(rh) > *llvm::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 llvm::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 llvm::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.