void RuleFeatureSet::scheduleStyleInvalidationForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, Element& element) { if (!oldClasses.size()) scheduleStyleInvalidationForClassChange(newClasses, element); // Class vectors tend to be very short. This is faster than using a hash table. BitVector remainingClassBits; remainingClassBits.ensureSize(oldClasses.size()); for (unsigned i = 0; i < newClasses.size(); ++i) { bool found = false; for (unsigned j = 0; j < oldClasses.size(); ++j) { if (newClasses[i] == oldClasses[j]) { // Mark each class that is still in the newClasses so we can skip doing // an n^2 search below when looking for removals. We can't break from // this loop early since a class can appear more than once. remainingClassBits.quickSet(j); found = true; } } // Class was added. if (!found) addClassToInvalidationSet(newClasses[i], element); } for (unsigned i = 0; i < oldClasses.size(); ++i) { if (remainingClassBits.quickGet(i)) continue; // Class was removed. addClassToInvalidationSet(oldClasses[i], element); } }
void RuleFeatureSet::scheduleStyleInvalidationForClassChange(const SpaceSplitString& changedClasses, Element& element) { unsigned changedSize = changedClasses.size(); for (unsigned i = 0; i < changedSize; ++i) { addClassToInvalidationSet(changedClasses[i], element); } }
bool RuleFeatureSet::computeInvalidationSetsForClassChange(const SpaceSplitString& changedClasses, Element* element) { unsigned changedSize = changedClasses.size(); for (unsigned i = 0; i < changedSize; ++i) { if (classInvalidationRequiresSubtreeRecalc(changedClasses[i])) return true; addClassToInvalidationSet(changedClasses[i], element); } return false; }