165 if (domain_size == 0) {
171 evaluator.
add(input_);
172 evaluator.
add(group_index_);
180 using T = decltype(dummy);
181 if constexpr (is_same_any_v<T, int, float, float3>) {
182 const VArray<T> values = g_values.typed<T>();
184 if (operation_ == Operation::Min) {
185 if (group_indices.is_single()) {
186 T result = MinMaxInfo<T>::min_initial_value;
187 for (const int i : values.index_range()) {
188 result = math::min(result, values[i]);
190 g_outputs = VArray<T>::from_single(result, domain_size);
194 for (const int i : values.index_range()) {
195 T &value = results.lookup_or_add(group_indices[i], MinMaxInfo<T>::min_initial_value);
196 value = math::min(value, values[i]);
198 Array<T> outputs(domain_size);
199 for (const int i : values.index_range()) {
200 outputs[i] = results.lookup(group_indices[i]);
202 g_outputs = VArray<T>::from_container(std::move(outputs));
206 if (group_indices.is_single()) {
207 T result = MinMaxInfo<T>::max_initial_value;
208 for (const int i : values.index_range()) {
209 result = math::max(result, values[i]);
211 g_outputs = VArray<T>::from_single(result, domain_size);
215 for (const int i : values.index_range()) {
216 T &value = results.lookup_or_add(group_indices[i], MinMaxInfo<T>::max_initial_value);
217 value = math::max(value, values[i]);
219 Array<T> outputs(domain_size);
220 for (const int i : values.index_range()) {
221 outputs[i] = results.lookup(group_indices[i]);
223 g_outputs = VArray<T>::from_container(std::move(outputs));
229 return attributes.adapt_domain(std::move(g_outputs), source_domain_, context.domain());