24template<
typename ExprFn,
typename FirstBitSpanT,
typename... BitSpanT>
26 const FirstBitSpanT &first_arg,
27 const BitSpanT &...args)
36 BitInt *first_data = first_arg.data();
37 const int64_t first_offset = first_arg.offset();
38 const int64_t full_ints_num = first_arg.full_ints_num();
42 first_data[
i] = expr(first_data[
i], args.data()[
i]...);
45 if (
const int64_t final_bits = first_arg.final_bits_num()) {
46 const BitInt result = expr(first_data[full_ints_num] >> first_offset,
47 (args.data()[full_ints_num] >> args.offset())...);
49 first_data[full_ints_num] = ((
result << first_offset) &
mask) |
50 (first_data[full_ints_num] & ~
mask);
70template<
typename ExprFn,
typename FirstBitSpanT,
typename... BitSpanT>
71inline bool any_set_expr(ExprFn &&expr,
const FirstBitSpanT &first_arg,
const BitSpanT &...args)
80 const BitInt *first_data = first_arg.data();
81 const int64_t full_ints_num = first_arg.full_ints_num();
85 if (expr(first_data[
i], args.data()[
i]...) != 0) {
90 if (
const int64_t final_bits = first_arg.final_bits_num()) {
91 const BitInt result = expr(first_data[full_ints_num] >> first_arg.offset(),
92 (args.data()[full_ints_num] >> args.offset())...);
120template<
typename ExprFn,
typename HandleFn,
typename FirstBitSpanT,
typename... BitSpanT>
123 const FirstBitSpanT &first_arg,
124 const BitSpanT &...args)
126 static_assert(std::is_invocable_v<HandleFn, int64_t>);
127 constexpr bool is_cancellable = std::is_invocable_r_v<bool, HandleFn, int64_t>;
136 const BitInt *first_data = first_arg.data();
137 const int64_t full_ints_num = first_arg.full_ints_num();
140 BitInt tmp = expr(first_data[int_i], args.data()[int_i]...);
143 static_assert(std::is_same_v<BitInt, uint64_t>);
145 const int64_t index_in_span = index_in_int + offset;
146 if constexpr (is_cancellable) {
147 if (!handle(index_in_span)) {
152 handle(index_in_span);
158 if (
const int64_t final_bits = first_arg.final_bits_num()) {
159 BitInt tmp = expr(first_data[full_ints_num] >> first_arg.offset(),
160 (args.data()[full_ints_num] >> args.offset())...) &
164 static_assert(std::is_same_v<BitInt, uint64_t>);
166 const int64_t index_in_span = index_in_int + offset;
167 if constexpr (is_cancellable) {
168 if (!handle(index_in_span)) {
173 handle(index_in_span);
185 if constexpr (is_cancellable) {
198template<
typename ExprFn,
typename FirstBitSpanT,
typename... BitSpanT>
200 const FirstBitSpanT &first_arg,
201 const BitSpanT &...args)
203 std::optional<int64_t>
result;
217template<
typename ExprFn,
typename FirstBitSpanT,
typename... BitSpanT>
223template<
typename ExprFn,
typename FirstBitSpanT,
typename... BitSpanT>
224inline bool any_set_expr(ExprFn &&expr,
const FirstBitSpanT &first_arg,
const BitSpanT &...args)
229template<
typename ExprFn,
typename HandleFn,
typename FirstBitSpanT,
typename... BitSpanT>
232 const FirstBitSpanT &first_arg,
233 const BitSpanT &...args)
239template<
typename BitSpanT>
inline void invert(BitSpanT &&
data)
244template<
typename FirstBitSpanT,
typename... BitSpanT>
245inline void inplace_or(FirstBitSpanT &first_arg,
const BitSpanT &...args)
250template<
typename FirstBitSpanT,
typename MaskBitSpanT,
typename... BitSpanT>
252 const MaskBitSpanT &
mask,
253 const BitSpanT &...args)
262template<
typename FirstBitSpanT,
typename... BitSpanT>
263inline void copy_from_or(FirstBitSpanT &first_arg,
const BitSpanT &...args)
266 [](
auto ,
auto... rest) {
return (rest | ...); }, first_arg, args...);
269template<
typename FirstBitSpanT,
typename... BitSpanT>
270inline void inplace_and(FirstBitSpanT &first_arg,
const BitSpanT &...args)
275template<
typename... BitSpanT>
281template<
typename... BitSpanT>
287template<
typename... BitSpanT>
293template<
typename... BitSpanT>
301 return any_set_expr([](
const auto...
x) {
return (
x & ...); }, args...);
304template<
typename BitSpanT>
inline bool any_bit_set(
const BitSpanT &arg)
311 return any_set_expr([](
const auto...
x) {
return ~(
x | ...); }, args...);
329template<
typename ExprFn,
typename FirstBitSpanT,
typename... BitSpanT>
331 const FirstBitSpanT &first_arg,
332 const BitSpanT &...args)
348template<
typename BitSpanT1,
typename BitSpanT2>
351 if (a.size() !=
b.size()) {
357template<
typename BitSpanT1,
typename BitSpanT2,
typename BitSpanT3>
MINLINE unsigned int bitscan_forward_uint64(unsigned long long a)
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
bool any_set_expr(ExprFn &&expr, const FirstBitSpanT &first_arg, const BitSpanT &...args)
void foreach_1_index_expr(ExprFn &&expr, HandleFn &&handle, const FirstBitSpanT &first_arg, const BitSpanT &...args)
void mix_into_first_expr(ExprFn &&expr, const FirstBitSpanT &first_arg, const BitSpanT &...args)
std::optional< int64_t > find_first_1_index_expr(ExprFn &&expr, const FirstBitSpanT &first_arg, const BitSpanT &...args)
void operator|=(MutableBitSpan first_arg, const BitSpanT &...args)
std::optional< int64_t > find_first_1_index_expr(ExprFn &&Expr, const FirstBitSpanT &first_arg, const BitSpanT &...args)
constexpr bool all_bounded_spans
bool has_common_set_bits(const BitSpanT &...args)
void inplace_or_masked(FirstBitSpanT &&first_arg, const MaskBitSpanT &mask, const BitSpanT &...args)
T to_best_bit_span(const T &data)
bool has_common_unset_bits(const BitSpanT &...args)
static constexpr int64_t BitToIntIndexShift
void foreach_0_index(const BitSpanT &data, Fn &&fn)
BitInt mask_single_bit(const int64_t bit_index)
bool any_bit_unset(const BitSpanT &arg)
void mix_into_first_expr(ExprFn &&expr, FirstBitSpanT &&first_arg, const BitSpanT &...args)
void operator&=(MutableBitSpan first_arg, const BitSpanT &...args)
bool any_bit_set(const BitSpanT &arg)
void inplace_or(FirstBitSpanT &first_arg, const BitSpanT &...args)
void inplace_and(FirstBitSpanT &first_arg, const BitSpanT &...args)
bool any_set_expr(ExprFn &&expr, const FirstBitSpanT &first_arg, const BitSpanT &...args)
void copy_from_or(FirstBitSpanT &first_arg, const BitSpanT &...args)
BitInt mask_first_n_bits(const int64_t n)
std::optional< int64_t > find_first_0_index(const BitSpanT &data)
void foreach_1_index(const BitSpanT &data, Fn &&fn)
bool spans_equal(const BitSpanT1 &a, const BitSpanT2 &b)
std::optional< int64_t > find_first_1_index(const BitSpanT &data)
BitInt mask_range_bits(const int64_t start, const int64_t size)
void invert(BitSpanT &&data)
void foreach_1_index_expr(ExprFn &&expr, HandleFn &&handle, const FirstBitSpanT &first_arg, const BitSpanT &...args)
bool spans_equal_masked(const BitSpanT1 &a, const BitSpanT2 &b, const BitSpanT3 &mask)