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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
//! Views over entities.
//!
//! Along with [`Filter`]s, [`Views`] are what make up a query over entities stored wihin a
//! [`World`]. `Views` are how queries specify what [`Component`]s should be borrowed within query
//! results.
//!
//! There are five types of [`View`]s that can be used when defining a query:
//! - **`&C`** - Borrows the `Component` `C` immutably, filtering out any entities that do not
//! contain `C`.
//! - **`&mut C`** - Borrows the `Component` `C` mutably, filtering out any entities that do not
//! contain `C`.
//! - **`Option<&C>`** - Borrows the `Component` `C` immutably if present in the entity. Returns
//! [`None`] otherwise.
//! - **`Option<&mut C>`** - Borrows the `Component` `C` mutably if present in the entity. Returns
//! [`None`] otherwise.
//! - **[`entity::Identifier`]** - Returns the `entity::Identifier` of each entity in the query
//! results.
//!
//! `Views` is a heterogeneous list of individual `View`s. Therefore, it is easiest to define them
//! using the [`Views!`] macro.
//!
//! # Example
//! ``` rust
//! use brood::{
//! entity,
//! query::Views,
//! };
//!
//! // Define components.
//! struct Foo(u32);
//! struct Bar(bool);
//! struct Baz(f64);
//!
//! type Views<'a> = Views!(&'a mut Foo, &'a Bar, Option<&'a Baz>, entity::Identifier);
//! ```
//!
//! Note that the lifetime `'a` can often be omitted when [`query`]ing a [`World`], but is required
//! when defining a [`System`].
//!
//! [`Component`]: crate::component::Component
//! [`entity::Identifier`]: crate::entity::Identifier
//! [`Filter`]: crate::query::filter::Filter
//! [`query`]: crate::world::World::query()
//! [`System`]: crate::system::System
//! [`View`]: crate::query::view::View
//! [`Views`]: trait@crate::query::view::Views
//! [`Views!`]: crate::query::Views!
//! [`World`]: crate::world::World.
pub
pub
pub use ContainsFilter;
pub use Disjoint;
pub use ;
pub use SubSet;
pub use ;
pub use Merge;
pub use ;
pub use ViewsSealed;
use crate::;
use ViewSealed;
/// A view over a single aspect of an entity.
///
/// Here, the world "aspect" means either a [`Component`] or the entity's [`Identifier`].
/// Specifically, `View` is implemented for each of the following five types, providing the
/// specified view into the entity:
/// - **`&C`** - Borrows the `Component` `C` immutably, filtering out any entities that do not
/// contain `C`.
/// - **`&mut C`** - Borrows the `Component` `C` mutably, filtering out any entities that do not
/// contain `C`.
/// - **`Option<&C>`** - Borrows the `Component` `C` immutably if present in the entity. Returns
/// [`None`] otherwise.
/// - **`Option<&mut C>`** - Borrows the `Component` `C` mutably if present in the entity. Returns
/// [`None`] otherwise.
/// - **[`entity::Identifier`]** - Returns the `entity::Identifier` of each entity in the query
/// results.
///
/// # Example
/// ``` rust
/// // Define a component.
/// struct Foo(usize);
///
/// // Define a view over that component.
/// type FooView<'a> = &'a Foo;
/// ```
///
/// Note that a single `View` by itself isn't very useful. To be usable in querying a [`World`],
/// a [`Views`] heterogeneous list must be used. It is recommended to use the [`Views!`] macro to
/// construct this heterogeneous list.
///
/// ``` rust
/// use brood::query::Views;
///
/// // Define components.
/// struct Foo(u32);
/// struct Bar(bool);
///
/// type Views<'a> = Views!(&'a mut Foo, &'a Bar);
/// ```
///
/// [`Component`]: crate::component::Component
/// [`Identifier`]: crate::entity::Identifier
/// [`Views`]: trait@crate::query::view::Views
/// [`Views!`]: crate::query::Views!
/// [`World`]: crate::world::World
define_null!;
/// A heterogeneous list of [`View`]s.
///
/// Along with [`Filter`]s, `Views` are what make up a query over entities stored wihin a
/// [`World`]. `Views` are how queries specify what [`Component`]s should be borrowed within query
/// results.
///
/// Note that while multiple immutable borrows of `Component`s are allowed within a `Views`, if a
/// component is borrowed mutably in a `Views` it cannot be borrowed again within the same `Views`.
/// In other words, borrows in `Views` must follow Rust's
/// [borrowing rules](https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html).
///
/// As `Views` is a heterogeneous list, it is most easily constructed using the [`Views!`] macro.
///
/// # Example
/// ``` rust
/// use brood::query::Views;
///
/// // Define components.
/// struct Foo(u32);
/// struct Bar(bool);
///
/// type Views<'a> = Views!(&'a mut Foo, &'a Bar);
/// ```
///
/// [`Component`]: crate::component::Component
/// [`Filter`]: crate::query::filter::Filter
/// [`View`]: crate::query::view::View
/// [`Views!`]: crate::query::Views!
/// [`World`]: crate::world::World
pub
pub use Views;