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
49
50
51
52
#![cfg_attr(rustfmt, rustfmt_skip)]
use hibitset::{AtomicBitSet, BitSet, BitSetAnd, BitSetLike, BitSetNot, BitSetOr, BitSetXor};
use crate::join::Join;
#[cfg(feature = "parallel")]
use crate::join::ParJoin;
use crate::world::Index;
macro_rules! define_bit_join {
( impl < ( $( $lifetime:tt )* ) ( $( $arg:ident ),* ) > for $bitset:ty ) => {
impl<$( $lifetime, )* $( $arg ),*> Join for $bitset
where $( $arg: BitSetLike ),*
{
type Type = Index;
type Value = ();
type Mask = $bitset;
unsafe fn open(self) -> (Self::Mask, Self::Value) {
(self, ())
}
unsafe fn get(_: &mut Self::Value, id: Index) -> Self::Type {
id
}
}
#[cfg(feature = "parallel")]
unsafe impl<$( $lifetime, )* $( $arg ),*> ParJoin for $bitset
where $( $arg: BitSetLike ),*
{ }
}
}
define_bit_join!(impl<()()> for BitSet);
define_bit_join!(impl<('a)()> for &'a BitSet);
define_bit_join!(impl<()()> for AtomicBitSet);
define_bit_join!(impl<('a)()> for &'a AtomicBitSet);
define_bit_join!(impl<()(A)> for BitSetNot<A>);
define_bit_join!(impl<('a)(A)> for &'a BitSetNot<A>);
define_bit_join!(impl<()(A, B)> for BitSetAnd<A, B>);
define_bit_join!(impl<('a)(A, B)> for &'a BitSetAnd<A, B>);
define_bit_join!(impl<()(A, B)> for BitSetOr<A, B>);
define_bit_join!(impl<('a)(A, B)> for &'a BitSetOr<A, B>);
define_bit_join!(impl<()(A, B)> for BitSetXor<A, B>);
define_bit_join!(impl<('a)()> for &'a dyn BitSetLike);