Ignore:
Timestamp:
Mar 12, 2018, 7:22:06 AM (15 months ago)
Author:
cameron
Message:

Initial deployment of bytegrep kernel in icgrep

File:
1 edited

Legend:

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

    r5899 r5902  
    1414#include <re/re_group.h>
    1515#include <re/re_nullable.h>
     16#include <re/to_utf8.h>
    1617#include <re/printer_re.h>
    1718#include <cc/alphabet.h>
     
    414415    UCD::UnicodeSet equalityTests;
    415416    UCD::UnicodeSet lessThanTests;
     417    unsigned testCount;
     418    unsigned testLimit;
    416419};
    417420
    418421void ByteTestComplexity::gatherTests(RE * re) {
    419422    if (CC * cc = dyn_cast<CC>(re)) {
    420         if (cc->getAlphabet() != &cc::Byte) report_fatal_error("ByteTestComplexity: non Byte alphabet");
    421         for (const auto range : *cc) {
    422             const auto lo = re::lo_codepoint(range);
    423             const auto hi = re::hi_codepoint(range);
    424             if (lo == hi) {
    425                 equalityTests.insert(lo);
    426             } else {
    427                 if (lo > 0) lessThanTests.insert(lo);
    428                 if (hi < 0xFF) lessThanTests.insert(hi+1);
     423        if (cc->getAlphabet() == &cc::Unicode) {
     424            gatherTests(toUTF8(re));
     425        } else {
     426            for (const auto range : *cc) {
     427                const auto lo = re::lo_codepoint(range);
     428                const auto hi = re::hi_codepoint(range);
     429                if (lo == hi) {
     430                    if (!equalityTests.contains(lo)) {
     431                        equalityTests.insert(lo);
     432                        testCount++;
     433                    }
     434                } else {
     435                    if (lo > 0) {
     436                        if (!lessThanTests.contains(lo)) {
     437                            lessThanTests.insert(lo);
     438                            testCount++;
     439                        }
     440                    }
     441                    if (hi < 0xFF) {
     442                        if (!lessThanTests.contains(hi+1)) {
     443                            lessThanTests.insert(hi+1);
     444                            testCount++;
     445                        }
     446                    }
     447                }
     448                if (testCount > testLimit) return;
    429449            }
    430450        }
     
    454474}
    455475
    456 unsigned byteTestComplexity(RE * re) {
     476bool byteTestsWithinLimit(RE * re, unsigned limit) {
    457477    ByteTestComplexity btc_object;
     478    btc_object.testCount = 0;
     479    btc_object.testLimit = limit;
    458480    btc_object.gatherTests(re);
    459     return btc_object.equalityTests.count() + btc_object.lessThanTests.count();
     481    return btc_object.testCount <= btc_object.testLimit;
    460482}
    461483
Note: See TracChangeset for help on using the changeset viewer.