blob: 4e2ba6ee751bc5eca3a1ae70d4dc2845e0e79449 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#pragma once
#include "FN_multi_function.h"
namespace FN {
using BLI::ScopedVector;
template<typename T, typename FuncT, typename EqualFuncT = std::equal_to<T>>
void group_indices_by_same_value(IndexMask indices,
VirtualListRef<T> values,
const FuncT &func,
EqualFuncT equal = std::equal_to<T>())
{
if (indices.size() == 0) {
return;
}
if (values.is_single_element()) {
const T &value = values[indices[0]];
func(value, indices);
return;
}
ScopedVector<T> seen_values;
ScopedVector<uint> indices_with_value;
for (uint i : indices.index_range()) {
uint index = indices[i];
const T &value = values[index];
if (seen_values.as_ref().any([&](const T &seen_value) { return equal(value, seen_value); })) {
continue;
}
seen_values.append(value);
indices_with_value.clear();
for (uint j : indices.indices().drop_front(i)) {
if (equal(values[j], value)) {
indices_with_value.append(j);
}
}
IndexMask mask_with_same_value = indices_with_value.as_ref();
func(value, mask_with_same_value);
}
}
} // namespace FN
|