11829 {
11830 if (!LEFT_CONSTANT) {
11831 ASSERT_RESTRICT(ldata, ldata + count, result_data, result_data + count);
11832 }
11833 if (!RIGHT_CONSTANT) {
11834 ASSERT_RESTRICT(rdata, rdata + count, result_data, result_data + count);
11835 }
11836
11837 if (!
mask.AllValid()) {
11838 idx_t base_idx = 0;
11839 auto entry_count = ValidityMask::EntryCount(count);
11840 for (idx_t entry_idx = 0; entry_idx < entry_count; entry_idx++) {
11841 auto validity_entry =
mask.GetValidityEntry(entry_idx);
11842 idx_t next = MinValue<idx_t>(base_idx + ValidityMask::BITS_PER_VALUE, count);
11843 if (ValidityMask::AllValid(validity_entry)) {
11844
11845 for (; base_idx < next; base_idx++) {
11846 auto lentry = ldata[LEFT_CONSTANT ? 0 : base_idx];
11847 auto rentry = rdata[RIGHT_CONSTANT ? 0 : base_idx];
11848 result_data[base_idx] =
11849 OPWRAPPER::template Operation<FUNC, OP, LEFT_TYPE, RIGHT_TYPE, RESULT_TYPE>(
11850 fun, lentry, rentry, mask, base_idx);
11851 }
11852 } else if (ValidityMask::NoneValid(validity_entry)) {
11853
11854 base_idx = next;
11855 continue;
11856 } else {
11857
11858 idx_t start = base_idx;
11859 for (; base_idx < next; base_idx++) {
11860 if (ValidityMask::RowIsValid(validity_entry, base_idx - start)) {
11861 auto lentry = ldata[LEFT_CONSTANT ? 0 : base_idx];
11862 auto rentry = rdata[RIGHT_CONSTANT ? 0 : base_idx];
11863 result_data[base_idx] =
11864 OPWRAPPER::template Operation<FUNC, OP, LEFT_TYPE, RIGHT_TYPE, RESULT_TYPE>(
11865 fun, lentry, rentry, mask, base_idx);
11866 }
11867 }
11868 }
11869 }
11870 } else {
11871 for (idx_t i = 0; i < count; i++) {
11872 auto lentry = ldata[LEFT_CONSTANT ? 0 : i];
11873 auto rentry = rdata[RIGHT_CONSTANT ? 0 : i];
11874 result_data[i] = OPWRAPPER::template Operation<FUNC, OP, LEFT_TYPE, RIGHT_TYPE, RESULT_TYPE>(
11875 fun, lentry, rentry, mask, i);
11876 }
11877 }
11878 }
GMat mask(const GMat &src, const GMat &mask)