| 450 | // Constructs Prefilter::Info for a character class. |
| 451 | typedef CharClass::iterator CCIter; |
| 452 | Prefilter::Info* Prefilter::Info::CClass(CharClass *cc, |
| 453 | bool latin1) { |
| 454 | if (ExtraDebug) { |
| 455 | LOG(ERROR) << "CharClassInfo:"; |
| 456 | for (CCIter i = cc->begin(); i != cc->end(); ++i) |
| 457 | LOG(ERROR) << " " << i->lo << "-" << i->hi; |
| 458 | } |
| 459 | |
| 460 | // If the class is too large, it's okay to overestimate. |
| 461 | if (cc->size() > 10) |
| 462 | return AnyCharOrAnyByte(); |
| 463 | |
| 464 | Prefilter::Info *a = new Prefilter::Info(); |
| 465 | for (CCIter i = cc->begin(); i != cc->end(); ++i) |
| 466 | for (Rune r = i->lo; r <= i->hi; r++) { |
| 467 | if (latin1) { |
| 468 | a->exact_.insert(RuneToStringLatin1(ToLowerRuneLatin1(r))); |
| 469 | } else { |
| 470 | a->exact_.insert(RuneToString(ToLowerRune(r))); |
| 471 | } |
| 472 | } |
| 473 | |
| 474 | |
| 475 | a->is_exact_ = true; |
| 476 | |
| 477 | if (ExtraDebug) |
| 478 | LOG(ERROR) << " = " << a->ToString(); |
| 479 | |
| 480 | return a; |
| 481 | } |
| 482 | |
| 483 | class Prefilter::Info::Walker : public Regexp::Walker<Prefilter::Info*> { |
| 484 | public: |
nothing calls this directly
no test coverage detected