docs: private void performIntersect(final Sketch sketchIn) {
      // curCount and input data are nonzero, match against HT
      assert ((curCount_ > 0) && (!empty_));
      final long[] cacheIn = sketchIn.getCache();
      final int arrLongsIn = cacheIn.length;
      final long[] hashTable;
      if (mem_ != null) {
        final int htLen = 1 << lgArrLongs_;
        hashTable = new long[htLen];
        mem_.getLongArray(CONST_PREAMBLE_LONGS << 3, hashTable, 0, htLen);
      } else {
        hashTable = hashTable_;
      }
      //allocate space for matching
      final long[] matchSet = new long[ min(curCount_, sketchIn.getRetainedEntries(true)) ];
  
      int matchSetCount = 0;
      if (sketchIn.isOrdered()) {
        //ordered compact, which enables early stop
        for (int i = 0; i < arrLongsIn; i++ ) {
          final long hashIn = cacheIn[i];
          //if (hashIn <= 0L) continue;  //<= 0 should not happen
          if (hashIn >= thetaLong_) {
            break; //early stop assumes that hashes in input sketch are ordered!
          }
          final int foundIdx = HashOperations.hashSearch(hashTable, lgArrLongs_, hashIn);
          if (foundIdx == -1) { continue; }
          matchSet[matchSetCount++] = hashIn;
        }
      }
      else {
        //either unordered compact or hash table
        for (int i = 0; i < arrLongsIn; i++ ) {
          final long hashIn = cacheIn[i];
          if ((hashIn <= 0L) || (hashIn >= thetaLong_)) { continue; }
          final int foundIdx = HashOperations.hashSearch(hashTable, lgArrLongs_, hashIn);
          if (foundIdx == -1) { continue; }
          matchSet[matchSetCount++] = hashIn;
        }
      }
      //reduce effective array size to minimum
      curCount_ = matchSetCount;
      lgArrLongs_ = computeMinLgArrLongsFromCount(matchSetCount);
      if (mem_ != null) {
        insertCurCount(mem_, matchSetCount);
        insertLgArrLongs(mem_, lgArrLongs_);
        mem_.clear(CONST_PREAMBLE_LONGS << 3, 8 << lgArrLongs_); //clear for rebuild
      } else {
        Arrays.fill(hashTable_, 0, 1 << lgArrLongs_, 0L); //clear for rebuild
      }
  
      if (curCount_ > 0) {
        moveDataToTgt(matchSet, matchSetCount); //move matchSet to target
      } else {
        if (thetaLong_ == Long.MAX_VALUE) {
          empty_ = true;
        }
      }
    }