Changeset 3926


Ignore:
Timestamp:
Jul 24, 2014, 2:52:52 PM (5 years ago)
Author:
daled
Message:

Added an optimization to the character clas compiler to combine the non-range alternating character codepoints of a class into a range.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/cc_compiler.cpp

    r3914 r3926  
    271271        return new All(0);
    272272    }
     273
     274    if (cc->getItems().size() > 1)
     275    {
     276        bool combine = true;
     277
     278        for (unsigned long i = 0; i < cc->getItems().size(); i++)
     279        {
     280            CharSetItem item = cc->getItems().at(i);
     281            if (item.lo_codepoint != item.hi_codepoint)
     282            {
     283                combine = false;
     284                break;
     285            }
     286        }
     287
     288        if (combine)
     289        {
     290            for (unsigned long i = 0; i < cc->getItems().size() - 1; i ++)
     291            {
     292                CharSetItem curr_item = cc->getItems().at(i);
     293                CharSetItem next_item = cc->getItems().at(i + 1);
     294                if (curr_item.lo_codepoint != next_item.lo_codepoint + 2)
     295                {
     296                    combine  = false;
     297                    break;
     298                }
     299            }
     300        }
     301
     302        if (combine)
     303        {
     304            CharSetItem first_item = cc->getItems().at(0);
     305            CharSetItem last_item = cc->getItems().at(cc->getItems().size() - 1);
     306            CharSetItem combined_item;
     307            combined_item.lo_codepoint = (last_item.lo_codepoint & 0xFE);
     308            combined_item.hi_codepoint = (first_item.hi_codepoint | 0x01);
     309            std::cout << "Combined!" << std::endl;
     310            return char_or_range_expr(combined_item);
     311        }
     312    }
     313
    273314    PabloE* e1 = char_or_range_expr(cc->getItems().at(0));
    274315    if (cc->getItems().size() > 1)
Note: See TracChangeset for help on using the changeset viewer.