Blender  V3.3
BLI_index_mask_ops.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #pragma once
4 
13 #include "BLI_index_mask.hh"
14 #include "BLI_task.hh"
15 #include "BLI_vector.hh"
16 #include "BLI_virtual_array.hh"
17 
19 
20 namespace detail {
22  IndexMask indices_to_check,
24  Vector<int64_t> &r_indices);
25 } // namespace detail
26 
33 template<typename Predicate>
34 inline IndexMask find_indices_based_on_predicate(const IndexMask indices_to_check,
35  const int64_t parallel_grain_size,
36  Vector<int64_t> &r_indices,
37  const Predicate &predicate)
38 {
39  /* Evaluate predicate in parallel. Since the size of the final mask is not known yet, many
40  * smaller vectors have to be filled with all indices where the predicate is true. Those smaller
41  * vectors are joined afterwards. */
44  indices_to_check.index_range(), parallel_grain_size, [&](const IndexRange range) {
45  const IndexMask sub_mask = indices_to_check.slice(range);
46  Vector<int64_t> masked_indices;
47  for (const int64_t i : sub_mask) {
48  if (predicate(i)) {
49  masked_indices.append(i);
50  }
51  }
52  if (!masked_indices.is_empty()) {
53  sub_masks.local().append(std::move(masked_indices));
54  }
55  });
56 
57  /* This part doesn't have to be in the header. */
58  return detail::find_indices_based_on_predicate__merge(indices_to_check, sub_masks, r_indices);
59 }
60 
69 IndexMask find_indices_from_virtual_array(IndexMask indices_to_check,
70  const VArray<bool> &virtual_array,
71  int64_t parallel_grain_size,
72  Vector<int64_t> &r_indices);
73 
74 } // namespace blender::index_mask_ops
IndexRange index_range() const
IndexMask find_indices_based_on_predicate__merge(IndexMask indices_to_check, threading::EnumerableThreadSpecific< Vector< Vector< int64_t >>> &sub_masks, Vector< int64_t > &r_indices)
Definition: index_mask.cc:135
IndexMask find_indices_based_on_predicate(const IndexMask indices_to_check, const int64_t parallel_grain_size, Vector< int64_t > &r_indices, const Predicate &predicate)
IndexMask find_indices_from_virtual_array(IndexMask indices_to_check, const VArray< bool > &virtual_array, int64_t parallel_grain_size, Vector< int64_t > &r_indices)
Definition: index_mask.cc:201
void parallel_for(IndexRange range, int64_t grain_size, const Function &function)
Definition: BLI_task.hh:51
__int64 int64_t
Definition: stdint.h:89