code: @Override
      protected int handleNext(int position) {
          if (pattern_.CELength_ == 0) {
              search_.matchedIndex_ = search_.matchedIndex_ == DONE ?
                                      getIndex() : search_.matchedIndex_ + 1;
              search_.setMatchedLength(0);
              textIter_.setOffset(search_.matchedIndex_);
              if (search_.matchedIndex_ == search_.endIndex()) {
                  search_.matchedIndex_ = DONE;
              }
          } else {
              if (search_.matchedLength() <= 0) {
                  // the flipping direction issue has already been handled
                  // in next()
                  // for boundary check purposes. this will ensure that the
                  // next match will not preceed the current offset
                  // note search_.matchedIndex_ will always be set to something
                  // in the code
                  search_.matchedIndex_ = position - 1;
              }
  
              textIter_.setOffset(position);
  
              // ICU4C comment:
              // if strsrch_->breakIter is always the same as m_breakiterator_
              // then we don't need to check the match boundaries here because
              // usearch_handleNextXXX will already have done it.
              if (search_.isCanonicalMatch_) {
                  // *could* actually use exact here 'cause no extra accents allowed...
                  handleNextCanonical();
              } else {
                  handleNextExact();
              }
  
              if (search_.matchedIndex_ == DONE) {
                  textIter_.setOffset(search_.endIndex());
              } else {
                  textIter_.setOffset(search_.matchedIndex_);
              }
  
              return search_.matchedIndex_;
          }
  
          return DONE;
      }
docs: {@inheritDoc}