Ignore:
Timestamp:
Oct 2, 2014, 3:22:19 PM (5 years ago)
Author:
nmedfort
Message:

Performance bug fix

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/re/re_rep.cpp

    r4187 r4203  
    66
    77#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 TracChangeset for help on using the changeset viewer.