diff --git a/source/blender/blenlib/BLI_devirtualize_parameters.hh b/source/blender/blenlib/BLI_devirtualize_parameters.hh index bf4f6c47cfe..ca11ec2e579 100644 --- a/source/blender/blenlib/BLI_devirtualize_parameters.hh +++ b/source/blender/blenlib/BLI_devirtualize_parameters.hh @@ -107,8 +107,8 @@ template class Devirtualizer { { BLI_assert(!executed_); static_assert(sizeof...(AllowedModes) == SourceTypesNum); - return this->try_execute_devirtualized_impl(DeviModeSequence<>(), - DeviModeSequence()); + this->try_execute_devirtualized_impl(DeviModeSequence<>(), + DeviModeSequence()); } /** @@ -131,9 +131,11 @@ template class Devirtualizer { * At every recursive step, the #DeviMode of one parameter is determined. This is achieved by * extending #DeviModeSequence by one element in each step. The recursion ends once all * parameters are handled. + * + * \return True when the function has been executed. */ template - void try_execute_devirtualized_impl( + bool try_execute_devirtualized_impl( /* Initially empty, but then extended by one element in each recursive step. */ DeviModeSequence /* modes */, /* Bit flag for every parameter. */ @@ -144,6 +146,7 @@ template class Devirtualizer { /* End of recursion, now call the function with the determined #DeviModes. */ this->try_execute_devirtualized_impl_call(DeviModeSequence(), std::make_index_sequence()); + return true; } else { /* Index of the parameter that is checked in the current recursive step. */ @@ -160,21 +163,27 @@ template class Devirtualizer { /* Check if the virtual array is a single value. */ if constexpr ((allowed_modes & DeviMode::Single) != DeviMode::None) { if (varray.is_single()) { - this->try_execute_devirtualized_impl(DeviModeSequence(), - DeviModeSequence()); + if (this->try_execute_devirtualized_impl(DeviModeSequence(), + DeviModeSequence())) { + return true; + } } } /* Check if the virtual array is a span. */ if constexpr ((allowed_modes & DeviMode::Span) != DeviMode::None) { if (varray.is_span()) { - this->try_execute_devirtualized_impl(DeviModeSequence(), - DeviModeSequence()); + if (this->try_execute_devirtualized_impl(DeviModeSequence(), + DeviModeSequence())) { + return true; + } } } /* Check if it is ok if the virtual array is not devirtualized. */ if constexpr ((allowed_modes & DeviMode::Keep) != DeviMode::None) { - this->try_execute_devirtualized_impl(DeviModeSequence(), - DeviModeSequence()); + if (this->try_execute_devirtualized_impl(DeviModeSequence(), + DeviModeSequence())) { + return true; + } } } @@ -185,23 +194,30 @@ template class Devirtualizer { /* The actual mask used for dynamic dispatch at run-time. */ const IndexMask &mask = *std::get(sources_); if (mask.is_range()) { - this->try_execute_devirtualized_impl(DeviModeSequence(), - DeviModeSequence()); + if (this->try_execute_devirtualized_impl(DeviModeSequence(), + DeviModeSequence())) { + return true; + } } } /* Check if mask is also allowed to stay a span. */ if constexpr ((allowed_modes & DeviMode::Span) != DeviMode::None) { - this->try_execute_devirtualized_impl(DeviModeSequence(), - DeviModeSequence()); + if (this->try_execute_devirtualized_impl(DeviModeSequence(), + DeviModeSequence())) { + return true; + } } } /* Handle unknown types. */ else { - this->try_execute_devirtualized_impl(DeviModeSequence(), - DeviModeSequence()); + if (this->try_execute_devirtualized_impl(DeviModeSequence(), + DeviModeSequence())) { + return true; + } } } + return false; } /** @@ -212,6 +228,7 @@ template class Devirtualizer { std::index_sequence /* indices */) { + BLI_assert(!executed_); fn_(this->get_devirtualized_parameter()...); executed_ = true; }