source: icGREP/icgrep-devel/icgrep/re/re_rep.cpp @ 4203

Last change on this file since 4203 was 4203, checked in by nmedfort, 5 years ago

Performance bug fix

File size: 1.4 KB
Line 
1/*
2 *  Copyright (c) 2014 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#include "re_rep.h"
8#include "re_seq.h"
9
10namespace re {
11
12inline int ubCombine(const int h1, const int h2) {
13    if ((h1 == Rep::UNBOUNDED_REP) || (h2 == Rep::UNBOUNDED_REP)) {
14        return Rep::UNBOUNDED_REP;
15    }
16    else {
17        return h1 * h2;
18    }
19}
20
21RE * makeRep(RE * re, const int lb, const int ub) {
22    if (Rep * rep = dyn_cast<Rep>(re)) {
23        if (rep->getUB() == Rep::UNBOUNDED_REP && ((lb > 0) || (rep->getLB() <= 1))) {
24            return new Rep(rep->getRE(), rep->getLB() * lb, Rep::UNBOUNDED_REP);
25        }
26        else if ((rep->getUB() == Rep::UNBOUNDED_REP) && (lb == 0)) {
27            return new Rep(rep, 0, 1);
28        }
29        else if (lb == ub) {
30            return new Rep(rep->getRE(), lb * rep->getLB(), ub * rep->getUB());
31        }
32        else if ((rep->getUB() * lb) >= (rep->getLB() * (lb + 1) - 1)) {
33            return new Rep(rep->getRE(), rep->getUB() * lb, ubCombine(rep->getUB(), ub));
34        }
35    }
36    else {
37        if (Seq * seq = dyn_cast<Seq>(re)) {
38            if (seq->empty()) {
39                return seq;
40            }
41        }
42        if ((lb == 0) && (ub == 0)) {
43            return makeSeq();
44        }
45        else if ((lb == 1) && (ub == 1)) {
46            return re;
47        }
48    }
49    return new Rep(re, lb, ub);
50}
51
52}
Note: See TracBrowser for help on using the repository browser.