Ignore:
Timestamp:
Oct 24, 2015, 2:54:17 PM (4 years ago)
Author:
nmedfort
Message:

Bug fix for \N{..} + minor optimization changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/re/re_alt.h

    r4516 r4852  
    1010#include "re_re.h"
    1111#include "re_cc.h"
    12 #include <queue>
    1312
    1413namespace re {
     
    3534private:
    3635    template<typename iterator>
    37     void flatten(iterator begin, iterator end, std::queue<CC*> & ccQ) {
     36    void flatten(iterator begin, iterator end) {
    3837        for (auto i = begin; i != end; ++i) {
    39             if (Alt * alt = dyn_cast<Alt>(*i)) {
    40                 flatten(alt->begin(), alt->end(), ccQ);
    41                 continue;
     38            if (LLVM_UNLIKELY(isa<Alt>(*i))) {
     39                flatten<Alt::iterator>(cast<Alt>(*i)->begin(), cast<Alt>(*i)->end());
     40            } else {
     41                push_back(*i);
    4242            }
    43             else if (CC * cc = dyn_cast<CC>(*i)) {
    44                 ccQ.push(cc);
    45                 continue;
    46             }
    47             push_back(*i);
    4843        }
    4944    }
     
    6661template<typename iterator>
    6762RE * makeAlt(iterator begin, iterator end) {
    68     Alt * alt = makeAlt();
    69     std::queue<CC*> ccQ;
    70     alt->flatten(begin, end, ccQ);
    71     if (!ccQ.empty()) {
    72         while (ccQ.size() > 1) {
    73             CC * a = ccQ.front(); ccQ.pop();
    74             CC * b = ccQ.front(); ccQ.pop();
    75             ccQ.push(makeCC(a, b));
     63    if (LLVM_UNLIKELY(std::distance(begin, end) == 0)) {
     64        throw std::runtime_error("Alt objects cannot be empty!");
     65    } else if (std::distance(begin, end) == 1) {
     66        return *begin;
     67    } else {
     68        Alt * alt = makeAlt();
     69        alt->flatten(begin, end);
     70        if (alt->size() == 1) {
     71            return alt->front();
    7672        }
    77         alt->push_back(ccQ.front());
     73        return alt;
    7874    }
    79     if (alt->size() == 1) {
    80         return alt->back();
    81     }
    82     return alt;
    8375}
    8476
Note: See TracChangeset for help on using the changeset viewer.