Welcome to mirror list, hosted at ThFree Co, Russian Federation.

util.h « multi_functions « intern « functions « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
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