source: icGREP/icgrep-devel/icgrep/re/re_memoizer.cpp @ 5763

Last change on this file since 5763 was 5763, checked in by cameron, 18 months ago

Range RE objects

File size: 3.6 KB
Line 
1#include "re_memoizer.hpp"
2#include <re/re_alt.h>
3#include <re/re_cc.h>
4#include <re/re_seq.h>
5#include <re/re_rep.h>
6#include <re/re_range.h>
7#include <re/re_diff.h>
8#include <re/re_intersect.h>
9#include <re/re_assertion.h>
10#include <llvm/Support/ErrorHandling.h>
11
12using llvm::cast;
13
14namespace re {
15
16static bool compare(const RE * const lh, const RE * const rh);
17
18static bool lessThan(const Vector * const lh, const Vector * const rh) {
19    assert (lh->getClassTypeId() == rh->getClassTypeId());
20    assert (lh->getClassTypeId() == RE::ClassTypeId::Alt || lh->getClassTypeId() == RE::ClassTypeId::Seq);
21    if (LLVM_LIKELY(lh->size() != rh->size())) {
22        return lh->size() < rh->size();
23    }
24    for (auto i = lh->begin(), j = rh->begin(); i != lh->end(); ++i, ++j) {
25        assert (*i && *j);
26        if (compare(*i, *j)) {
27            return true;
28        }
29    }
30    return false;
31}
32
33inline bool lessThan(const Assertion * const lh, const Assertion * const rh) {
34    if (lh->getKind() != rh->getKind()) {
35        return lh->getKind() < rh->getKind();
36    }
37    if (lh->getSense() != rh->getSense()) {
38        return lh->getSense() < rh->getSense();
39    }
40    return compare(lh->getAsserted(), rh->getAsserted());
41}
42
43inline bool lessThan(const Rep * const lh, const Rep * const rh) {
44    if (lh->getLB() != rh->getLB()) {
45        return lh->getLB() < rh->getLB();
46    }
47    if (lh->getUB() != rh->getUB()) {
48        return lh->getUB() < rh->getUB();
49    }
50    return compare(lh->getRE(), rh->getRE());
51}
52
53inline bool lessThan(const Diff * const lh, const Diff * const rh) {
54    return compare(lh->getLH(), rh->getLH()) || compare(lh->getRH(), rh->getRH());
55}
56
57inline bool lessThan(const Range * const lh, const Range * const rh) {
58    return compare(lh->getLo(), rh->getLo()) || compare(lh->getHi(), rh->getHi());
59}
60
61static bool lessThan(const Intersect * const lh, const Intersect * const rh) {
62    return compare(lh->getLH(), rh->getLH()) || compare(lh->getRH(), rh->getRH());
63}
64
65inline bool compare(const RE * const lh, const RE * const rh) {
66    using Type = RE::ClassTypeId;
67    assert (lh && rh);
68    const auto typeL = lh->getClassTypeId();
69    const auto typeR = rh->getClassTypeId();
70    if (LLVM_LIKELY(typeL != typeR)) {
71        if ((typeL == Type::CC || typeR == Type::CC) && (typeL == Type::Name || typeR == Type::Name)) {
72            if (typeL == Type::Name) {
73                return *cast<Name>(lh) < *cast<CC>(rh);
74            } else {
75                return *cast<Name>(rh) > *cast<CC>(lh);
76            }
77        }
78        return typeL < typeR;
79    }
80    switch (typeL) {
81        case Type::Alt:
82        case Type::Seq:
83            return lessThan(cast<Vector>(lh), cast<Vector>(rh));
84        case Type::Any: case Type::End: case Type::Start:
85            return false;
86        case Type::Assertion:
87            return lessThan(cast<Assertion>(lh), cast<Assertion>(rh));
88        case Type::CC:
89            return *cast<CC>(lh) < *cast<CC>(rh);
90        case Type::Name:
91            return *cast<Name>(lh) < *cast<Name>(rh);
92        case Type::Range:
93            return lessThan(cast<Range>(lh), cast<Range>(rh));
94        case Type::Diff:
95            return lessThan(cast<Diff>(lh), cast<Diff>(rh));
96        case Type::Intersect:
97            return lessThan(cast<Intersect>(lh), cast<Intersect>(rh));
98        case Type::Rep:
99            return lessThan(cast<Rep>(lh), cast<Rep>(rh));
100        default:
101            llvm_unreachable("RE object of unknown type given to Memoizer");
102            return false;
103    }
104}
105
106bool MemoizerComparator::operator()(const RE * const lh, const RE * const rh) const {
107    return compare(lh, rh);
108}
109
110}
Note: See TracBrowser for help on using the repository browser.